我想为Sonata Search功能生成的查询添加自定义条件。问题是我有'status'列,应该设置为“active”。在列表视图上我没有任何问题,因为我能够设置:
protected $datagridValues = array (
'status' => array ('type' => 1, 'value' => Status::ACTIVE)
);
然后所有查询检查状态字段是否设置正确。 但问题在于全球搜索。我可以覆盖SearchHandler并强制执行所需的行为,但我无法更改vendor /目录中的任何文件,因此我有两个问题。
答案 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
创建文件&#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;
}
}
重要强>
&#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以满足我的要求。