web-dev-qa-db-ja.com

ビューがhook_views_query_alterを起動しないのはなぜですか?

Commerce Kickstart 2を使用していますが、含まれているビューcollection_productsのクエリを変更したいと思います。

まず、次のコードを使用して_mymodule_views.inc_ファイルを追加しました。

_function jch_utilities_views_query_alter(&$view, &$query) {
  dpm($view->name);
  if ($view->name == 'collection_products') {
    // my code goes here;
  }
}
_

dpm()は、ページの各ビューで3回発生しますが、collection_productsビューでは発生しません。明らかに、hook_views_query_alter()が起動していますが、なぜそのビューが表示されないのですか?

明確にするために:ビュー/ページの表示は適切にレンダリングされます。

私は この問題 を見て、それが当てはまるかどうか疑問に思います。

クエリを変更する別の方法はありますか?

1
jchwebdev

hook_views_query_alter() APIをお読みください。

このフックは_MODULENAME.views.inc_に配置する必要があり、自動ロードされます。 _MODULENAME.views.inc_は、MODULENAME_views_api()によって返される 'path'キーで指定されたディレクトリ、または 'path'が指定されていない場合は_.module file_と同じディレクトリにある必要があります。

したがって、メインモジュールファイルまたは_MODULENAME.views.inc_(_mymodule_views.inc_ではない)の正しい場所にフックを配置していることを再確認し、_MODULENAME_views_api_関数が定義されていることを確認してください(ただし、フィーチャーによって既に定義されています)。結局のところ、すべてのキャッシュ(使用中の場合はmemcachedを含む)をクリアします。

参照: hook_views_query_alter()の使用方法

それでも問題が解決しない場合は、ビューが別のクエリハンドラーを実装しており、おそらく_views_plugin_query_(デフォルトでは変更コードを提供しない)を実装しているため、適切なプラグインクエリハンドラー(aクエリクラス)、代わりに使用しているフックを確認します。

使用中のプラグインを見つける。

方法1:ビューが既にエクスポートされている場合は、_base_table_名と、そのテーブルを処理しているモジュールを確認します。 _search_api__の場合は、検索APIモジュールです。

方法2:_views/includes/view.inc_を編集し、クエリalter:$this->query->alter($this);を実行するコードを見つけ、_$this->query_オブジェクトをダンプして、そのビューに使用されているクラスを確認します。

次に、そのクラスとそのalter()メソッドを見つけて、その実装方法を確認します。

以下にいくつかの例を示します。

ビュー(_class views_plugin_query_default extends views_plugin_query_):

_function alter(&$view) {
  foreach (module_implements('views_query_alter') as $module) {
    $function = $module . '_views_query_alter';
    $function($view, $this);
  }
} 
_

検索API(_class SearchApiViewsQuery extends views_plugin_query_):

_public function alter(&$view) {
  parent::alter($view);
  drupal_alter('search_api_views_query', $view, $this);
}
_

YQLビュー(_class yql_views_query_plugin_query_yql extends views_plugin_query_):

_function alter(&$view) {
  foreach (module_implements('yql_views_query_query_alter') as $module) {
    $function = $module . '_yql_views_query_query_alter';
    $function($view, $this);
  }
}
_

ご覧のとおり、ビューの種類ごとに異なるフックを使用する必要があります。

特定のケースでは、_collection_products_ビューはSearch APIによって処理されるため、代わりに_hook_search_api_views_query_alter_を定義する必要があります。

3
kenorb