Представления списка администратора Symfony 2 Sonata не отображают подклассы

В настоящее время я не могу заставить подклассы отображаться в виде списка, используя пакет администратора sonta для symfony 2.

Я могу заставить его работать для создания форм в соответствии со страницей расширенной конфигурации (http://sonata-project.org/bundles/admin/2-1/doc/reference/advance.html), но как это сделать в виде списка?

Если я передам подкласс в URL - list?subclass=MySubClassName и установлю объект в моем listAction

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

Я могу получить тему и настроить правильные поля с помощью configureListFields()

if ($subject instanceof MySubClassName) {
      $listMapper->add('MySubClassNameID');
      $listMapper->add('MySubClassNameKey');
      $listMapper->add('MySubClassNameStatus','text');
    }

но таблица конечных результатов всегда пуста, а панель инструментов отладки symfony, похоже, показывает, что запросы к базе данных ищут родительский класс. Кто-нибудь получил это, чтобы работать?


person Tom Whiston    schedule 11.12.2014    source источник


Ответы (3)


Я не уверен, что вы имеете в виду с этими «подклассами» в представлении списка, но если вы хотите добавить поле из другого объекта (связанного через внешний ключ с вашим), вы можете сделать это следующим образом:

$listMapper
    ->addIdentifier('id')
    ->addIdentifier('title')
    ->add('name')
    ->add('entity1.customField1')
    ->add('entity2.customField2');
person Cristian Bujoreanu    schedule 12.12.2014
comment
Под подклассами я подразумеваю классы, которые наследуются от базового класса, который обрабатывает мой администратор (см. 16.3 в ссылке, которую я разместил в исходном вопросе). поэтому в определении службы они определены sonata.block.service.bulkjob: class: IDest\ContentBundle\Block\JobBulkBlockService arguments: [ "sonata.block.service.bulkjob", @templating,@sonata.admin.pool ] tags: - { name: sonata.block } calls: - [ setSubClasses, [ { AtlassianJob: IDest\ContentBundle\Document\Job\AtlassianJob , AwsJob: IDest\ContentBundle\Document\Job\AwsJob } ] ] - person Tom Whiston; 12.12.2014
comment
извините, что исказил код, и я не могу заставить его красиво отображаться, надеюсь, вы поняли идею - person Tom Whiston; 12.12.2014

Если кто-то еще сталкивается с этим, я узнал, как это сделать.

Чтобы заставить его работать аналогично странице редактирования, вы должны передать подкласс в URL-адресе.

...list?subclass=MySubClass

установите тему вашего listAction в вашем пользовательском crud-контроллере администратора

  public function listAction()
  {
    if (false === $this->admin->isGranted('LIST')) {
      throw new AccessDeniedException();
    }

    if ($listMode = $this->getRequest()->get('_list_mode')) {
      $this->admin->setListMode($listMode);
    }

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

    $datagrid = $this->admin->getDatagrid();
    $formView = $datagrid->getForm()->createView();

    // set the theme for the current Admin Form
    $this->get('twig')->getExtension('form')->renderer->setTheme($formView, $this->admin->getFilterTheme());

    return $this->render($this->admin->getTemplate('list'), array(
      'action'     => 'list',
      'form'       => $formView,
      'datagrid'   => $datagrid,
      'csrf_token' => $this->getCsrfToken('sonata.batch'),
    ));
  }

а затем переопределить метод createQuery в вашем классе администратора

public function createQuery($context = 'list')
  {
    $cName = get_class($this->getSubject());
    $query = $this->getModelManager()->createQuery($cName);

    foreach ($this->extensions as $extension) {
      $extension->configureQuery($this, $query, $context);
    }

    return $query;
  }
person Tom Whiston    schedule 12.12.2014

Если вы передаете что-либо с параметрами URL-адреса, вы также должны переопределить getPersistentParameters, чтобы добавить запрос URL-адреса в Pager, FilterForm и форму для пакетных действий (или других, которые отображаются в представлении списка)

<?php
class YourAdmin extends Admin
{
    public function getPersistentParameters()
    {
        if (!$this->getRequest()) {
            return array();
        }

        return array(
            'subclass' => $this->getRequest()->get('subclass'),
        );
    }
}
person Grzegorz Krauze    schedule 12.12.2014