0

目前我无法使用 symfony 2 的 sonta admin bundle 让子类出现在列表视图中

我可以让它根据高级配置页面(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 调试工具栏似乎显示 db 查询正在寻找父类。有人让这个工作吗?

4

3 回答 3

0

如果您使用 url 参数传递任何内容,您还应该覆盖 getPersistentParameters 以将您的 url 请求添加到 Pager、FilterForm 和 batchActions 的表单(或出现在列表视图中的其他表单)

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

        return array(
            'subclass' => $this->getRequest()->get('subclass'),
        );
    }
}
于 2014-12-12T20:35:06.790 回答
0

万一其他人面临这个问题,我发现了如何做到这一点。

要使其以类似于编辑页面的方式工作,您将在 url 中传递子类

...list?subclass=MySubClass

在您的自定义管理 crud 控制器中设置您的 listAction 的主题

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

然后在您的 Admin 类中覆盖 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;
  }
于 2014-12-12T15:25:30.507 回答
0

我不确定您对列表视图中的那些“子类”是什么意思,但是如果您想从另一个实体中添加一个字段(通过外键与您的实体连接),您可以这样做:

$listMapper
    ->addIdentifier('id')
    ->addIdentifier('title')
    ->add('name')
    ->add('entity1.customField1')
    ->add('entity2.customField2');
于 2014-12-12T08:34:00.740 回答