Różnica między hook_page_alter i preprocess_page?

10

Nie do końca rozumiem, kiedy powinienem użyć hook_page_alter (& $ page) lub template_preprocess_page (& $ vars, $ hook) w Drupal 7.

Jakie są najlepsze praktyki w tym zakresie w template.php?

Dzięki

gagarine
źródło

Odpowiedzi:

16

Różnica polega na ich celu.

hook_page_build () i hook_page_alter () służą do usuwania, modyfikowania lub dodawania elementów na poziomie strony.
Tablica $ page przekazana do hook_page_alter()zawiera elementy najwyższego poziomu dla każdego regionu bloku. Domyślnie są to następujące:

  • page_top
  • nagłówek
  • sidebar_first
  • zadowolony
  • sidebar_second
  • page_bottom

Przykładem wdrożenia może być następujący:

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

Funkcje preprocesu są wywoływane w celu zmiany zmiennych przekazywanych do pliku szablonu. Nie mogą zmieniać struktury strony, ale mogą zmieniać zawartość niektórych elementów strony, zmieniając zawartość tych zmiennych.
Na przykład moduł Nakładka usuwa zakładki podstawowe, gdy wizualizowana strona jest nakładką.

function overlay_preprocess_page(&$variables) {
  if (overlay_get_mode() == 'child') {
    unset($variables['tabs']['#primary']);
  }
}
kiamlaluno
źródło
1
Ale dzięki hook preprocess_page mogę zmienić strukturę strony, zmieniając rzeczy w $ vars ['page']. Używam tego, ponieważ ciężko mi było uzyskać identyfikator z hook_page_alter dla strony węzła.
gagarine
2
Możesz uzyskać nid dla strony węzła za pomocą menu_get_object ()
andrewmacpherson