web-dev-qa-db-ja.com

hook_views_query_alter()を実装するにはどうすればよいですか?

hook_views_query_alter() in Drupal 8.を実装しようとしました。my_module.views_execution.incにある必要があるというヒントを見つけました。それが、フックが呼び出されることはありません。

function mymodulename_views_query_alter(&$view, &$query)
{
    var_dump('foo');die;
}

* .incファイルをどこかに登録する必要がありますか?このトピックに関するドキュメントソースはありますか?

4
tobyte

フックは.moduleファイルに実装する必要があります。

フックを.moduleファイルに移動し、キャッシュを再構築すると、Drupalがそれを取得します。

もちろん、フックを含むファイルをrequireすることもできます。ただし、そのファイルが解析されている間は、フック関数を使用できます。

あなたはフックについてもう少し読むことができます ドキュメントで

2
Clive

Drupal 8では、MYMODULE.views_execution.incファイルで hook_views_query_alter() を使用するのがベストプラクティスです。代わりに、MYMODULE.views.incに配置すると、次の場合にのみ実行されますビューのキャッシュを再構築して、ビューを一度だけ正常に機能させ、その後は正常に機能させない。

MYMODULE.views_execution.incファイルはこの構造にする必要があります...

use Drupal\views\ViewExecutable;
use Drupal\views\Plugin\views\query\QueryPluginBase;

/**
 * Implements hook_views_query_alter().
 */
function MYMODULE_views_query_alter(ViewExecutable $view, QueryPluginBase $query) {

  // Only for my_view view.
  if ($view->id() == 'my_view') {
    // some action
  }

}

参照: views_test_data.views_execution.inc

5
webdevfreak

もちろん、d8でhook_views_query_alterを作成することは、d7と同じではありません。もちろん、何度か試してみたところ、なんとかこれを取得できました。

 function MYMODULE_views_query_alter(ViewExecutable $ view、QueryPluginBase $ query){
 if(($ view-> id()== 'MY_VIEW' && $ view-> current_display == 'page_1')) {
 $ allowed_filters = ['language' => ['table' => 'node__field_v_language'、 'condition_field' => 'field_v_language_value'、 'operator' => 'IN']、
 '国 '=> ['表 '=>' node__field_v_country '、' condition_field '=>' field_v_country_value '、' operator '=>' IN ']、
' city '=> [' table '=>' node__field_v_locations '、' condition_field '=>' field_v_locations_target_id '、' operator '=>' IN ']、
' theme '=> [' table '=>' node__field_v_themes '、' condition_field '=>' field_v_themes_target_id ' 、 'operator' => 'IN']、
 'tag' => ['table' => 'node__field_v_tags'、 'condition_field' => 'field_v_tags_target_id'、 'operator' => 'IN']、 
 'chId' => ['table' => 'node__field_v_ch_id'、 'condition_field' => 'field_v_ch_id_value'、 'operator' => 'IN']、
 'publishedBefore' => [ 'table' => 'node__field_v_published'、 'condition_field' => 'field_v_published_va lue '、' operator '=>'> ']、
' publishedAfter '=> [' table '=>' node__field_v_published '、' condition_field '=>' field_v_published_value '、' operator '=>' $ record ){
 $ alias = $ q .'_ als '; 
 $ condition_field = $ alias。'。 '。$ record [' condition_field ']; 
 $ configuration = 
 'type' => 'LEFT'、
 'table' => $ record ['table']、
 'field' => 'entity_id'、
 'left_table' => 'node_field_data'、
 'left_field' => 'nid'、
 'operator' => '='、
; 
 
 $ join =\Drupal\views\Views :: pluginManager( 'join')
-> createInstance( 'standard'、$ configuration); 
 $ rel = $ query-> addRelationship($ alias、$ join、 'node_field_data'); 
 $ query-> addTable( 'node__field_v_language'、$ rel、$ join、$ alias); 
 $ query-> addWhere( ' '、$ condition_field、[$ _ GET [$ q]]、$ record [' operator ']); 
} 
} 
} 
0
Hajbad