Différence entre hook_page_alter et preprocess_page?


10

Je ne comprends pas complètement quand je dois utiliser hook_page_alter (& $ page) ou template_preprocess_page (& $ vars, $ hook) dans Drupal 7.

Quelles sont les meilleures pratiques à ce sujet à utiliser dans template.php?

Merci

Réponses:


16

La différence est leur objectif.

hook_page_build () et hook_page_alter () sont utilisés pour supprimer, modifier ou ajouter des éléments au niveau de la page.
Le tableau $ page transmis à hook_page_alter()contient les éléments de niveau supérieur pour chaque région de bloc. Par défaut, ce sont les suivants:

  • page_top
  • entête
  • sidebar_first
  • contenu
  • sidebar_second
  • page_bottom

Un exemple de mise en œuvre pourrait être le suivant:

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

Les fonctions de prétraitement sont appelées pour modifier les variables transmises au fichier modèle. Ils ne peuvent pas modifier la structure de la page, mais ils peuvent modifier le contenu de certains éléments de la page en modifiant le contenu de ces variables.
Par exemple, le module Incrustation supprime les onglets principaux lorsque la page en cours de visualisation est l'incrustation.

function overlay_preprocess_page(&$variables) {
  if (overlay_get_mode() == 'child') {
    unset($variables['tabs']['#primary']);
  }
}

1
Mais avec hook preprocess_page, je peux changer la structure de la page en changeant des choses à l'intérieur de $ vars ['page']. J'utilise cela parce que j'ai eu du mal à obtenir le nid avec hook_page_alter pour la page de noeud.
gagarine

2
Vous pouvez obtenir un nid pour une page de nœud en utilisant menu_get_object ()
andrewmacpherson
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.