OK的,下面是这个问题的解决方案。请注意,我没有太多测试,只是在我的本地测试magento。所以可能会出现问题。
我们的工作班级是Mage_Adminhtml_Block_Widget_Grid,位于'app/code/core/Mage/Adminhtml/Block/Widget/Grid.php'中。你应该在'app/code/local/Mage/Adminhtml/Block/Widget/Grid.php'中拷贝这个文件,以免覆盖核心类。
现在,在该文件中转到名为_addColumnFilterToCollection的函数。在这里,删除'} else {'语句中的所有内容并替换为:
$cond = $column->getFilter()->getCondition();
if ($field == "name" && isset($cond)) {
$filterOrig = $cond['like'];
$filterReplaced = str_replace(" ", "%", $filterOrig);
$newZendDbExpr = new Zend_Db_Expr($filterReplaced);
$modifCond = array('like'=>$newZendDbExpr);
$this->getCollection()->addFieldToFilter($field , $modifCond);
} else if ($field && isset($cond)) {
$this->getCollection()->addFieldToFilter($field , $cond);
}
'$ cond'变量是这里的关键。如果你打印你喜欢的东西:
Array([like] => Zend_Db_Expr Object([_expression:protected] => '%filter term%'));
该代码段基本上截获传递给此Zend_Db_Expr对象的过滤条件,使其通过一个str_replace()函数有一个“%”通配符,然后更换任何空白将其发回给对象。
所以,现在如果你有一个产品的名称像'word1 word2 word3'和搜索过滤术语'word1 word3',你会得到正确的结果。我接受建议,这可能不是最好的方法。我将在正确测试之后进行更新。干杯!
SEP 06 UPDATE:好吧,经过一些现场测试,结果很好,正是我想要的时候。看起来也没有负面的业绩影响。
而有趣的事实是,这个小小的修改适用于在管理界面中您拥有产品网格的每个地方进行过滤(例如,手动创建新订单并单击添加产品时或在管理类别 - >无论类别 - >类别产品选项卡)
SEP 06 UPDATE 2:有一个问题。如果您处于订单网格并尝试按状态过滤,则会引发错误。我需要使这个过滤器只适用于名称字段。有任何想法吗?
SEP 06 UPDATE 3:我将脚本修改为仅适用于产品网格的名称字段。现在,通过可见性或按状态排序的过滤器产品没有任何冲突。
我认为'搜索范围内'功能会更容易实现 - 所以您可以缩小结果范围......模糊搜索需要将表格重新格式化为MyISAM全文,或者甚至使用Solr等工具。 – philwinkle 2012-08-15 21:44:48