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_


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 )


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

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";
  }
}

0

Versuche dies,

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

0

Sie können genau wie verwenden

$query->add_where(1,'node.nid',$value,'=');  
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.