Как вставить HTML непосредственно перед закрывающим тегом тела?


8

Я ищу лучший способ вставить произвольный HTML-контент на страницу перед закрывающим тегом body, аналогично тому, как drupal_add_js()JavaScript добавляет в конец страницы.

Я пришел из Wordpress, и в Wordpress это можно было сделать с помощью wp_footer()хука.

Я изучал использование hook_page_alter(), но мне было интересно, был ли это правильный способ сделать это или есть лучший способ выполнить эту задачу.


1
Время от времени появляются подобные вопросы, подобные этому, и я всегда задаюсь вопросом, почему необходимо «вставлять HTML непосредственно перед тегом body». Мне кажется, что вы подходите к тому, что делаете неправильно?
Летарион

1
Я не могу сказать, почему другие хотят это делать, но в моем случае я добавляю шаблоны Underscore JS на страницу для блоков, которые в них нуждаются. Однако несколько блоков могут использовать один шаблон, поэтому я хотел добавить все шаблоны внизу страницы, чтобы я мог легко видеть, были ли они загружены или нет. Для меня это в основном эстетика / удобство.
drebabels

Извините, если я медленно, но это не имеет смысла для меня? С преимуществами #attached для кэширования / агрегации / и т.д. , которые можно использовать не только для форм, я до сих пор не понимаю, почему.
Летарион

Я не знал об универсальности #attached, поэтому спасибо, что представил его мне. Однако в моем случае я записываю содержимое этих файлов шаблонов на страницу (не просто ссылаюсь на файлы), поэтому исправьте меня, если я ошибаюсь, но я не думаю, что преимущества кеша / агрегации #attached в этом случае потому что фактическое кэширование страниц позаботится об этом.
drebabels

Ответы:


23

Эквивалентом hook_footer (), который использовался в Drupal 6, является реализация hook_page_build () и изменение содержимого с $page['page_bottom']использованием кода, подобного следующему:

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

Содержимое $page['page_bottom']выводится из html.tpl.php с использованием следующего кода:

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

Значение $page_bottomинициализируется из template_process_html () с использованием следующего кода:

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

Разница между hook_page_alter () и hook_page_build()заключается в том, что hook_page_alter()она выполняется после hook_page_build()и должна использоваться для изменения или удаления контента, добавленного другим модулем, а hook_page_build()также для добавления нового контента на страницу.


Спасибо за этот ответ. Это очень полезно.
drebabels
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.