SonataAdminBundle - 一个实体的多个列表视图

SonataAdminBundle - multiple list views of one entity

假设我有一个名为 Offer 的实体。

我想为要约实体创建多个列表视图。每个列表视图应包含具有不同状态的报价(即草稿、活动、非活动...)。

到目前为止,我创建了两个优惠管理员:DraftOfferAdminActiveOfferAdmin。这里我定义了自定义查询:

public function createQuery($context = 'list')
{
    /** @var ModelManager $modelManager */
    $modelManager = $this->getModelManager();
    $entityManager = $modelManager->getEntityManager($this->getClass());

    $queryBuilder = $entityManager->createQueryBuilder();
    $queryBuilder
        ->select('o')
        ->from($this->getClass(), 'o')
        ->where('o.state = :state')
        ->setParameter('state', 'draft');

    $query = new ProxyQuery($queryBuilder);

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

    return $query;
}

查询似乎工作正常!

我在服务中定义了管理员:

services:
    admin.draft_offer:
        class: IndexBundle\Admin\Offer\DraftOfferAdmin
        arguments:
            - null
            - IndexBundle\Entity\Offer
            - IndexBundle:CRUD
        tags:
            - { name: sonata.admin, manager_type: orm, group: Offers, label: Draft Offers }
    admin.unverified_offer:
        class: IndexBundle\Admin\Offer\UnverifiedOfferAdmin
        arguments:
            - null
            - IndexBundle\Entity\Offer
            - IndexBundle:CRUD
        tags:
            - { name: sonata.admin, manager_type: orm, group: Offers, label: Unverified Offers }

但是两个列表视图页面共享相同的 URL http://domain.com/admin/index/offer/list。有什么想法我在配置中遗漏了什么吗?

发生这种情况可能是因为虽然管理员 class 不同,但您的实体 class 是相同的。我建议 this article 以实现您需要的功能,同时也更加人性化。

现在我在一个项目中正好需要这个功能:

在您的管理员中 class 您需要像

一样设置路由和路由模式
class ClassAdmin extends AbstractAdmin
{
    protected $baseRoutePattern = 'class-route';
    protected $baseRouteName = 'class-route';

  public function createQuery($context = 'list')
  {
    $query = parent::createQuery($context);
    $query->join($query->getRootAlias() . '.status', 'st');
    $query->andWhere('st.id = :status')
        ->setParameter('status', $statis);
    return $query;
   }
   //admin class code.. 
}

并以标准方式包含它..