OK、これがこの問題の解決策です。私はこれをあまりテストしていないことに注意してください。私のローカルテストマゼントだけです。そのため、問題が発生する可能性があります。
私たちの作業クラスは、「app / code / core / Mage / Adminhtml / Block / Widget/Grid.php」にあるMage_Adminhtml_Block_Widget_Gridです。コアクラスを上書きしないように、このファイルを「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 word2word3」のような名前の製品があり、「word1word3」という用語でフィルターを検索すると、適切な結果が得られます。私は提案を受け入れています、これは最善のアプローチではないかもしれません。これを適切にテストした後、更新します。乾杯!
9月6日更新:いくつかのライブテストの後、結果は良好で、まさに私が望んでいたものです。パフォーマンスへの悪影響もないようです。
そして興味深い事実は、この小さな変更が、管理インターフェースに製品グリッドがあるすべての場所でのフィルタリングに適用されることです(たとえば、新しい注文を手動で作成して[製品の追加]をクリックする場合、または[カテゴリの管理]->[カテゴリ]- > [カテゴリ製品]タブ)
9月6日更新2:問題があります。Ordersグリッドを使用していて、ステータスでフィルタリングしようとすると、エラーがスローされます。このフィルターを[名前]フィールドにのみ適用するようにする必要があります。何か案は?
SEP 06 UPDATE 3:製品グリッドの[名前]フィールドにのみ適用されるようにスクリプトを修正しました。これで、可視性によるフィルター製品やステータスなどによる注文との競合は発生しません。