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()
が起動していますが、なぜそのビューが表示されないのですか?
明確にするために:ビュー/ページの表示は適切にレンダリングされます。
私は この問題 を見て、それが当てはまるかどうか疑問に思います。
クエリを変更する別の方法はありますか?
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
_を定義する必要があります。