2014-09-26 149 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來滿足我的要求。