Depuis le début le support de CakePHP pour Javascript a été
orienté vers Prototype/Scriptaculous (librairie JavaScript).
Tandis que nous continuons de penser qu’il s’agit d’excellentes
bibliothèques Javascript, il a été demandé à la communauté de
supporter d’autres librairies. Plutôt que d’enlever Prototype en faveur
d’une autre librairie JavaScript. Nous avons créé un adaptateur fonctionnant
sur le principe d’un Helper et avons inclu 3 des librairies les plus demandées.
Prototype/scriptaculous, Mootools/Mootools-more, et jQuery/jQueryUI.
Bien que l’API n’est pas aussi vaste que le Helper Ajax, nous
pensons que la solution basée sur l’adaptateur permet une solution
plus extensible offrant aux développeurs la puissance et la
flexibilité dont ils ont besoin pour répondre à leurs besoins spécifiques.
Les moteurs Javascript forment l’épine dorsale du nouveau Helper Js.
Un moteur JavaScript traduit un élément Javascript abstrait dans
un code JavaScript concret spécifique à la librairie en cours
d’utilisation. De plus ils créent un système extensible à utiliser
pour les autres.
Utilisation d’un moteur Javascript spécifique
Avant tout, téléchargez votre librairie JavaScript préférée et placez la
dans app/webroot/js
.
Puis, vous devez inclure la librairie dans votre page. Pour l’inclure
dans toutes les pages, ajoutez cette ligne dans la section <head>
de app/View/Layouts/default.ctp
:
echo $this->Html->script('jquery'); // Inclut la librairie Jquery
Remplacez jquery
par le nom de votre fichier de librairie (.js sera
ajouté au nom).
Par défaut les scripts sont mis en cache, et vous devez explicitement
imprimer le cache. Pour faire cela à la fin de chacune des pages, incluez
cette ligne juste avant la balise de fin de </body>
:
echo $this->Js->writeBuffer(); // Écrit les scripts en mémoire cache
Attention
Vous devez inclure la librairie dans votre page et afficher le cache
pour que le helper fonctionne.
La selection du moteur Javascript est déclarée quand vous incluez le
helper dans votre controller
public $helpers = array('Js' => array('Jquery'));
La partie ci-dessus utilise le moteur Jquery dans les instances
du Helper Js dans vos vues. Si vous ne déclarez pas un moteur
spécifique, le moteur Jquery sera utilisé par défaut. Comme il est
mentionné ci-dessus, il y a trois moteurs implémentés dans le noyau,
mais nous encourageons la communauté à étendre la compatibilité
des librairies.
Utilisation de jQuery avec d’autres librairies
La librairie jQuery, et virtuellement tous ses plugins sont limités
au sein de l’espace jQuery. Comme règle générale, les objets
« globaux » sont stockés dans l’espace JQuery, ainsi vous ne devriez
pas avoir de clash entre Jquery et d’autre librairies
(comme Prototype, MooTools, ou YUI).
Ceci dit, il y a une mise en garde:
Par défaut, jQuery utilise « $ » comme raccourci de « jQuery »
Pour redéfinir le raccourci « $ », utilisez la variable jQueryObject:
$this->Js->JqueryEngine->jQueryObject = '$j';
echo $this->Html->scriptBlock(
'var $j = jQuery.noConflict();',
array('inline' => false)
);
// Demande à jQuery de se placer dans un mode noconflict
Utilisation du Helper Js dans des helpers personnalisés
Déclarez le Helper Js dans le tableau $helpers
de votre
Helper personnalisé:
public $helpers = array('Js');
Note
Il n’est pas possible de déclarer le moteur JavaScript dans un
Helper personnalisé. Ceci n’aurait aucun effet.
Si vous êtes prêt à utiliser un moteur JavaScript autre que celui
par défaut, faîtes le paramétrage du Helper dans votre controller
comme ceci:
public $helpers = array(
'Js' => array('Prototype'),
'CustomHelper'
);
Avertissement
Assurez-vous de déclarer le Helper Js et son moteur en haut
du tableau $helpers
dans votre controller.
Le moteur JavaScript séléctionné peut disparaître (remplacé par celui par
défaut) de l’objet JsHelper dans votre helper, si vous oubliez de faire cela
et vous obtiendrez du code qui ne correspond pas à votre librairie JavaScript.
Utilisation du moteur Javascript
Le JsHelper
fournit quelques méthodes, et agit comme une façade pour
le moteur helper. Vous ne devriez pas accéder au moteur helper excepté dans
de rares occasions. Utilisez les fonctionnalités de façade du Helper Js
vous permet de tirer parti de la mise en mémoire tampon et de la méthode
caractéristique de chaînage intégré; (le chaînage de méthode ne fonctionne que
dans PHP5).
Par défaut le Helper Js
bufferise presque tous les codes du script
générés, ce qui vous permet de récupérer les scripts partout
dans la vue, les éléments et les mises en page, et de les ressortir
à un endroit. La Récupération des scripts bufferisés est réalisé
avec $this->Js->writeBuffer();
ceci retournera le contenu
du buffer dans une balise script. Vous pouvez désactiver le
buffering généralisé avec la propriété $bufferScripts
ou en
définissant buffer => false
dans les méthodes qui prennent
des $options
.
Étant donné que la plupart des méthodes en Javascript commencent
avec une sélection d’éléments dans le DOM, $this->Js->get()
retourne un $this, vous permettent d’enchaîner les méthodes en
utilisant la selection. Le chaînage de méthode vous permet
d’écrire moins, et de rendre votre code plus expressif .
$this->Js->get('#foo')->event('click', $eventCode);
Est un exemple de chaînage de méthode. Le chaînage de méthode
n’est pas possible dans PHP4 et l’exemple ci-dessus devrait être
écrit comme:
$this->Js->get('#foo');
$this->Js->event('click', $eventCode);
Options communes
Dans le but de simplifier le développement et comme les librairies JavaScript
peuvent changer, un ensemble courant d’options est pris en charge par
JsHelper
, ces options courantes seront mappées en dehors des options
spécifiques de la librairies en interne. Si vous ne prévoyez pas la commutation
des librairies, chaque librairie supporte toutes les fonctions de callback
natives et les options.
Enveloppement de Callback
Par défaut, toutes les options de callback sont enveloppées dans une
fonction anonyme avec les bons arguments. Vous pouvez désactiver ce
comportement en fournissant wrapCallbacks = false
dans votre tableau
d’options.
Travailler avec des scripts bufferisés
Un inconvénient à la précédente implémentation des fonctionnalités de
type d’AJAX était la dispersion des balises de script partout dans
le document , et l’impossibilité de bufferiser les scripts ajoutés par
les éléments dans la mise en page. Le nouveau Helper Js si il est
utilisé correctement évite ces deux questions. Il est recommandé
de placer $this->Js->writeBuffer()
à la fin du fichier layout
au dessus la balise </body>
. Ceci permettra à tous les scripts
générés dans les éléments du layout d’être ressortis (output)
à un endroit. Il doit être noté que les scripts bufferisés sont gérés
séparément des scripts de fichiers inclus.
-
JsHelper::writeBuffer($options = array())
Écrit tous le codes Javascript générés jusqu’ici dans un bloc de code ou les
met en mémoire cache dans un fichier et retourne un script lié.
Options
inline
- Défini à true pour avoir la sortie des scripts dans
un bloc de script inline. si cache est aussi à true, une balise
de lien de script sera générée (par défaut à true)
cache
- Défini à true pour avoir les scripts dans un fichier
de la mémoire cache et s’y relié (false par défaut)
clear
- Défini à false pour éviter au fichier de cache d’être
effacé (true par défaut)
onDomReady
- enveloppe les scripts en mémoire cache
dans un evénement domready (par défaut à true)
safe
- si un block inline est généré il sera enveloppé
dans <![CDATA[ … ]]> (true par défaut)
La création d’un fichier de cache avec writeBuffer()
nécessite que
webroot/js
soit accessible en écriture et permette au navigateur de
placer dans le cache les ressources de script généré pour la page.
-
JsHelper::buffer($content)
Ajoute $content
au buffer de script interne.
-
JsHelper::getBuffer($clear = true)
Récupère le contenu du buffer courant. Passe false pour ne pas effacer le
buffer en même temps.
Bufferiser des méthodes qui ne sont normalement pas bufferisée
Quelques méthodes dans le Helper sont bufferisée par défaut.
Le moteur bufferise les méthodes suivantes par défaut:
event
sortable
drag
drop
slider
De plus vous pouvez forcer une autre méthode du Helper Js à utiliser
la mise en mémoire cache. En ajoutant un booléen à la fin des arguments
vous pouvez forcer d’autres méthodes d’aller en mémoire cache. Par
exemple la méthode each()
qui n’est normalement pas bufferisée:
$this->Js->each('alert("sapristi!");', true);
Ce qui est ci-dessus va forcer la méthode each()
à utiliser le buffer.
En revanche si vous souhaitez qu’une méthode bufferisée ne bufferise
plus, vous pouvez passer un false
comme le dernier argument:
$this->Js->event('click', 'alert("sapristi!");', false);
Ceci forcera la fonction event qui est normalement mis en mémoire cache
à retourner son résultat.