2014-09-26 105 views
2

我想向由索纳塔搜索功能生成的查询添加自定义条件。问题是我有'状态'栏应该设置为“活动”。如何将自定义条件添加到索纳塔全局搜索功能

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

,然后所有的查询检查状态字段设置正确:在列表视图,因为我能够设置我没有任何问题。 但问题是全球搜索。我可以重写SearchHandler并强制所需的行为,但我无法更改供应商/目录中的任何文件,所以我有两个问题。

  1. 我怎么能注入我自己SearchHandler,我需要更改配置文件,并
  2. 怎么可能有是需要下发展的解决方案更简单的方法?
+0

将您的解决方案发布为自己的答案,并在验收期后接受它,以便未来的访问者可以看到此问题已解决,如果确实有帮助,那么您将获得解决方案 – 2014-09-28 11:28:28

回答

2

SOLUTION

我知道我是怎么可以注入自己的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 
  • 创建文件“XXX \ CmsBundle \搜索\ AdminSearchBlockService“并将SearchHandler实例更改为您自己的
  • 创建文件”XXX \ CmsBundle \ Search \ SearchHandler“并更改实施。它可以是类似的东西:

    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; 
        } 
    } 
    
  • 重要

    '状态' 字段必须添加到在管理类configureDatagridFilters方法。

    0

    我想我会将我的解决方案添加到此问题。

    我的问题是类似的,我的管理类将修改管理实体的各自的createQuery。此查询将添加限制,以便用户只能查看其模型,或者仅查看未被删除的内容。

    的问题是SearchHandler.php将集合中的所有过滤器作为

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

    这将导致查询看起来像:

    (myAddedCondition OR filterCondition OR filterCondition OR filterCondition) 
    

    我真正想要的却是:

    (myAddedCondition) AND (filterCondition OR filterCondition OR filterCondition) 
    

    为了实现这一点,我reg istered GLOBAL ASTWalker它实现walkWhereClause方法..然后在沃克我会手动编辑生成的SQL来满足我的要求。