Wie verwende ich hook_views_query_alter (), um die Where-Bedingung zu ändern?

11

Ich versuche, die where-Bedingung einer Ansichtsabfrage zu ändern. Bis jetzt war es mir gelungen, "order by" zu ändern, aber ich habe keine Ahnung, wie ich den where-Zustand ändern soll . Ich möchte das search_term überprüfen und wenn es in Großbuchstaben geschrieben ist, in Kleinbuchstaben umwandeln, damit die Abfrage es finden kann. Außerdem gibt es einige Sonderzeichen in meiner Sprache (Persisch), die ich ersetzen muss, bevor die Abfrage ausgeführt wird. Kann mir jemand helfen, wo ich anfangen soll oder welche Hooks oder Views-Handler ich verwenden soll?

<?php
/**
 * Implementation of hook_views_query_alter
 * @param type $view
 * @param type $query
 */
function nashreneydev_views_query_alter(&$view, &$query) {
  //krumo($query);
  //krumo($view);
  if ($view->name == 'custom_search') {
    $search_term = $view->exposed_raw_input['combine'];

    **//$query->where[0]['conditions'][0]['field']= "?????";**
    $view->query->orderby[1]['field'] = "CASE node_type WHEN 'product_display' THEN 1 ELSE 2 END";
    $view->query->orderby[1]['direction'] = "ASC";
    $view->query->orderby[0]['field'] = "CASE node_title WHEN '".$search_term."' THEN 1 ELSE 2 END";
    $view->query->orderby[0]['direction'] = "ASC";
    //krumo($view->query->orderby);
  }
}
?>

Das Entwicklungsergebnis für den aktuellen Zustand ist wie folgt. : views_combine entspricht% s%.

CONCAT_WS ('', node.title, '', field_data_body.body_value, '', field_data_field_author.field_author_target_id, '', field_data_field_translator.field_translator_target_id, '', field_data_field_book_tags.field_t_

Nooshinha
quelle
Es ist nicht notwendig (davon abgeraten), die Parameter eines Hooks in den Kommentar "@param ..." zu schreiben. Diese Parameter sind für jeden Haken immer gleich und gut dokumentiert.
Wranvaud
Ganz richtig, am besten zu benutzen@inheritdoc
Ajmedway

Antworten:

9

Sie können auf den Inhalt einer where-Bedingung zugreifen, indem Sie deren Wert ändern:

$query->where[0]['conditions'][0]['value'] = 'something...';

Ziemlich ähnlich wie bei orderby. Sie können auch benutzerdefinierte Where-Bedingungen hinzufügen ( https://api.drupal.org/api/views/plugins%21views_plugin_query_default.inc/function/views_plugin_query_default%3A%3Aadd_where/7 und https://api.drupal.org/api/). Ansichten / Plugins% 21views_plugin_query_default.inc / function / views_plugin_query_default% 3A% 3Aadd_where_expression / 7 )

Jose Daniel
quelle
tanx viel, genau das habe ich gesucht
nooshinha
14

Fügen Sie add_where hinzu, um eine neue where-Klausel hinzuzufügen, die Sie verwenden können

Zum Beispiel :

$query->add_where(1,'taxonomy_term_data_node.tid', $value, 'NOT IN');
Rohith Pv
quelle
2
function mymodule_views_query_alter(&$view, &$query) {
  // Term id's to unset from result set.
  $tids = array(346,355,359);
  if ($view->name == 'yourviewname') {

    $query->add_where(1,'taxonomy_term_data_node.tid', $tids, 'NOT IN');
    $query->orderby[0]['field'] = "CASE WHEN taxonomy_term_data_taxonomy_term_hierarchy.weight IS NULL THEN taxonomy_term_data_node.weight ELSE taxonomy_term_data_taxonomy_term_hierarchy.weight END";
    $query->orderby[0]['direction'] = "ASC";
    $query->orderby[1]['field'] = "taxonomy_term_data_node.weight";
    $query->orderby[1]['direction'] = "ASC";
  }
}
Drock
quelle
0

Versuche dies,

 $location_value = strtolower($string);
 $query->where[1]['conditions'][0] = array('field'=>"node.title","value"=>'%'.$location_value.'%',"operator"=>"LIKE");
4Leben
quelle
0

Sie können genau wie verwenden

$query->add_where(1,'node.nid',$value,'=');  
Fawwad
quelle