2017-02-13 52 views
0

Я новичок в Symfony, так извините мое невежество.Соната админ. Как передать данные сообщения другому контроллеру

У меня есть родительский объект «Статья» и суб-entites вроде «Страницы», «Новости» и т.д. Они имеют общие поля, такие как название, дата и т.д.

Я создал первоначальную форму для статьи (в классе ArticleAdmin), где можно выбрать название и тип суб-сущности, и попытался вызвать класс администратора субинститута и передать туда POST-данные. Но это не сработало, потому что createAction в Controller отвечает как за рендеринг формы, так и за ее обработку, и когда я пытаюсь переопределить ее в моем createAction(), я получаю сообщение об ошибке «Ошибка: вызов частного метода Sonata \ AdminBundle \ контроллер \ CRUDController :: setFormTheme()»

Вот мой код:

ArticleAdmin - родительский объект

<?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 - подобъект

<?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'); 
} 
} 
?> 

ArticleAdmin Controller - я скопировал CRUDController и заменить блок

если ($ форма-> 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); 
} 
} 

Помогите, пожалуйста! Может быть, это может быть реализовано по-другому?

Спасибо заранее!

ответ

0

Способ, которым вы делаете свой ответ $, является правильным, но теперь вам нужно вернуть его в конце действия или вперед никогда не произойдет