Comment insérer du HTML juste avant la balise de fermeture du corps?

8

Je recherche le meilleur moyen d'insérer du contenu HTML arbitraire dans une page avant la balise de fermeture, similaire à la façon dont drupal_add_js()JavaScript est ajouté au bas d'une page.

Je viens d'un milieu Wordpress, et dans Wordpress, cela pourrait être accompli en utilisant le wp_footer()crochet.

J'ai cherché à utiliser hook_page_alter(), mais je me demandais si c'était la bonne façon de le faire ou s'il y avait une meilleure façon d'accomplir cette tâche.

drebabels
la source
1
Des questions similaires comme celle-ci apparaissent de temps en temps, et je me demande toujours pourquoi , est-il nécessaire «d'insérer du HTML juste avant la balise body». Il me semble que vous vous approchez de tout ce que vous faites de la mauvaise façon?
Letharion
1
Je ne peux pas expliquer pourquoi les autres veulent le faire, mais dans mon cas, j'ajoute des modèles Underscore JS à la page pour les blocs qui en ont besoin. Cependant, plusieurs blocs peuvent utiliser un modèle, donc je voulais ajouter tous les modèles au bas de la page afin que je puisse facilement voir s'ils avaient été chargés ou non. Pour moi, c'est essentiellement une chose esthétique / pratique.
drebabels
Désolé si je suis lent, mais cela n'a pas de sens pour moi? Avec les avantages de cache / agrégation / etc de #attached , qui peuvent être utilisés sur plus de formulaires, je ne comprends toujours pas pourquoi.
Letharion
Je n'étais pas au courant de la polyvalence de #attached, alors merci de me le présenter. Cependant, dans mon cas, j'écris le contenu de ces fichiers de modèle sur la page (pas seulement un lien vers les fichiers), alors corrigez-moi si je me trompe, mais je ne pense pas que les avantages du cache / agrégation de la matière #attached dans ce cas parce que la mise en cache de page réelle s'en occupera.
drebabels

Réponses:

23

L'équivalent de hook_footer () qui était utilisé dans Drupal 6 est d'implémenter hook_page_build () et de modifier le contenu de $page['page_bottom'], en utilisant un code similaire au suivant:

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

Le contenu de $page['page_bottom']est généré depuis html.tpl.php , à l'aide du code suivant:

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

La valeur de $page_bottomest initialisée à partir de template_process_html () à l'aide du code suivant:

  // 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');

La différence entre hook_page_alter () et hook_page_build()est celle qui hook_page_alter()est exécutée après hook_page_build()et qui doit être utilisée pour modifier ou supprimer le contenu ajouté par un autre module, alors qu'elle hook_page_build()doit être utilisée pour ajouter du nouveau contenu à la page.

kiamlaluno
la source
Merci d'être allé au-delà de cette réponse. C'est très utile.
drebabels