8

我想知道天气是可能的,以及如何在 Symfony 2 中使用 SonataAdminBundle 为列表视图配置过滤器,如下所示

假设我有实体订单,指向实体用户,指向实体公司。我想配置过滤器,既可以按用户过滤,也可以按公司(用户的公司)过滤。第一个是直截了当的。第二个是我试图澄清的。

在 OrderAdmin 类中,我将 configureDatagridFilters 覆盖为:

protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
     $datagridMapper
         ->add('created_at')
         //... some other filters on Order fields, as usual

         // the filter on User, provided 'user', no ploblem
         ->add('user')

         // and the filter by Company 
         ->add('user.company') // this doesn't work, of course
    ;
}

公司过滤器的语法受到 Sonta 文档的启发:http ://sonata-project.org/bundles/doctrine-orm-admin/2-0/doc/reference/filter_field_definition.html

不适用于我尝试完成的内容,但找不到在哪里查看。

希望有人对此有所了解。

谢谢

4

2 回答 2

16

最后,我找到了由另一个问题引导的答案:如何在 SonataAdmin 中创建自定义 DataGrid 过滤器,并仔细阅读我粘贴在问题中的奏鸣曲管理文档链接。

如果有人遇到这个问题并采取前面的例子:

protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
   $datagridMapper

      //... whatever filter

      // and the filter by Company 

      ->add('company', 'doctrine_orm_callback', array(
            'callback'   => array($this, 'callbackFilterCompany'),
            'field_type' => 'checkbox'
            ),
    'choice', 
    array('choices' => $this -> getCompanyChoices())
;
}

其中 getCompanyChoices 方法检索公司 ID => 公司名称的关联数组(例如)。而callbackFilterCompany方法如下

public function callbackFilterCompany ($queryBuilder, $alias, $field, $value)
{
    if(!is_array($value) or !array_key_exists('value', $value) 
        or empty($value['value'])){

        return;

    }

    $queryBuilder
    ->leftJoin(sprintf('%s.user', $alias), 'u')
    ->leftJoin('u.company', 'c')
    ->andWhere('c.id = :id')
    ->setParameter('id', $value['value'])
    ;

    return true;
}
于 2012-11-14T15:27:45.633 回答
2

它在官方网站上有很好的记录:http: //sonata-project.org/bundles/doctrine-orm-admin/master/doc/reference/filter_field_definition.html

于 2014-06-16T09:32:15.647 回答