2017-02-13 1 views
0

Je suis nouveau chez Symfony, alors excusez mon ignorance.Sonate admin. Comment transmettre les données d'un poste à un autre contrôleur

J'ai une entité mère « article » et sous-ENTITES comme « Page », « Nouvelles », etc. Ils ont des champs communs comme le titre, la date, etc.

J'ai créé la forme initiale de l'article (en classe ArticleAdmin) où il est possible de choisir le titre et le type de sous-entité, et tenté d'appeler la classe Admin de la sous-entité et d'y transmettre des données POST. Mais cela n'a pas fonctionné, car createAction dans Controller est responsable à la fois du rendu de formulaire et de son traitement, et quand j'essaie de le surcharger dans createAction(), j'obtiens une erreur "Error: Call to private method Sonata \ AdminBundle \ contrôleur \ CRUDController :: setFormTheme() »

Voici mon code:

ArticleAdmin - entité mère

<?php 

namespace A26\CMS\ContentBundle\Admin; 

use Sonata\AdminBundle\Admin\AbstractAdmin; 
use Sonata\AdminBundle\Show\ShowMapper; 
use Sonata\AdminBundle\Form\FormMapper; 
use Sonata\AdminBundle\Datagrid\ListMapper; 
use Sonata\AdminBundle\Datagrid\DatagridMapper; 

class ArticleAdmin extends AbstractAdmin 
{ 

// Fields to be shown on create/edit forms 
protected function configureFormFields(FormMapper $formMapper) 
{ 
    $formMapper 
     ->add('title', 'text', array(
      'label' => 'Title' 
     )) 
     ->add('slug', 'text', array(
      'label' => 'Slug' 
     )) 
     ->add('type', 'choice', array(
      'choices' => array(
       'Page'  => 'Text Page', 
       'News'  => 'News' 
      ), 
     )); 
} 

protected function configureDatagridFilters(DatagridMapper $datagridMapper) 
{ 
    $datagridMapper 
     ->add('title'); 
} 

protected function configureListFields(ListMapper $listMapper) 
{ 
    $listMapper 
     ->addIdentifier('title') 
     ->add('is_publish'); 
} 

protected function configureShowFields(ShowMapper $showMapper) 
{ 
    $showMapper 
     ->add('title'); 
} 
} 
?> 

pageAdmin - sous-entité

<?php 

namespace A26\CMS\PagesBundle\Admin; 

use Sonata\AdminBundle\Admin\AbstractAdmin; 
use Sonata\AdminBundle\Show\ShowMapper; 
use Sonata\AdminBundle\Form\FormMapper; 
use Sonata\AdminBundle\Datagrid\ListMapper; 
use Sonata\AdminBundle\Datagrid\DatagridMapper; 
use Ivory\CKEditorBundle\Form\Type\CKEditorType; 

class PageAdmin extends AbstractAdmin 
{ 

// Fields to be shown on create/edit forms 
protected function configureFormFields(FormMapper $formMapper) 
{ 
    $formMapper 
     ->tab('Content') 
      ->with('Content') 
       ->add('title', 'text', array(
        'label' => 'Title' 
       )) 
       ->add('content', CKEditorType::class, array(
        'label'   => 'Content' 
       )) 
      ->end() 
     ->end(); 
} 

// Fields to be shown on filter forms 
protected function configureDatagridFilters(DatagridMapper $datagridMapper) 
{ 
    $datagridMapper 
     ->add('title'); 
} 

// Fields to be shown on lists 
protected function configureListFields(ListMapper $listMapper) 
{ 
    $listMapper 
     ->addIdentifier('title'); 
} 

// Fields to be shown on show action 
protected function configureShowFields(ShowMapper $showMapper) 
{ 
    $showMapper 
     ->add('title'); 
} 
} 
?> 

contrôleur ArticleAdmin - i copié CRUDController et remplacé le bloc

if ($ form-> isSubmitted()) {...}

<?php 

namespace A26\CMS\ContentBundle\Controller; 
use Sonata\AdminBundle\Controller\CRUDController as Controller; 

class ArticleAdminController extends Controller 
{ 

public function createAction() 
{ 
    $request = $this->getRequest(); 
    // the key used to lookup the template 
    $templateKey = 'edit'; 

    $this->admin->checkAccess('create'); 

    $class = new \ReflectionClass($this->admin->hasActiveSubClass() ? $this->admin->getActiveSubClass() : $this->admin->getClass()); 

    if ($class->isAbstract()) { 
     return $this->render(
      'SonataAdminBundle:CRUD:select_subclass.html.twig', 
      array(
       'base_template' => $this->getBaseTemplate(), 
       'admin' => $this->admin, 
       'action' => 'create', 
      ), 
      null, 
      $request 
     ); 
    } 

    $object = $this->admin->getNewInstance(); 

    $preResponse = $this->preCreate($request, $object); 
    if ($preResponse !== null) { 
     return $preResponse; 
    } 

    $this->admin->setSubject($object); 

    /** @var $form \Symfony\Component\Form\Form */ 
    $form = $this->admin->getForm(); 
    $form->setData($object); 
    $form->handleRequest($request); 

    if ($form->isSubmitted()) { 
     $response = $this->forward("A26CMSPagesBundle:PageAdmin:create", array('_sonata_admin' => $this->container->get('request')->get('_sonata_admin'))); 
     dump($response); 
     die(); 
    } 

    $formView = $form->createView(); 
    // set the theme for the current Admin Form 
    $this->setFormTheme($formView, $this->admin->getFormTheme()); 

    return $this->render($this->admin->getTemplate($templateKey), array(
     'action' => 'create', 
     'form' => $formView, 
     'object' => $object, 
    ), null); 
} 
} 

Aide, s'il vous plaît! Peut-être qu'il peut être mis en œuvre d'une autre manière?

Merci d'avance !!

Répondre

0

La façon dont vous faites votre $ réponse est correcte, mais maintenant vous devez le retourner à la fin de l'action ou l'avant ne se produira jamais