Diferença entre hook_page_alter e preprocess_page?

10

Eu não entendo completamente quando devo usar hook_page_alter (& $ page) ou template_preprocess_page (& $ vars, $ hook) no Drupal 7.

Quais são as melhores práticas para usar no template.php?

obrigado

Gagarine
fonte

Respostas:

16

A diferença é o seu propósito.

hook_page_build () e hook_page_alter () são usados ​​para remover, alterar ou adicionar elementos no nível da página.
A matriz $ page transmitida para hook_page_alter()contém os elementos de nível superior para cada região de bloco. Por padrão, eles são os seguintes:

  • page_top
  • cabeçalho
  • sidebar_first
  • conteúdo
  • sidebar_second
  • page_bottom

Um exemplo de implementação pode ser o seguinte:

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.'),
  );
}

As funções de pré-processo são chamadas para alterar as variáveis ​​que são passadas para o arquivo de modelo. Eles não podem alterar a estrutura da página, mas podem alterar o conteúdo de alguns elementos da página, alterando o conteúdo dessas variáveis.
Por exemplo, o módulo Sobreposição remove as guias principais quando a página que está sendo visualizada é a sobreposição.

function overlay_preprocess_page(&$variables) {
  if (overlay_get_mode() == 'child') {
    unset($variables['tabs']['#primary']);
  }
}
kiamlaluno
fonte
1
Mas com o hook preprocess_page eu posso mudar a estrutura da página mudando coisas dentro de $ vars ['page']. Eu uso isso porque tive dificuldade em obter o nid com hook_page_alter para a página do nó.
Gagarine
2
Você pode obter nid para uma página de nó usando menu_get_object ()
andrewmacpherson