Sonata admin - 相关表格中的“order by”字段

时间:2012-01-12 18:20:00

标签: symfony doctrine-orm admin

我有一个产品管理类。 Product实体与Category实体具有多对一关系,即产品与类别相关联。

在产品的管理“列表”页面中,我需要按类别名称(按字母顺序)对每个产品的关联进行排序。

如果字段位于实体本身上,则设置默认字段以进行排序很容易(有关如何执行此操作,请参阅Sonata admin bundle order)。但我无法弄清楚如何按相关表格中的字段排序。

感谢任何帮助。

2 个答案:

答案 0 :(得分:6)

这似乎是一种解决方法,但它确实有效。你必须添加一个覆盖createQuery()方法的连接,而不是指定一个覆盖$ datagridValues的默认sortBy:

<?php
use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery;

class ExpenseAdmin extends Admin
{
    protected $datagridValues = array(
        '_page'       => 1,
        '_sort_order' => 'ASC', // sort direction
        '_sort_by' => 'c.name' // field name
    );

    /**
     * @return \Sonata\AdminBundle\Datagrid\ProxyQueryInterface
     */
    public function createQuery($context = 'list')
    {
        $query = parent::createQuery($context);

        return new ProxyQuery($query
            ->join(sprintf('%s.category', $query->getRootAlias()), 'c'));
    }
}

答案 1 :(得分:6)

Asume name是您想要排序的实体Category的属性。您可以在ProductAdmin.php

中执行此操作
protected function configureListFields(ListMapper $listMapper)
{

     $listMapper->add('category.name', null, array(
            'sortable' => true,
     ));
     ...
}

通过这种方式,您可以利用Sonata生成的列表标题中的排序链接。

修改

如果您还希望在产品列表中有类别名称的链接以快速编辑Category实体,假设您已创建了CategoryAdmin类,则应编写如下代码:

protected function configureListFields(ListMapper $listMapper)
{

     $listMapper->add('category', null, array(
            'sortable' => 'category.name',
     ));
     ...
}

Category课程中,您应该像这样实施__toString()方法:

public function __toString()
{
    return $this->getName();
}