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


20

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

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

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


決して使用alterform.views.incしませんでしたが、モジュール内に含める/要求する必要があり、 それをしなかった可能性はありますか?
nonsenz

私は私のalterform・モジュール・ファイルにalterform.views.incを入れている
enjoylife

モジュール内にalterform.views.incを含める/要求する方法は?ありがとう
-enjoylife

回答:


22

右。モジュール内のビューで何かを「実行」するには、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を前提としています。これらがあなたの武器ではないかどうかを尋ねるのが一番です。


これは正常に動作します:)
カリダサン

4

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

  • キャッシュをクリアする
  • ダウンロードして使用可能にDevelのを
  • dpm()代わりに使用するecho()
  • でテスト$view->nameするdpm()

キャッシュをクリアし、$ view-> nameをエコーし​​ます。ただし、ビューブロック内のビュー名に関する出力はまだありません。
enjoylife

変だ。私は通常、エコーに依存しません...あなたのコードに小さなエラーがあることに気付いたところで、「貼り付けエラー」ではない「}」がありますか?
マヌー

しかし、print_r($ views)を実行しても、ビューブロックにはtitに関する出力がまだありません。
enjoylife

print_r($ views)は、print_r($ view)yes以外は何も印刷しません。スイッチの前にこれを置きましたか?
マヌー

3

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


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

あるべき

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

1

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

    'path' => drupal_get_path('module', 'mymodule') . '/subdirectory/';
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.