Передати змінні з функції попередньої обробки HTML в функцію попередньої обробки сторінки?


10

У своїх спеціальних темах hook_preprocess_page()і hook_preprocess_html()функціях мені часто потрібно виявляти ту саму інформацію. Замість того, щоб запускати одне і те ж, якщо перевірка оператора в обох ідентифікує одну і ту ж інформацію, було б набагато більше сенсу просто зробити це один раз в обох і потім передати цю інформацію іншій функції попередньої обробки. Як я можу це зробити? Я спробував таке, але нічого не вийшло:

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

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

Я також спробував це навпаки (встановивши значення у html-функції попереднього оброблення, а потім отримавши його у функції попередньої обробки сторінки), але це не спрацювало. Звідси виникає пов'язане питання: в якому порядку ці функції попередньої обробки, е, обробляються? Мені здається, що функція попередньої обробки сторінки стоїть перед html - це правильно?

Відповіді:


14

Для цього вам знадобиться або переміна, globalабо staticзмінна ... особисто я рекомендую staticвиконати та реалізувати загальну функцію помічника, використовуючи статичну схему Друпала так:

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масивах для кожної функції Preprocess абсолютно різні об'єкти в пам'яті , так що ви не зможете використовувати цей масив , щоб передати речі навколо. Я бачив, як такий зразок багато використовувався в ядрі Drupal, тому я думаю, що це був би найкращий шлях.

EDIT

О так і так, 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;
  }
}

тож я думаю, що він буде працювати аналогічно замість 'page' та 'html'.


Так, це спрацювало б. Але це не дуже ефективно, тому що ті $ vars, які потребують певної обробки, проводили б цю обробку кілька разів.
maxedison

правда, якщо це щось важке між спільними функціями попередньої обробки, як, наприклад, встановлення змінної на якийсь складний результат sql, так, напевно, ви не хочете робити це кілька разів, але це легко вирішується за допомогою деякої static обробки, як перша відповідь. і налаштування легкої ваги може бути фактично швидше, оскільки у вас немає накладних викликів функцій для кожного набору змінних, лише вперше при виклику з головної функції. І очевидно, що основні частини (вузол і сторінка) встановлюються лише один раз.
Jimajamma
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.