1

Drupalで非常に奇妙な問題が発生しています。特定のタイプのノードを表示した場合にgotoを実行するカスタムモジュールがあります(以下のコードを参照)。問題は、しばらくすると、datafile_flow_node_viewが無限に呼び出される無限ループに陥ることです(すべてのページで発生し、CTを含まないページでも発生します)。

最も興味深い部分は(私はどこでも検索を使用していませんが)、表示モードがsearch_indexであることです。検索モジュールを無効にすると、問題は解消されます。モジュールを再実行すると、問題はしばらくの間解消され、その後再発します(いつ、なぜかはわかりません)。

なぜこれが起こるのか、誰かが光を当てることができますか?

function datafile_flow_node_view($node, $view_mode, $langcode) {
  if ($node->type == 'datafile') {
    drupal_goto('node/' . $node->nid . '/edit');
  }
}

@EDITは、cronの実行中に発生するようです。cron中にhook_node_viewsが実行されないようにする方法はありますか?

4

1 に答える 1

1

hook_user_view()cronタスク中に実行されるのを回避する方法はありませんが、hook_node_view()が呼び出されたときにユーザーを別のURLにリダイレクトして、検索インデックスの作成に使用されるノードコンテンツを構築することを回避できます。

function mymodule_node_view($node, $view_mode, $langcode) {
  if ($view_mode != 'search_result') {
    if ($node->type == 'datafile') {
      drupal_goto('node/' . $node->nid . '/edit');
    }
  }
}

一般的に言って、drupal_goto()内部を呼び出すことは悪い考えhook_node_view()です; フックは$node->content、ユーザーをリダイレクトするのではなく、変更することになっています。

何が起こるかです:

  • cronタスク中に、検索モジュールはそのインデックスを更新します
  • Nodeモジュールは検索インデックスを更新し、この呼び出しを行うために、表示したものを含む、のnode_view()実装を呼び出します。hook_node_view()
  • drupal_goto()cronタスク中に呼び出されるように、Drupalには問題があります

ユーザーがノードを表示しているときに呼び出される仮定hook_node_view()は正しくありません。ユーザーがノードを表示していると確信できるのは、node /%nodeのページコールバックが呼び出されたときだけです。

できることは、次のようなコードを実装することです。(私はそれを行う正しい方法を示すためだけに簡略化されたコードを書いています。)

function datafile_flow_menu_alter(&$items) {
  if (isset($items['node/%node'])) {
    $items['node/%node']['page callback'] = 'datafile_flow_node_view';
  }
}

function datafile_flow_node_view($node) {
  if ($node->type == 'datafile') {
    drupal_goto('node/' . $node->nid . '/edit');
  }

  return node_page_view($node);
}

node_page_view()ページコールバックが(Drupalで使用されるデフォルト)であり、モジュールがそれを変更していないことを前提としているため、コードは単純化されています。それについて何も仮定しないコードと、そのページのコールバックから使用される引数を書くことは可能です。(これは読者の練習問題として残されています。;)

参考文献

于 2012-12-18T14:42:14.040 に答える