- 1
[Opened] De addJSLink
Posted by doms on 07/06/2007 03:04
Bonjour,
Je viens de m'arracher le peu de cheveux qu'il me reste sur le caillou à cause du problème suivant : l'ordre de chargement des librairies Javascript.
Jusqu'alors l'ensemble des librairies javascript étaient incluse au header HTML au moyen de plusieurs appels à addJSLink. Cela se faisait à un seul endroit, dans un plugin de template.
Ainsi je ne chargeai ces librairies javascript que lorsque nécessaire : dans ce cas un passage en mode administration du site.
Tout marche bien.
Une évolution nécessite l'appel d'une de ces librairies (jQuery pour ne pas la nommer) sur l'ensemble du site.
Je déplace donc le chargement de cette librairie du plugin de template vers la classe myHtmlResponse qui surcharge jResponseHtml. Et là plus aucun appel à des fonctions javascript ne fonctionne !
Après avoir cherché un moment en me disant qu'à 2h30 du mat' il s'agit sûrement d'une erreur de fatigue, je m'aperçois que dans le code HTML généré, l'appel à la librairie javascript déplacée (la fameuse jQuery) se trouve en dernière position. Après toutes les autres qui ont besoin d'elle !
D'où ma question : comment gérer l'ordre des appels des librairies javascript et, par extension des feuilles CSS ?
Voici mes bouts de code :
require_once (JELIX_LIB_RESPONSE_PATH.'jResponseHtml.class.php'); class myHtmlResponse extends jResponseHtml { public $bodyTpl = 'monApp~default'; // modifications communes aux actions utilisant cette reponses protected function _commonProcess(){ // ajout d'une feuille de styles $this->addCSSLink($GLOBALS['gJConfig']->urlengine['basePath'].'styles/global.css'); $this->addCSSLink($GLOBALS['gJConfig']->urlengine['basePath'].'styles/admin.css'); $this->addJSLink('js/jquery/jquery.js'); $this->addJSLink('js/jquery/jquery.dimensions.js'); $this->body->assignZone('entete','monApp~entete'); $this->body->assignZone('menu', 'monApp~menu'); $this->title = 'Mon application'; } }
et le plugin de template :
function jtpl_function_validationformulaire($tpl) { $rep = $GLOBALS['gJCoord']->response; $rep->addJSLink('js/jquery/cmxform.js'); $rep->addJSLink('js/jquery/jquery.metadata.js'); $rep->addJSLink('js/jquery/jquery.validate.js'); ...
et enfin le bout de code HTML généré correspondant :
<script type="text/javascript" src="js/jquery/cmxform.js" ></script> <script type="text/javascript" src="js/jquery/jquery.metadata.js" ></script> <script type="text/javascript" src="js/jquery/jquery.validate.js" ></script> <script type="text/javascript" src="js/jquery/jquery.js" ></script> <script type="text/javascript" src="js/jquery/jquery.dimensions.js" ></script>
Ai-je loupé un truc ? Dois-je moins veiller ? Ou bien s'agit-il d'un réel problème ?
[Opened] Re: De addJSLink
Posted by bballizlife on 07/06/2007 09:32
En fait l'ordre d'affichage des inclusions des fichiers JS se fait dans l'ordre d'appel des addJSLink().
Apparemment ce sont les appels depuis le plugin de template qui se font avant ceux contenus dans ta réponse myHtmlResponse. Assez embêtant je te l'accorde...
Je pense qu'il serait bien d'ouvrir un ticket pour qu'on change se comportement.
N'importe comment c'est dans la doc
[Opened] Re: De addJSLink
Posted by laurentj on 07/06/2007 09:49
comportement embetant, certes.
Maintenant, qui dit héritage de classe, dit possibilité de surcharger toutes les méthodes que tu veux pour en modifier le comportement ;-)
- 1