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