Drupal 7でデフォルトの検索をLIKE句に置き換えようとしています。既存のクエリへのOR条件の追加に従ってクエリを変更しようとしました。
function MYMODULE_query_node_access_alter(QueryAlterableInterface $query) {
foreach ($query->getTables() as $table) {
// LIKE for search results.
if ($table['table'] == 'search_index') {
// Get the query args and then the search term
$args =& $query->getArguments();
$search = $args[':db_condition_placeholder_1'];
// Get a reference to the existing query conditions.
$conditions =& $query->conditions();
// Save the former conditions
$former_conditions = $conditions;
// Reset the condition array. It needs a default #conjunction for which AND is fine
$conditions = array('#conjunction' => array_shift($former_conditions));
// Replace the search condition in the query
foreach ($former_conditions as $key => $condition) {
if ($key != 1) {
$query->condition($condition['field'], $condition['value'], $condition['operator']);
}
else {
$query->condition('i.word', '%' . db_like($search) . '%', 'LIKE');
}
}
}
}
}
「宣言」という単語で検索すると、デフォルトのdrupal検索と同じ結果が表示されますが、「decl」で検索しても結果は見つかりません。
コードが機能しない理由はありますか?
1
drupal.org/project/fuzzysearchモジュールは問題を解決するはずです。あなたは...それを試してみることができます
—
アニル・サーガル
ありがとうございました。検索フォームと結果ページがすでに設定されているため、私は(可能であれば)hook_query_alterを使用したソリューションを好みます。また、コードが他のユースケースで機能しない理由も知りたいです。
—
user9932
あなたはそこにいる道の90%であるように見えるかもしれませんが、それを機能させるためにこの最後の部分が必要なだけですが、私はあなたがそれを間違った方法で行っていると思います。あらゆる種類のユースケースに対応する検索モジュールがたくさんあり、あなたがあなたの問題を解決するものを見つけると私は確信しています。この種の介入を使用すると、混乱と保守性の低下につながる可能性があります。
—
アランディクソン