html前処理関数からページ前処理関数に変数を渡しますか?


10

カスタムテーマhook_preprocess_page()hook_preprocess_html()関数では、同じ情報を特定する必要があることがよくあります。基本的に同じifステートメントが両方のIDで同じ情報を確認して実行するのではなく、両方で一度だけ実行してから、その情報を他の前処理関数に渡す方がはるかに理にかなっています。これどうやってするの?私は以下を試しましたが、うまくいきませんでした:

function myTheme_preprocess_page(&$vars){
    $vars['myValue'] = 7;
}

function myTheme_preprocess_html(&$vars){
    //$vars['myValue'] should equal 7...
}

私は他の方法でも試しました(preprocess html関数で値を設定してから、ページのpreprocess関数で取得しました)が、どちらも機能しませんでした。これは関連する質問を持ち出します。これらの前処理関数はどのような順序で処理されますか?ページの前処理機能がHTMLの前にあるように思えますが、それは正しいですか?

回答:


14

これを実現するには、globalまたはstatic変数が必要になります...個人的にはstatic、次のようなDrupalの静的パターンを使用して汎用ヘルパー関数を実装することをお勧めします。

function _myTheme_var($var_name, $new_val = NULL) {
  $vars = &drupal_static(__FUNCTION__, array());

  // If a new value has been passed
  if ($new_val) {
    $vars[$var_name] = $new_val;
  }

  return isset($vars[$var_name]) ? $vars[$var_name] : NULL;
}

function myTheme_preprocess_page(&$vars){
  $vars['some_var'] = _myTheme_var('my_var', 7); // Set the value and retrieve it
}

function myTheme_preprocess_html(&$vars){
  $vars['some_var'] = _myTheme_var('my_var'); // Get the value
}

$vars各プリプロセス関数の配列はメモリ内で完全に異なるオブジェクトであるため、その配列を使用して物事を渡すことはできません。この種のパターンがDrupalコアで頻繁に使用されるのを見たので、それが最善の方法だと思います。

編集

ああ、はい、hook_preprocess_page()前に呼び出されhook_preprocess_html()ます...私が知っている限り、Drupalは一種の「裏返し」の方法で動作するためhook_preprocess_html()、おそらくページビルドで実行される最後の方法になります。


3

私はこれを行うことにより、「ノード」と「ページ」の同様のケースでこれを達成しました:

function mymodule_preprocess_node(&$vars) {
  _mymodule_preprocess_vars($vars,'node');
}

function mymodule_preprocess_page(&$vars) {
  _mymodule_preprocess_vars($vars,'page');
}

function _mymodule_preprocess_vars(&$vars, $where) {

  // all vars common to both node and page set here

  switch($where) {

    case 'node':

      // node only vars set here;

      break;

    case 'page':

      // page only vars set here;

      break;
  }
}

そのため、代わりに「ページ」と「html」でも同様に機能すると思います。


はい、それでうまくいきます。しかし、なんらかの処理を必要とする$ varsはその処理を複数回実行するため、あまり効率的ではありません。
maxedison 2012年

true、変数をいくつかの複雑なsqlの結果に設定するなど、プリプロセス関数間で共通して重いものである場合、はい、おそらくそれを複数回実行したくないでしょうが、それstatic は最初の回答のようないくつかの処理で簡単に解決されます。また、メイン関数からの呼び出しで初めて、すべての変数セットの関数呼び出しのオーバーヘッドがないため、軽量設定は実際には高速になる可能性があります。そして明らかに、主要な部分(ノードとページ)は一度だけ設定されます。
ジマジャマ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.