Загрузить внешний скрипт в <head>в Drupal 6 - PullRequest
2 голосов
/ 08 сентября 2010

Я хочу загрузить внешний скрипт в <head>.Это зависит от модуля, поэтому я хочу, чтобы мой модуль заботился о загрузке.

В Drupal 6 функция drupal_add_js() не позволяет добавлять внешний скрипт в <head>.Он будет доступен в Drupal 7 с передачей аргумента "external" в функцию. В D6 я могу использовать drupal_set_html_head() вместо этого, но он вставляет данные в начало <head>, что мне не нужно. Я хотел бы добавить в него данные .

Оказалось, что drupal_html_set_head() добавляет данные.

$stored_head .= $data ."\n";

Итак, поведение, которое я экспериментировал --данные были вставлены в начало данных заголовка - должны исходить из того, что я вызываю drupal_html_set_head() в функции hook_init() моего модуля.

Как я могу добавить данные к самому и <head>?

Ответы [ 4 ]

3 голосов
/ 13 сентября 2010

Значение по умолчанию page.tpl.php (его можно найти в / modules / system / page.tpl.php :

<head>
  <title><?php print $head_title; ?></title>
  <?php print $head; ?>
  <?php print $styles; ?>
  <?php print $scripts; ?>
  <script type="text/javascript"><?php /* Needed to avoid Flash of Unstyled Content in IE */ ?> </script>
</head>

Когда вы делаете drupal_set_html_head(), он добавляет материал к переменной $head, но, как вы видите, к нему добавляется больше переменных.

Одним из возможных решений является добавление материала, который вы хотите, к $scripts вместо $head.

Как?

с функцией предварительной обработки из вашего модуля:

function MYMODULE_preprocess_page(&$variables) {
    $variables['scripts'] .= $your_stuff;
}

Я не пробовал это решение, но если оно не работает, возможно, потому что порядок выполнения. Попробуйте установить вес вашего модуля выше, чтобы он работал после system_preprocess_page.

Другая причина, по которой может не работать, заключается в том, что тема печатает переменные в другом порядке в page.tpl.php . Но вы не можете контролировать это из кода модуля.

3 голосов
/ 08 сентября 2010

Существует несколько способов решения этой проблемы.

  • используйте hook_footer (), чтобы добавить js в нижний колонтитул
  • создайте небольшой скрипт jquery, который создает <script> элемент и добавляет его к <head>
  • сделать это с помощью функции предварительной обработки шаблона
  • сделать свой собственный page.tpl.php
2 голосов
/ 10 сентября 2010

Drupal использует оператор .= для создания переменной $head. $js и $css хранятся в массиве и позволяют вам изменить порядок. $head является строкой, и ее нельзя переупорядочить, за исключением уродливых, подверженных ошибкам хаков. Такие как взрывы регулярного выражения, переупорядочивание и взрыв.

$heads = preg_explode("\n", $head);
ksort($heads);
$head = implode("\n", $heads);

в пре-процессоре переменной вашей темы.

2 голосов
/ 08 сентября 2010

Вы видели этот комментарий ?

Будьте осторожны при использовании этого для установки внешнего вызова файла JS в D6, например:

drupal_set_html_head ( '');

Если вы не включите полный закрывающий тег скрипта (т.е.), он будет перерыв в Firefox (и, возможно, другие браузеры, кажется, основанные на webkit отлично). Тег не закроется и уничтожит все остальные заголовки до следующего доступного тега. Это обычно приводит ко всем не удается загрузить ваши CSS-файлы, а также следующий полностью помеченный JS-файл. Так используйте эту форму вместо:

drupal_set_html_head ( '');

Это применимо до Drupal 6.16 включительно. Вы можете преодолеть это в D7 с новой внешней опцией в drupal_add_js.

...