如何向Sonata全局搜索功能添加自定义条件

时间:2014-09-26 10:43:07

标签: symfony sonata-admin

我想为Sonata Search功能生成的查询添加自定义条件。问题是我有'status'列,应该设置为“active”。在列表视图上我没有任何问题,因为我能够设置:

protected $datagridValues = array (
    'status' => array ('type' => 1, 'value' => Status::ACTIVE)
);

然后所有查询检查状态字段是否设置正确。 但问题在于全球搜索。我可以覆盖SearchHandler并强制执行所需的行为,但我无法更改vendor /目录中的任何文件,因此我有两个问题。

  1. 我如何注入自己的SearchHandler,我需要更改哪个配置文件以及如何
  2. 也许有更简单的方法来开发所需的解决方案?

2 个答案:

答案 0 :(得分:3)

<强>解

我已经弄清楚如何注入自己的SearchHandler。以下代码用于: 1.只需编辑您的services.yml文件并输入类似的内容:

    cmsbundle.search.handler:
        class: XXX\CmsBundle\Search\SearchHandler
        arguments:
        -  @sonata.admin.pool
    sonata.admin.block.search_result:
        class: XXX\CmsBundle\Search\AdminSearchBlockService
        tags:
            - { name: sonata.block }
        arguments:
            - sonata.admin.block.search_result
            - @templating
            - @sonata.admin.pool
            - @cmsbundle.search.handler
  1. 创建文件&#34; XXX \ CmsBundle \ Search \ AdminSearchBlockService&#34;并将SearchHandler实例更改为您自己的
  2. 创建文件&#34; XXX \ CmsBundle \ Search \ SearchHandler&#34;并改变实施。它可以是这样的:

    foreach ($datagrid->getFilters() as $name => $filter) {
        /** @var $filter FilterInterface */
        if ($filter->getOption('global_search', false)) {
            if ($filter->getName() !== 'status') {
                $filter->setCondition(FilterInterface::CONDITION_OR);
                $datagrid->setValue($name, null, $term);
            } else {
                $filter->setCondition(FilterInterface::CONDITION_AND);
                $datagrid->setValue($name, null, 'active');
            }
            $found = true;
        }
    }
    
  3. 重要

    &#39;状态&#39;必须将字段添加到Admin类中的configureDatagridFilters方法。

答案 1 :(得分:0)

我以为我会为这个问题添加解决方案。

我的问题类似,我的Admin类会修改Admin Entities各自的createQuery。此查询将添加限制,以便用户只能查看其模型,或仅查看未删除的内容。

问题是edd_get_discount_amount( $discount_id ) 会将所有过滤器设置为

SearchHandler.php

这会导致查询看起来像:

$filter->setCondition(FilterInterface::CONDITION_OR);

我真正想要的是:

( myAddedCondition OR filterCondition OR filterCondition OR filterCondition )

为了实现这一点,我注册了一个GLOBAL ASTWalker,它实现了( myAddedCondition ) AND ( filterCondition OR filterCondition OR filterCondition ) 方法。然后在Walker中我会手动编辑生成的SQL以满足我的要求。