Wie füge ich HTML kurz vor dem Body Closing Tag ein?

8

Ich suche nach der besten Möglichkeit, beliebigen HTML-Inhalt vor dem schließenden Body-Tag in eine Seite einzufügen, ähnlich wie drupal_add_js()JavaScript am Ende einer Seite hinzugefügt wird.

Ich komme aus einem Wordpress-Hintergrund, und in Wordpress könnte dies mithilfe des wp_footer()Hooks erreicht werden.

Ich habe mich mit der Verwendung befasst hook_page_alter(), aber ich habe mich gefragt, ob dies der richtige Weg ist oder ob es einen besseren Weg gibt, diese Aufgabe zu erfüllen.

drebabels
quelle
1
Ähnliche Fragen wie diese tauchen ab und zu auf, und ich frage mich immer, warum es notwendig ist, "HTML direkt vor dem Body-Tag einzufügen". Mir scheint, Sie nähern sich dem, was Sie falsch machen?
Letharion
1
Ich kann nicht darüber sprechen, warum andere dies tun möchten, aber in meinem Fall füge ich der Seite Unterstrich-JS-Vorlagen für Blöcke hinzu, für die sie erforderlich sind. Da jedoch mehrere Blöcke eine Vorlage verwenden können, wollte ich alle Vorlagen am Ende der Seite hinzufügen, damit ich leicht sehen kann, ob sie geladen wurden oder nicht. Für mich ist es im Grunde eine Sache der Ästhetik / Bequemlichkeit.
Drebabels
Tut mir leid, wenn ich langsam bin, aber das macht für mich keinen Sinn? Mit den Cache / Aggregation / etc-Vorteilen von #attached , die nicht nur für Formulare verwendet werden können, verstehe ich das Warum immer noch nicht.
Letharion
Ich war mir der Vielseitigkeit von #attached nicht bewusst. Vielen Dank, dass Sie es mir vorgestellt haben. In meinem Fall schreibe ich jedoch den Inhalt dieser Vorlagendateien auf die Seite (nicht nur auf die Dateien verlinken). Korrigieren Sie mich also, wenn ich falsch liege, aber ich glaube nicht, dass die Cache- / Aggregationsvorteile von #attached matter in diesem Fall sind weil das eigentliche Seiten-Caching sich darum kümmert.
Drebabels

Antworten:

23

Das Äquivalent von hook_footer () , das in Drupal 6 verwendet wurde, besteht darin, hook_page_build () zu implementieren und den Inhalt von zu ändern $page['page_bottom'], indem Code verwendet wird, der dem folgenden ähnlich ist:

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

Der Inhalt von $page['page_bottom']wird aus html.tpl.php unter Verwendung des folgenden Codes ausgegeben :

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

Der Wert von $page_bottomwird aus template_process_html () mit dem folgenden Code initialisiert :

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

Der Unterschied zwischen hook_page_alter () und hook_page_build()besteht darin, dass er hook_page_alter()ausgeführt wird hook_page_build()und zum Ändern oder Entfernen von Inhalten verwendet werden sollte, die von einem anderen Modul hinzugefügt wurden, während hook_page_build()zum Hinzufügen neuer Inhalte zur Seite verwendet werden sollte.

kiamlaluno
quelle
Vielen Dank, dass Sie mit dieser Antwort weit darüber hinaus gegangen sind. Das ist sehr hilfreich.
Drebabels