Jak wstawić HTML tuż przed tagiem zamykającym ciało?

8

Szukam najlepszego sposobu wstawienia dowolnej zawartości HTML na stronę przed tagiem zamykającym ciało, podobnie jak w przypadku drupal_add_js()dodawania JavaScript na dole strony.

Pochodzę z tła Wordpress, a w Wordpress można to osiągnąć za pomocą wp_footer()haka.

Zastanawiałem się nad użyciem hook_page_alter(), ale zastanawiałem się, czy to był właściwy sposób na zrobienie tego, czy też jest lepszy sposób na wykonanie tego zadania.

drebabels
źródło
1
Podobne pytania pojawiają się od czasu do czasu i zawsze zastanawiam się, dlaczego konieczne jest „wstawienie HTML tuż przed tagiem body”. Wydaje mi się, że podchodzisz do tego, co robisz w niewłaściwy sposób?
Letharion
1
Nie mogę powiedzieć, dlaczego inni chcą to zrobić, ale w moim przypadku dodam do strony szablony Underscore JS dla bloków, które ich wymagają. Jednak wiele bloków może wykorzystywać jeden szablon, więc chciałem dodać wszystkie szablony na dole strony, aby łatwo sprawdzić, czy zostały załadowane, czy nie. Dla mnie jest to w zasadzie kwestia estetyki / wygody.
drebabels
Przepraszam, jeśli jestem wolny, ale to nie ma dla mnie sensu? Z zaletami pamięci podręcznej / agregacji / itp. #Attached , których można używać w więcej niż formularzach, nadal nie rozumiem, dlaczego.
Letharion
Nie byłem świadomy wszechstronności #attached, więc dziękuję za zapoznanie się z nim. Jednak w moim przypadku piszę zawartość tych plików szablonów na stronie (nie tylko linki do plików), więc popraw mnie, jeśli się mylę, ale nie sądzę, aby w tym przypadku korzyści związane z pamięcią podręczną / agregacją ponieważ zajmie się tym faktyczne buforowanie strony.
drebabels

Odpowiedzi:

23

Odpowiednikiem hook_footer (), który został użyty w Drupal 6, jest zaimplementowanie hook_page_build () i zmiana treści za $page['page_bottom']pomocą kodu podobnego do następującego:

function mymodule_page_build(&$page) {
  $page['page_bottom']['devel'] = array(
    '#weight' => 25, 
    '#markup' => '<div style="clear:both;">' . devel_query_table() . '</div>',
  );
}

Treść $page['page_bottom']jest wyprowadzana z html.tpl.php , przy użyciu następującego kodu:

  <?php print $page_top; ?>
  <?php print $page; ?>
  <?php print $page_bottom; ?>
</body>
</html>

Wartość $page_bottomjest inicjowana z template_process_html () przy użyciu następującego kodu:

  // Render page_top and page_bottom into top level variables.
  $variables['page_top'] = drupal_render($variables['page']['page_top']);
  $variables['page_bottom'] = drupal_render($variables['page']['page_bottom']);
  // Place the rendered HTML for the page body into a top level variable.
  $variables['page'] = $variables['page']['#children'];
  $variables['page_bottom'] .= drupal_get_js('footer');

Różnica między hook_page_alter () i hook_page_build()polega na tym, że hook_page_alter()jest wykonywana po hook_page_build()i powinna zostać użyta do zmiany lub usunięcia treści dodanej przez inny moduł, podczas gdy hook_page_build()powinna zostać użyta do dodania nowej treści do strony.

kiamlaluno
źródło
Dziękuję za przekroczenie tej odpowiedzi. To jest bardzo pomocne.
drebabels