好的,这是解决此问题的方法。请注意,我没有对此进行太多测试,只是在我的本地测试 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”搜索过滤器,您将获得正确的结果。我愿意接受建议,这可能不是最好的方法。我会在正确测试后更新。干杯!
9 月 6 日更新:嗯,经过一些现场测试,结果很好,正是我想要的。似乎也没有负面的性能影响。
有趣的事实是,这个小修改适用于在管理界面中有产品网格的每个地方进行过滤(例如,当手动创建新订单并单击添加产品时,或在管理类别 -> 任何类别中 - > 类别产品选项卡)
9 月 6 日更新 2:有一个问题。如果您在订单网格中并尝试按状态过滤,则会引发错误。我需要使此过滤器仅适用于名称字段。有任何想法吗?
9 月 6 日更新 3:我将脚本修改为仅适用于产品网格的名称字段。现在,通过可见性过滤产品或按状态排序等没有冲突。