Разница между hook_page_alter и preprocess_page?

10

Я не совсем понимаю, когда мне следует использовать hook_page_alter (& $ page) или template_preprocess_page (& $ vars, $ hook) в Drupal 7.

Какую наилучшую практику использовать в template.php?

Спасибо

gagarine
источник

Ответы:

16

Разница в их предназначении.

hook_page_build () и hook_page_alter () используются для удаления, изменения или добавления элементов на уровне страницы.
Переданный в массив $ page hook_page_alter()содержит элементы верхнего уровня для каждой области блока. По умолчанию они следующие:

  • page_top
  • заголовок
  • sidebar_first
  • содержание
  • sidebar_second
  • page_bottom

Примером реализации может быть следующий:

function mymodule_page_alter(&$page) {
  // Add help text to the user login block.
  $page['sidebar_first']['user_login']['help'] = array(
    '#weight' => -10, 
    '#markup' => t('To post comments or add new content, you first have to log in.'),
  );
}

Функции предварительной обработки вызываются для изменения переменных, которые передаются в файл шаблона. Они не могут изменить структуру страницы, но они могут изменить содержимое некоторых элементов страницы, изменив содержимое этих переменных.
Например, модуль «Наложение» удаляет основные вкладки, когда визуализируемая страница является наложением.

function overlay_preprocess_page(&$variables) {
  if (overlay_get_mode() == 'child') {
    unset($variables['tabs']['#primary']);
  }
}
киамлалуно
источник
1
Но с помощью ловушки preprocess_page я могу изменить структуру страницы, изменив содержимое внутри $ vars ['page']. Я использую это, потому что мне было трудно получить nid с hook_page_alter для страницы узла.
gagarine
2
Вы можете получить nid для страницы узла, используя menu_get_object ()
andrewmacpherson