Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour TLM,
Je débute et pour prendre les bonnes habitudes je me demandais s'il y avait une recommandation pour intégrer du code javascript dans un layout.
Pour l'instant je mets directement le code suivant dans mon layout.phtml :
<script type="text/javascript">
window.addEvent('domready', function(){
SexyLightbox = new SexyLightBox({color:'white', dir: 'images/sexyimages'});
});
</script>
Est-ce qu'il faut utiliser le headScript comme pour les fichiers JS inclus ?
Faut-il mettre tout ça ailleurs ? (j'ai vu que certains parlaient de mettre ça dans des views...mais je débute débute, donc je vois pas trop comment ça s'articule tout ça).
@+ Samy.
Dernière modification par goldenboy68 (10-04-2010 01:10:23)
Hors ligne
les scripts js vont soit dans les balises head, soit dans le pied de page de ton site.
Tu peux le faire avec headscript() mais pense à le faire afficher à l'un de ces 2 endroits.
Headscript() te permet d'appeler les scripts seulement là où t'en as besoin. Si tu le met directement dans ton layout (comme actuellement) sa te le mettra pour chaque page. A toi de voir
Hors ligne
Ok, c'est un peu mon problème : il est conseillé de mettre les scripts dans le head (d'où l'insertion dans le layout), par contre si je mets le même code dans une view, ça marchera aussi mais ça ne sera pas inclus dans le head.
@+
Hors ligne
Salut golgenboy, voici ce que je fais:
Layout:
<head> <?php echo $this->headScript(); echo $this->headLink(); ?> </head>
Controlleur ou autre:
$script=" jQuery(function() { jQuery('#cropbox').Jcrop({ onSelect: showCoords, onChange: showCoords, boxWidth: 450, bgColor: 'black', bgOpacity: .4, setSelect: [ 100, 0, 50, 50 ], aspectRatio: ".$ratioW." / ".$ratioH ." }); }); "; $this->view->headScript()->appendScript($script);
Bon, copié ici l'indentation est bizarre.
Dernière modification par probitaille (25-03-2010 03:15:03)
Hors ligne
c'est aussi une solution que je préconise, elle deviens juste redondante quand elle doit être présente dans plusieurs actions/controllers.
Hors ligne
à cela s'ajoute quelle grève les perfs
pour ma part je ne mets aucun JS dans le php
car le code javascript ainsi généré est rechargé et recompilé par l'interprète javascript à chaque appel.
la solution est très simple
mettre le code dans un fichier js et le lier AUX pages qui l'utilise.
pour les partie variables comme ici le ratio utiliser des variables JS positionnée dans un objet JS global.
jQuery(function() { jQuery('#cropbox').Jcrop({ onSelect: showCoords, onChange: showCoords, boxWidth: 450, bgColor: 'black', bgOpacity: .4, setSelect: [ 100, 0, 50, 50 ], aspectRatio: App.params.ratioW / App.params.ratioH }); });
le sous ensemble params de l'objet App contient le paramètre de l'application.
si ces paramètre son propre à un sous objet on peu définir le niveau hiérarchique de son choix pour éviter de mélanger les choses.
quant à passer les param de php à JS j'utilise JS soit en Ajax si mon application est basé sur ce mode soit dans la page comme le propose probitaille
$script="App=" . Zend_Json_Encode($Params); $this->view->headScript()->appendScript($script);
du coup mon script est chargé et compilé une fois au premier usage et seuls les paramètres sont transmis à chaque fois.
A+JYT
Hors ligne
Merci pour toutes ces réponses !
La dernière réponse était peut-être de trop Jusqu'avant je suivais plus ou moins...quand ça part dans des sous-ensembles j'ai cru repartir en cours de Maths !
Vais essayer de mettre tout ça en pratique maintenant !
@+
Hors ligne
pour faire simple si tu place ton javascript dans du php comme ça
<script type="text/javascript"> window.addEvent('domready', function(){ SexyLightbox = new SexyLightBox({color:'white', dir: 'images/<?php echo $aImage; ?>'}); }); </script>
tu vas avoir une difficulté c'est de mettre ce code dans plusieurs pages
mais tu vas surtout avoir une contre performance car à chaque fois qu'un utilisateur chargera une page contenant ce code tu vas généré de nouveau ce javascript.
du coté de ton navigateur qui dit nouveau script dit nouveau chargement, nouvelle compilation (les navigateurs utilisent aujourd'hui un compilateur JIT pour le javascript) puis l'exécution du code.
la solution mettre ton code dans un fichier js statique et faire
<script type="text/javascript" src="SexyLightBox.js"></script>
tu as alors un seul chargement et une seule compilation du script par le navigateur.
mais si tu fais ça tu te retrouve avec un pb la partie qui variait en fonction du php dans mon exemple
'images/<?php echo $aImage; ?>'
ne peu plus exister puis le script est statique
pour résoudre ce PB tu définis un objet global en javascript qui va porter les valeurs des paramètre que tu veux modifier en php
ton script dans ton fichier js devient
<script type="text/javascript"> window.addEvent('domready', function(){ SexyLightbox = new SexyLightBox({color:'white', dir: 'images/' + App.ligthBoxImage}); }); </script>
dans tes pages tu mets
<?php $params = Zend_Json_Encode(array('ligthBoxImage' => $aImage)); ?> <script type="text/javascript">App=<?php echo $params; ?></script> <script type="text/javascript" src="SexyLightBox.js"></script>
de cette façon tu as des paramètres qui varient avec le php tu peux donc faire passer les valeurs de ton choix à javascript et tu as aussi les avantage de la compilation unique de tes scripts.
J'utilise cette approche à grande échelle 26 000 lignes de javascript 30 000 lignes de php dans une application.
le tout est particulièrement réactif.
A+JYT
Hors ligne
C'est déjà beaucoup plus clair quand ça reprend un exemple dont j'ai besoin
Pour la partie Zend et optimisation c'est compris, reste la variable globale JS avec cette histoire de "sous-ensemble) :
Dans ton dernier exemple tu mets :
"App.ligthBoxImage" avec $params = Zend_Json_Encode(array('ligthBoxImage' => $aImage));
Dans ton premier exemple tu utilises :
"App.params.ratioW", je suppose que c'est un tableau à 2 dimensions alors ?
...et si j'ai bien tout compris et pour être bien "Zend Attitude", au lieu de mettre les balises <script></script> dans mes fichiers je devrais utiliser le headScript()->appendFile('SexyLightBox.js') ?
@+!
Hors ligne
exactement
Hors ligne
Bon, alors j'ai mis le temps avant de faire les tests encore une fois et presque tout fonctionne dans cette mise en pratique !
Reste un souci que je n'ai pas su solutionner : en utilisant Zend_Json_Encode() j'ai une "Erreur Fatale" :
Fatal error: Call to undefined function Zend_Json_Encode()
...et en remplaçant avec "json_encode()" ça marche nickel.
Une idée pour résoudre ce problème pour que je puisse utiliser Zend_Json_Encode ?
Hors ligne
Voilà comme d'hab on trouve pas d'où ça vient pendant 2 jours et juste après avoir poster la question on trouve la réponse !!
Donc le problème c'était la fonction qui a priori s'utilise de cette façon : Zend_Json::encode()
Tout fonctionne dans mon head, j'suis super content...vais pouvoir passer au body de ma page !
Hors ligne
Pages: 1