¿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


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 )


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

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

Prueba esto,

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

0

Puedes usar igual que

$query->add_where(1,'node.nid',$value,'=');  
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.