Charger script externe dans dans Drupal 6
-
01-10-2019 - |
Question
Je veux charger un script externe dans <head>
. Il est spécifique le module, donc je veux que mon module prendre soin du chargement.
Dans Drupal 6, la fonction drupal_add_js()
ne permet pas d'ajouter un externe script dans <head>
. Il sera disponible dans Drupal 7 passant l'argument "external"
à la fonction. Dans D6, je peux utiliser drupal_set_html_head()
à la place, mais il insère le les données figurant dans le début de la <head>
que je ne veux pas. Je voudrais ajouter des données dans ce .
Il est avéré que drupal_html_set_head()
ajoute des données.
$stored_head .= $data ."\n";
Alors le comportement que j'expérimenté - les données ont été insérées dans le début des données de tête -. Devraient provenir de cet appel, je drupal_html_set_head()
dans la fonction hook_init()
de mon module
Comment puis-je ajouter des données à tout et <head>
?
La solution
La valeur par défaut page.tpl.php (vous pouvez le trouver dans /modules/system/page.tpl.php est la suivante:
<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>
Lorsque vous faites drupal_set_html_head()
il est des choses à $head
Annexer des variables, mais il y a des variables plus jointes que vous voyez.
Une des solutions possibles consiste à ajouter les choses que vous voulez $scripts
, au lieu de $head
.
Comment?
avec une fonction de pré-traitement de votre module:
function MYMODULE_preprocess_page(&$variables) {
$variables['scripts'] .= $your_stuff;
}
Je n'ai pas essayé cette solution, mais si ne fonctionne pas est peut-être parce que l'ordre d'exécution. Essayez de mettre plus de poids de votre module, il courra après le system_preprocess_page
.
Autre raison pour laquelle ne peut pas fonctionner parce que le thème est l'impression des variables dans un ordre différent dans page.tpl.php . Mais vous ne pouvez pas contrôler ce à partir du code d'un module.
Autres conseils
Il existe plusieurs solutions pour contourner le problème.
- utilisation hook_footer () pour ajouter les js au pied de page
- faire un petit script jquery, ce qui crée l'élément
<script>
et l'ajoute à<head>
- le faire avec une fonction de pré-traitement de modèle
- faire votre propre page.tpl.php
Drupal utilise l'opérateur .=
pour créer la variable $head
. Le $js
et $css
est maintenu dans un tableau, et vous permet d'être re-orderd.
$head
est une chaîne, et ne peut pas être re-orderd, othern puis par laides, hacks sujettes à l'erreur. Tels que des explosions d'expressions régulières, réordonnancement et implosion.
$heads = preg_explode("\n", $head);
ksort($heads);
$head = implode("\n", $heads);
dans le pré-processeur variable votre thème.
Avez-vous vu cette commentaire ?
Attention lorsque vous utilisez cette option pour définir un appel de fichier js externe D6, par exemple:
drupal_set_html_head ( '');
Si vous ne pas inclure une balise de fermeture de script complet (ie), il sera briser dans Firefox (et éventuellement d'autres navigateurs, les WebKit semblent bien). La balise ne parviendra pas à fermer, et efface tous les autres en-têtes jusqu'à la prochaine balise disponible. Cela se traduit généralement par tous vos fichiers CSS à la charge, à défaut ainsi que le fichier js suivant entièrement balisé. Donc utiliser ce formulaire à la place:
drupal_set_html_head ( '');
Ceci est valable jusqu'au Drupal 6.16. Vous pouvez surmonter dans D7 avec la nouvelle option externe drupal_add_js.