it-swarm-ja.com

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

カスタムテーマの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の前にあるように思えますが、それは正しいですか?

10
maxedison

これを行うには、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()は、おそらくページビルドで実行される最後の方法です。

14
Clive

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

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」でも同様に機能すると思います。

3
Jimajamma