web-dev-qa-db-ja.com

hook_views_query_alter()を使用してwhere条件を変更する方法

ビュークエリのwhere条件を変更しようとしています。これまでは"order by"を変更することに成功していましたが、where conditionを変更する方法がわかりません。 search_termを確認し、大文字であった場合は小文字に変換して、クエリで検索できるようにします。また、私の言語(ペルシア語)には、クエリを実行する前にそれらを置き換える必要があるいくつかの特殊文字があります。誰でも私がどこから始めればいいのか、どんなフックやviews_handlersを使うのを手伝ってくれる?

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

where条件の開発結果は次のとおりです。 :views_combineは%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)LIKE:views_combine

12
nooshinha

値を変更するwhere条件のコンテンツにアクセスできます。

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

Orderbyで行ったこととかなり似ています。また、カスタムのwhere条件( https://api.drupal.org/api/views/plugins%21views_plugin_query_default.inc/function/views_plugin_query_default%3A%3Aadd_where/7 および https ://api.drupal.org/api/views/plugins%21views_plugin_query_default.inc/function/views_plugin_query_default%3A%3Aadd_where_expression/7

9
Jose Daniel

使用できる新しいwhere句を追加するには、 add_where

例えば ​​:

$query->add_where(1,'taxonomy_term_data_node.tid', $value, 'NOT IN');
14
Rohith Pv
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";
  }
}
2
Drock

これを試して、

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

次のように使用できます

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