come utilizzare hook_views_query_alter () per modificare dove condizione?


12

Sto provando a modificare la condizione where di una query di visualizzazione. fino ad ora ho avuto successo con l'alterazione di "ordina per" , ma non ho idea di come modificare la condizione di dove . Voglio controllare search_term e se era in maiuscolo, trasformarlo in minuscolo in modo che la query possa trovarlo. inoltre ci sono alcuni caratteri speciali nella mia lingua (persiano) che devo sostituire prima dell'esecuzione della query. qualcuno può aiutarmi da dove cominciare o quali hook o views_handlers usare?

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

il risultato di sviluppo per dove condizione è come seguire adesso. : views_combine è uguale a% 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_book_tags_tid) COME: views_combine


Non è necessario (scoraggiato a) scrivere i parametri di un hook nel commento "@param ...". Questi parametri sono sempre gli stessi e ben documentati per ogni hook.
wranvaud,

Abbastanza giusto, il migliore da usare@inheritdoc
ajmedway,

Risposte:


9

Puoi accedere al contenuto di una condizione dove modificandone il valore:

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

Abbastanza simile a quello che hai fatto con orderby. Inoltre è possibile aggiungere condizioni personalizzate dove ( https://api.drupal.org/api/views/plugins%21views_plugin_query_default.inc/function/views_plugin_query_default%3A%3Aadd_where/7 e https://api.drupal.org/api/ views / plugins% 21views_plugin_query_default.inc / function / views_plugin_query_default% 3A% 3Aadd_where_expression / 7 )


tanx molto, è esattamente quello che stavo cercando
nooshinha,

14

Per aggiungere una nuova clausola Where che è possibile utilizzare, add_where

Per esempio :

$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

Prova questo,

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

0

Puoi usare proprio come

$query->add_where(1,'node.nid',$value,'=');  
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.