web-dev-qa-db-ja.com

hook_preprocess_nodeで作成された変数はテンプレートでは使用できません

私のテーマにはこの前処理機能があります:

function hotness_preprocess_node(&$vars) {
  $node = empty($vars['node']) ? FALSE : $vars['node'];
  $vars['hotness_is_article_page'] = ($node && node_is_page($node) && $node->type == 'spot') ? TRUE : FALSE;
}

私がここで行う他の機能(図には示されていません)は問題なく動作します。ただし、テーマのtplファイル(具体的にはregion--branding.tpl.php)で$ hotness_is_article_pageを使用しようとすると、未定義のエラーが発生します。それが問題なら、私はオメガを使っています。

何らかの理由で、hotness_preprocess()関数のtplファイルでアクセス可能な変数を作成できるだけで、ページまたはノードのフックは作成できないようです。 hotness_preprocess()はページのロードごとに数回実行されるため、これは理想的ではありません。

何が悪いのですか?

2
Justin

hook_preprocess_node()から追加された変数は、node.tpl.php、またはDrupalが選択する他のノードテンプレートで使用できます。これは、_$variables['theme_hook_suggestions']_に提案が含まれているためです。 (Drupal 7)、または_$variables['template_files']_(Drupal 6)。

リージョンテンプレートファイルで使用される変数を追加するには、hook_preprocess_region()またはhook_preprocess()のような別の前処理関数を使用する必要があります。後者は一般的な前処理関数です。その前処理関数に渡される2番目のパラメーターは、どのテーマフックが前処理されるかを示します。

つまり、デフォルトでは、領域前処理関数は_$variables['node']_にアクセスできません。表示されているページに関連付けられているノードオブジェクトにアクセスする場合は、存在する場合は、 template_preprocess_page() で使用されている同様のコードを使用し、次の行をプリプロセス関数に追加する必要があります。

_if ($node = menu_get_object()) {
  $variables['node'] = $node;
}
_

ページがノードに関連付けられていない場合、関数はFALSEを返します。これは、たとえば、ユーザーがexample.com/user/1にアクセスしている場合に発生する可能性があります。

6
kiamlaluno