La clausola LIKE non funziona in alter query di hook


9

Sto cercando di sostituire la ricerca predefinita con una clausola LIKE in Drupal 7. Ho provato a modificare la query in base all'aggiunta di una condizione OR a una query esistente :

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');
        }
      }
    }
  }
}

La ricerca con la parola "dichiarazione" mostra gli stessi risultati della ricerca drupal predefinita, ma la ricerca con "decl" non trova alcun risultato.

Qualche idea sul perché il mio codice non funziona?


1
Il modulo drupal.org/project/fuzzysearch dovrebbe risolvere il tuo problema. Puoi provarlo ..
Anil Sagar,

Grazie. Preferirei una soluzione con hook_query_alter (se possibile) in quanto il modulo di ricerca e la pagina dei risultati sono già impostati. Vorrei anche sapere perché il mio codice non funziona per altri casi d'uso.
user9932,

1
Potrebbe sembrare che tu ci sia il 90% del percorso e che tu abbia bisogno di questo pezzo finale per farlo funzionare, ma penso che stai andando nel modo sbagliato. Esistono molti moduli di ricerca per gestire tutti i tipi di casi d'uso e sono sicuro che troverai uno per risolvere il tuo. L'uso di questo tipo di intervento porterà probabilmente a confusione e non mantenibilità.
Alan Dixon,

Hai mai provato stampando ciò che viene portato in $searchvariabile? $ search = $ args [': db_condition_placeholder_1']; Se proviene da punti di vista hook_views_query_alter(), sarebbe semplice.

Risposte:


0

Hai provato a cambiare l'uncino che stai utilizzando MYMODULE_query_alter?

Stai implementando hook_query_TAG_alter () e non vedo dove la query di ricerca sia taggata come tale.

Per l' API Node :

Questo è hook_query_alter () per le query taggate con 'node_access'. Aggiunge controlli di accesso al nodo per l'account utente fornito dai metadati "account" (o $ user globali se non forniti), per un'operazione fornita dai metadati "op" (o "visualizza" se non forniti; altro i valori possibili sono 'update' ed 'delete')


0
module_query_tagName_tag_alter(QueryAlterableInterface $query)

Utilizzare questo e inserire un nome di tag view->querynell'impostazione. Usando questo puoi anche differenziare le viste.


0

Per aggiungere una nuova condizione puoi anche provare quanto sopra con add_where

$query->add_where(1,'i.word', '%' . db_like($search) . '%', 'LIKE');

Spero che questo dia il risultato che stai cercando.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.