web-dev-qa-db-ja.com

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

hook_views_query_alter() のドキュメントで報告されている内容に従って、alterform.views.incという名前のファイルを作成し、alterformという有効なモジュールに入れました。 alterform.views.inc。に次のコードを追加しましたが、機能しません。

function alterform_views_query_alter(&$view, &$query) {
  switch($view->name) {
    case 'myViewName':  
      echo 'test test'; // test       
      $query->orderby[0] = "FIELD(node.type, 'story', 'page', 'productTypeC', 'productTypeD') ASC";
      $query->orderby[1] = "node_title ASC";
      break;
  }
}

なぜ「テストテスト」を出力しないのですか?私のコードの何が問題になっていますか?

テストとビューの出力はまだありません。私のコードの何が問題になっていますか?ありがとうございました

20
enjoylife

正しい。モジュール内のビューで何かを「実行」するには、hook_views_apiを実装する必要があります。これがなければ、あなたのモジュールはビューによってまったく認識されません(AFAIK)。

以下をモジュールコードに追加してください:

_/**
 * Implementation of hook_views_api().
 */
function alterform_views_api() { // your module name into hook_views_api
  return array(
    'api' => 2,
    // might not need the line below, but in any case, the last arg is the name of your module
    'path' => drupal_get_path('module', 'alterform'),
  );
}
_

これで修正され、モジュールが少なくとも認識され、デバッグを開始できます:)

ビューのデバッグを開始する良い方法(つまり、ベビーステップ)は、実装しているビュー関数の先頭にdpm($view);を置くことです。ほとんどの場合、それはあなたがどこにいるのかを知るのに役立つ情報を画面にダンプします。 devel.moduleをインストール/オンにしてこれを行うことをお勧めします。

編集:これはビュー2とDrupal 6.を想定しています。これらがあなたの選択した武器ではないかどうか周りに尋ねるのが最善です。

22
NikLP

3つのことをテストできます。

  • キャッシュをクリアします
  • ダウンロードして有効化 Devel
  • dpm()の代わりにecho()を使用します
  • dpm()で_$view->name_をテストする
4
Manu

Yourmodule.views.incファイルをサブディレクトリ内ではなく、モジュールディレクトリに配置する必要があります。そうしないと、ビューが自動的にそれを取得できません。

3
shaneonabike
    $query->orderby[0] = "FIELD(node.type, 'story', 'page', 'productTypeC', 'productTypeD') ASC";

する必要があります

    $query->orderby[0]['field'] = "field_name ASC";
2
tan

yourmodule.views.incのディレクトリを使用している場合は、次のようなコードを使用して、モジュールファイルでそのパスを指定する必要があります。

    'path' => drupal_get_path('module', 'mymodule') . '/subdirectory/';
1
tan