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

时间:2016-09-13 13:54:52

标签: symfony sonata-admin

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

我想为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。我的配置中有什么想法?

1 个答案:

答案 0 :(得分:2)

这可能是因为虽然管理类不同,但实体类是相同的。我建议this article以获得您需要的功能,也更加用户友好。

现在我需要在一个项目中使用这个功能:

在您的管理类中,您需要设置路线和路线模式,如

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.. 
}

并以标准的方式包含它..