Come inserisco HTML appena prima del tag di chiusura del corpo?


8

Sto cercando il modo migliore per inserire contenuto HTML arbitrario in una pagina prima del tag body di chiusura, in modo simile al modo in cui drupal_add_js()aggiunge JavaScript alla fine di una pagina.

Vengo da uno sfondo di Wordpress, e in Wordpress questo potrebbe essere realizzato usando l' wp_footer()hook.

Ho esaminato l'utilizzo hook_page_alter(), ma mi chiedevo se questo era il modo corretto di fare questo o se esiste un modo migliore per eseguire questo compito.


1
Domande simili come questa si presentano ogni tanto, e mi chiedo sempre perché , è necessario "inserire HTML prima del tag body". Mi sembra che ti stai avvicinando a qualsiasi cosa tu stia facendo nel modo sbagliato?
Letharion,

1
Non posso parlare del motivo per cui altri vogliono farlo, ma nel mio caso sto aggiungendo modelli Underscore JS alla pagina per i blocchi che li richiedono. Tuttavia, più blocchi possono utilizzare un modello, quindi volevo aggiungere tutti i modelli nella parte inferiore della pagina in modo da poter vedere facilmente se erano stati caricati o meno. Per me è fondamentalmente una cosa estetica / convenienza.
Drebabels,

Scusa se sono lento, ma non ha senso per me? Con i vantaggi di #attached di cache / aggregation / etc , che possono essere utilizzati su più di moduli, non capisco ancora il perché.
Letharion,

Non ero a conoscenza della versatilità di #attached, quindi grazie per avermelo presentato. Tuttavia, nel mio caso, sto scrivendo il contenuto di quei file modello sulla pagina (non solo il collegamento ai file), quindi correggimi se sbaglio, ma in questo caso non penso che i vantaggi di cache / aggregazione di #attached matter perché la cache della pagina effettiva se ne occuperà.
Drebabels,

Risposte:


23

L'equivalente di hook_footer () utilizzato in Drupal 6 è implementare hook_page_build () e modificare il contenuto di $page['page_bottom'], usando un codice simile al seguente:

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

Il contenuto di $page['page_bottom']viene generato da html.tpl.php , utilizzando il seguente codice:

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

Il valore di $page_bottomè inizializzato da template_process_html () utilizzando il seguente codice:

  // 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 differenza tra hook_page_alter () ed hook_page_build()è che hook_page_alter()viene eseguita dopo hook_page_build()e deve essere utilizzata per modificare o rimuovere il contenuto aggiunto da un altro modulo, mentre hook_page_build()dovrebbe essere usato per aggiungere nuovo contenuto alla pagina.


Grazie per essere andato ben oltre con questa risposta. Questo è molto utile
Drebabels,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.