¿Diferencia entre hook_page_alter y preprocess_page?

10

No entiendo completamente cuándo debo usar hook_page_alter (& $ page) o template_preprocess_page (& $ vars, $ hook) en Drupal 7.

¿Cuáles son las mejores prácticas sobre eso para usar en template.php?

Gracias

gagarina
fuente

Respuestas:

16

La diferencia es su propósito.

hook_page_build () y hook_page_alter () se usan para eliminar, alterar o agregar elementos a nivel de página.
La matriz $ page pasada hook_page_alter()contiene los elementos de nivel superior para cada región de bloque. Por defecto son los siguientes:

  • page_top
  • encabezamiento
  • barra lateral_primero
  • contenido
  • barra lateral_segundo
  • page_bottom

Un ejemplo de implementación podría ser el siguiente:

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

Las funciones de preproceso se llaman para alterar las variables que se pasan al archivo de plantilla. No pueden cambiar la estructura de la página, pero pueden alterar el contenido de algunos elementos de la página cambiando el contenido de esas variables.
Por ejemplo, el módulo Superposición elimina las pestañas principales cuando la página que se visualiza es la superposición.

function overlay_preprocess_page(&$variables) {
  if (overlay_get_mode() == 'child') {
    unset($variables['tabs']['#primary']);
  }
}
kiamlaluno
fuente
1
Pero con hook preprocess_page puedo cambiar la estructura de la página cambiando cosas dentro de $ vars ['page']. Lo uso porque tuve dificultades para obtener el nid con hook_page_alter para la página de nodo.
Gagarine
2
Puede obtener nid para una página de nodo usando menu_get_object ()
andrewmacpherson