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