使用 SonataAdminBundle。在两步相关实体上配置过滤器

Posted

技术标签:

【中文标题】使用 SonataAdminBundle。在两步相关实体上配置过滤器【英文标题】:With SonataAdminBundle. Configure filter on a two step related entity 【发布时间】:2012-10-29 23:32:48 【问题描述】:

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

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

在 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

不适用于我试图完成的内容,但找不到可以查看的地方。

希望有人对此有所了解。

谢谢

【问题讨论】:

【参考方案1】:

最后,我在另一个问题的指导下找到了答案:How can I create a custom DataGrid filter in SonataAdmin 并仔细阅读了我粘贴在我的问题中的奏鸣曲管理文档链接。

如果有人遇到此问题并以前面的示例为例:

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;

【讨论】:

这帮助我做了一个小的改变:我更喜欢 empty($value['value']) 而不是 empty($value['value']) 因为 empty(int(0)) 是评估为真。非常感谢您的解决方案。【参考方案2】:

官网有详细记录:http://sonata-project.org/bundles/doctrine-orm-admin/master/doc/reference/filter_field_definition.html

【讨论】:

是的,我猜在 2012 年 11 月还不是这样 ;-) 但它是现在,所以为什么不赞成它.. 它仍然是一个正确的相关答案

以上是关于使用 SonataAdminBundle。在两步相关实体上配置过滤器的主要内容,如果未能解决你的问题,请参考以下文章

在Gitlab中传递--build-arg或在两步Dockerfile中使用环境变量

如何在 SonataAdminBundle 中使用角色

MinMax 树 - 当 Min 可以分两步获胜时

SonataAdminBundle 中的 PageableManagerInterface 错误

SonataAdminBundle 如何获取当前的管理类?

SonataAdminBundle :显示非粗略(统计)