Como insiro o HTML antes da tag de fechamento do corpo?

8

Estou procurando a melhor maneira de inserir conteúdo HTML arbitrário em uma página antes da tag do corpo de fechamento, semelhante à maneira como drupal_add_js()adiciona JavaScript ao final da página.

Eu estou vindo de um fundo do Wordpress, e no Wordpress isso pode ser feito usando o wp_footer()gancho.

Eu olhei para o uso hook_page_alter(), mas queria saber se esta era a maneira correta de fazer isso ou se existe uma maneira melhor de realizar essa tarefa.

drebabels
fonte
11
Perguntas semelhantes como essa aparecem de vez em quando, e eu sempre me pergunto por que , é necessário "inserir HTML imediatamente antes da tag body". Parece-me que você está se aproximando do que está fazendo da maneira errada?
Letharion
11
Não posso falar por que outras pessoas querem fazer isso, mas, no meu caso, estou adicionando modelos de Underscore JS à página para blocos que os exijam. No entanto, vários blocos podem utilizar um modelo, então eu queria adicionar todos os modelos na parte inferior da página para poder ver facilmente se eles foram carregados ou não. Para mim, é basicamente uma questão de estética / conveniência.
precisa saber é
Desculpe se estou demorando, mas isso não faz sentido para mim? Com os benefícios de cache / agregação / etc do #attached , que podem ser usados ​​em mais de formulários, ainda não entendo o porquê.
Letharion
Eu não estava ciente da versatilidade do #attached, então obrigado por me apresentar. No entanto, no meu caso, estou escrevendo o conteúdo desses arquivos de modelo na página (não apenas vinculando-os), portanto, corrija-me se estiver errado, mas não acho que os benefícios de cache / agregação do #attached matter neste caso porque o cache da página real cuidará disso.
drebabels

Respostas:

23

O equivalente a hook_footer () usado no Drupal 6 é implementar hook_page_build () e alterar o conteúdo de $page['page_bottom'], usando um código semelhante ao seguinte:

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

O conteúdo de $page['page_bottom']é produzido a partir de html.tpl.php , usando o seguinte código:

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

O valor de $page_bottomé inicializado a partir de template_process_html () usando o seguinte código:

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

A diferença entre hook_page_alter () e hook_page_build()é hook_page_alter()executada após hook_page_build()e deve ser usada para alterar ou remover o conteúdo adicionado por outro módulo, enquanto hook_page_build()deve ser usada para adicionar novo conteúdo à página.

kiamlaluno
fonte
Obrigado por ir além e além com esta resposta. Isso é muito útil.
drebabels