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


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 )


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

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

Essaye ça,

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

0

Vous pouvez utiliser comme

$query->add_where(1,'node.nid',$value,'=');  
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.