comment utiliser hook_views_query_alter () pour modifier où condition?

12

J'essaie de modifier la condition where d'une requête de vues. jusqu'à présent, j'ai réussi à modifier la "commande par" , mais je ne sais pas comment modifier la condition where . Je veux vérifier le search_term et s'il était en majuscule, le transformer en minuscule pour que la requête puisse le trouver. il y a aussi quelques caractères spéciaux dans ma langue (persan) dont j'ai besoin pour les remplacer avant l'exécution de la requête. n'importe qui peut m'aider par où commencer ou quels crochets ou vues_handlers utiliser?

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

le résultat de développement pour où la condition est comme suit en ce moment. : views_combine est égal à% 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.___tags._book_t_s._book_t_s._book_t_s._tag_l_t_s_tata_tata

nooshinha
la source
Il n'est pas nécessaire (déconseillé) d'écrire les paramètres d'un hook dans le commentaire "@param ...". Ces paramètres sont toujours les mêmes et bien documentés pour chaque crochet.
wranvaud
Tout à fait correct, le meilleur à utiliser@inheritdoc
ajmedway

Réponses:

9

Vous pouvez accéder au contenu d'une condition where en modifiant sa valeur:

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

Assez similaire à ce que vous avez fait avec orderby. Vous pouvez également ajouter des conditions Where personnalisées ( https://api.drupal.org/api/views/plugins%21views_plugin_query_default.inc/function/views_plugin_query_default%3A%3Aadd_where/7 et https://api.drupal.org/api/ views / plugins% 21views_plugin_query_default.inc / function / views_plugin_query_default% 3A% 3Aadd_where_expression / 7 )

Jose Daniel
la source
beaucoup de bronzage, c'est exactement ce que je cherchais
nooshinha
14

Pour ajouter une nouvelle clause where que vous pouvez utiliser, add_where

Par exemple :

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

Essaye ça,

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

Vous pouvez utiliser comme

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