¿Cómo usar hook_views_query_alter () para modificar la condición where?

12

Estoy tratando de modificar la condición where de una consulta de vistas. hasta ahora tuve éxito al alterar "ordenar por" , pero no tengo idea de cómo alterar la condición where . Quiero verificar search_term y si estaba en mayúsculas, transformarlo en minúsculas para que la consulta pueda encontrarlo. También hay algunos caracteres especiales en mi idioma (persa) que necesito reemplazarlos antes de que se ejecute la consulta. ¿Alguien puede ayudarme por dónde empezar o qué ganchos o vistas_handlers usar?

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

El resultado de desarrollo para donde la condición es la siguiente en este momento. : views_combine es igual 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.field_book_take.view_book_take.view_book_take.book_book_book_booking

nooshinha
fuente
No es necesario (desaconsejado) escribir los parámetros de un gancho en el comentario "@param ...". Estos parámetros son siempre los mismos y están bien documentados para cada gancho.
wranvaud
Muy bien, mejor usar@inheritdoc
ajmedway

Respuestas:

9

Puede acceder al contenido de una condición where que modifica su valor:

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

Bastante similar a lo que hiciste con orderby. También puede agregar condiciones de ubicación personalizadas ( https://api.drupal.org/api/views/plugins%21views_plugin_query_default.inc/function/views_plugin_query_default%3A%3Aadd_where/7 y https://api.drupal.org/api/ views / plugins% 21views_plugin_query_default.inc / function / views_plugin_query_default% 3A% 3Aadd_where_expression / 7 )

Jose daniel
fuente
tanx mucho, eso es exactamente lo que estaba buscando
nooshinha
14

Para agregar una nueva cláusula where que pueda usar, add_where

Por ejemplo :

$query->add_where(1,'taxonomy_term_data_node.tid', $value, 'NOT IN');
Rohith Pv
fuente
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
fuente
0

Prueba esto,

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

Puedes usar igual que

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