Principales fonctionnalités de la librairie Phalcon-JQuery (hors JQuery UI et Twitter Bootstrap)
Pour Bootsrap, voir Bootstrap
Click sur un bouton d'id #btn :
public function clickAction(){
$this->click("#btn","console.log('click sur #btn');");
$this->query->compile($this->view);
}
Vue associée :
<input type="button" value="Test click" id="btn">
{{script_foot}}
Exemple : appui sur une touche, récupération du code de la touche frappée et de l'id de l'élément ayant généré l'évènement.
public function clickAction(){
$this->jquery->keydown("#btn","console.log('code de touche appuyée :' + event.which + ' sur #' + $(this).attr('id'));");
$this->jquery->compile($this->view);
}
Exemple : affichage/masquage d'un élément sur changement de la valeur d'une checkbox :
public function checkedAction(){
$this->jquery->change("#ck",$this->jquery->toggle("#fs","$(this).checked()"));
$this->jquery->compile($this->view);
}
Vue associée :
<input type="checkbox" id="ck" checked>
<fieldset id="fs">
<legend>Elément à afficher/masquer</legend>
</fieldset>
{{script_foot}}
| Méthode | Evènement |
|---|---|
| blur(selector,callback) | Sur perte du focus par l'élément désigné par selector |
| change(selector,callback) | Sur changement de valeur d'un input, select ou textarea (déclenché généralement sur perte focus) |
| click(selector,callback) | Sur click de l'élément désigné par selector |
| dblclick(selector,callback) | Sur double-click de l'élément désigné par selector |
| error(selector,callback) | Sur erreur de chargement sur selector |
| focus(selector,callback) | Sur réception du focus par l'élément désigné par selector |
| hover(selector,callback) | Sur déplacement de la souris au dessus de l'élément désigné par selector |
| keydown(selector,callback) | Sur touche clavier enfoncée lorsque l'élément désigné par selector a le focus |
| keypress(selector,callback) | Sur touche clavier enfoncée lorsque l'élément désigné par selector a le focus |
| keyup(selector,callback) | Sur touche clavier relachée lorsque l'élément désigné par selector a le focus |
| load(selector,callback) | Sur chargement de l'élément désigné par selector |
| mousedown(selector,callback) | Sur bouton souris enfoncé lorsque l'élément désigné par selector |
| mouseout(selector,callback) | Sur sortie de la souris de l“élément désigné par selector |
| mouseover(selector,callback) | Sur passage souris au dessus de l'élément désigné par selector |
| mouseup(selector,callback) | Sur bouton souris relaché lorsque l'élément désigné par selector |
| ready(callback) | Sur chargement du document terminé |
| scroll(selector,callback) | Sur défilement dans/sur l'élément désigné par selector |
| trigger(selector,event) | Déclenche l'évènement event sur l'élément désigné par selector |
| unload(selector,callback) | Sur déchargement de l'élément désigné par selector |
Pour les évènements inconnus de JQuery ou ne disposant pas de méthode associée dans la librairie phalcon-jquery, on utilise les méthodes :
Sur dropdown (event bootstrap) du bouton, un message est affiché dans les logs de la console
public function dropdownAction(){
...
$this->jquery->execOn("show.bs.dropdown","#btnDropdown","console.log('Dropdown is visible');");
...
}
Sur dropdown (event bootstrap) du bouton, un message est affiché dans l'élément #divMessage
public function dropdownAction(){
...
$this->jquery->doJqueryOn("show.bs.dropdown","#btnDropdown","#divMessage","html","Dropdown is visible");
...
}
Il s'agit des requêtes dont l'exécution n'est pas différée (non associée à un évènement par exemple).
Les requêtes immédiates peuvent permettre le chargement d'une page en cascade : élément par élément.
Exemple : Chargement de exemple/getResponse dans la div #divResponse
public function getAction(){
$this->jquery->get("exemple/getResponse","#divResponse");
echo "<div id='divResponse'>Chargement...</div>";
echo $this->jquery->compile();
}
public function getResponseAction(){
echo "Chargement terminé";
$this->view->disable();
}
Exemple : Post de valeurs vers exemple/postResponse dans la div #divPostResponse
public function postAction(){
$this->jquery->post("exemple/postResponse","#divPostResponse","{nom:'DOE',prenom:'John'}");
echo "<div id='divPostResponse'>Chargement...</div>";
echo $this->jquery->compile();
}
public function postResponseAction(){
var_dump($_POST);
$this->view->disable();
}
Les requêtes JSON permettent d'alimenter en données une vue, à partir d'un retour d'objet JSON par le serveur.
Exemple : Le get JSON vers la page exemple/jsonResponse alimente tous les éléments DOM nom et prenom avec l'élément JSON retourné.
public function jsonAction(){
$this->jquery->json("exemple/jsonResponse");
echo "<div id='nom'>Chargement...</div>";
echo "<input type='text' id='prenom' value='chargement...'>";
echo $this->jquery->compile();
}
public function jsonResponseAction(){
echo '{"nom":"DOE","prenom":"John"}';
$this->view->disable();
}
A partir de la version : commit du 23-03-2015
Il peut être également intéressant de réceptionner des données JSON sous forme de tableau, et d'afficher ces données dans une vue, en utilisant un mask (présent dans la page) :
public function jsonArrayAction(){
$this->jquery->jsonArray("#mask","exemple/jsonArrayResponse");
echo $this->jquery->compile();
}
La vue contenant le mask :
Les éléments à remplacer dans le mask doivent comporter l'attribut data-id, dont le contenu doit correpondre aux données du tableau JSON.
<div id='mask' style='display: none'><button data-id='nom' class='btn btn-primary'>Chargement...</button> <input type='text' data-id='prenom' value='chargement...' class='form-control'></div>
Une réponse JSON pour tester :
public function jsonArrayResponseAction(){
echo '[{"nom":"DOE","prenom":"John"},{"nom":"SMITH","prenom":"Robert"},{"nom":"GATES","prenom":"Bill"}]';
$this->view->disable();
}
Le résultat :
on utilise jsonArrayDeferred, puisque la requête doit attendre le click du bouton
public function jsonArray2Action(){
$btn=$this->jquery->bootstrap()->htmlButton("bt1","Get JsonArray",CssRef::CSS_PRIMARY,$this->jquery->jsonArrayDeferred("#mask","exemple/jsonArrayResponse"));
echo $btn->compile($this->jquery);
echo "<div id='mask' style='display:none'><button data-id='nom' class='btn btn-primary'>Chargement...</button> ";
echo "<input type='text' data-id='prenom' value='chargement...' class='form-control'></div>";
echo $this->jquery->compile();
}
Le contrôleur :
public function jsonArray3Action(){
$btn=$this->jquery->bootstrap()->htmlButton("bt1","Get JsonArray",CssRef::CSS_PRIMARY);
$btn->onClick($this->jquery->jsonArrayDeferred("#my","exemple/jsonArrayResponse"));
$this->jquery->compile($this->view);
}
La vue associée :
{{q["bt1"]}}
<fieldset>
<legend>Résultat du JsonArray</legend>
<div id='my' style='display:none'><button data-id='nom' class='btn btn-primary'>Chargement...</button>
<input type='text' data-id='prenom' value='chargement...' class='form-control'></div>
</fieldset>
{{script_foot}}
On souhaite maintenant que le retour JSON puisse modifier de multiples valeurs présentes dans le mask html :
Soit le masque suivant, défini dans la vue :
Nous souhaitons modifier les valeurs des progressbars Bootstrap avec les valeurs pb et style de notre JSON : il faut dans ce cas préciser inclure dans le masque les membres [[pb]] et [[style]] aux endroits souhaités.
{{q["bt1"]}}
{{q["bt1"]}}
<fieldset>
<legend>Résultat du JsonArray</legend>
<div id='my' style='display:none'><button data-id='nom' class='btn btn-primary'>Chargement...</button>
<input type='text' data-id='prenom' value='chargement...' class='form-control'>
<div class="progress">
<div class="progress-bar progress-bar[[style]]" role="progressbar" aria-valuenow="[[pb]]" aria-valuemin="0" aria-valuemax="100" style="width: [[pb]]%;">
[[pb]]%
</div>
</div>
</div>
</fieldset>
{{script_foot}}
Retour JSON :
public function jsonArrayResponseAction(){
echo '[{"nom":"DOE","prenom":"John","pb":40,"style":"success"},
{"nom":"SMITH","prenom":"Robert","pb":10,"style":"info"},
{"nom":"GATES","prenom":"Bill","pb":98,"style":"danger"}]';
$this->view->disable();
}
Le Contrôleur ne change pas :
public function jsonArray2Action(){
$btn=$this->jquery->bootstrap()->htmlButton("bt1","Get JsonArray",CssRef::CSS_PRIMARY);
$btn->onClick($this->jquery->jsonArrayDeferred("#my","exemple/jsonArrayResponse"));
$this->jquery->compile($this->view);
}
Résultat
Pour faire plus court, les exemples suivants ne comportent pas de vues, et les éléments HTML sont directement produits dans le contrôleur (à éviter…)
Permet d'associer l'exécution d'un Get à un évènement déclenché sur un élément :
Exemple : Sur click du bouton #btnGet, on veut effectuer un get vers exemple/getResponse, et afficher le résultat dans la div #divResponse.
public function getAction(){
$this->jquery->getOn("click","#btn","testsbs/getResponse","#divResponse");
echo "<input type='button' id='btn' value='doGet'>";
echo "<div id='divResponse'>En attente de click...</div>";
echo $this->jquery->compile();
}
public function getResponseAction(){
echo "Chargement terminé";
$this->view->disable();
}
Permet d'associer le post d'un formulaire à un évènement déclenché sur un élément :
Exemple : Sur click du bouton #btnPost, on veut poster le formulaire frmLogin vers exemple/postResponse, et afficher le résultat dans la div #divResponse.
public function postResponseAction(){
var_dump($_POST);
$this->view->disable();
}
public function postFormAction(){
$this->jquery->postForOn("click","#btn","testsbs/postResponse","frmLogin","#divPostResponse");
echo "<form id='frmLogin' name='frmLogin' onsubmit='return false;'><input type='text' name='login' placeholder='Login...'>
<input type='password' name='password' placeholder='password...'></form>";
echo "<input type='button' id='btnPost' value='doPost'>";
echo "<div id='divPostResponse'>Avant validation</div>";
echo $this->jquery->compile();
}
Il est également possible d'utiliser :
| Méthode | Rôle |
|---|---|
| postOn(event,element,url[,params,responseElement]) | Post les paramètres params vers url sur l'event produit sur element |
Ou de combiner les méthodes différées avec les méthodes évènementielles :
public function getAction(){
$this->jquery->click("#btn",$this->jquery->getDeferred("testsbs/getResponse","#divResponse"));
echo "<input type='button' id='btn' value='doGet'>";
echo "<div id='divResponse'>En attente de click...</div>";
echo $this->jquery->compile();
}
| Méthode | Rôle |
|---|---|
| append(to,element) | ajoute l'élément DOM element à la fin de chaque élément désigné par to |
| prepend(to,element) | ajoute l'élément DOM element au début de chaque élément désigné par to |
| attr(selector,attributeName [,value,immediatly]) | Lit/modifie l'attribut attributeName des éléments correspondant à selector |
| html(selector[,value,immediatly]) | Lit le contenu html / Affecte value au contenu html des éléments correspondant à selector |
| Méthode | Rôle |
|---|---|
| show(selector[,speed,callback]) | Affiche le ou les éléments DOM correspondant au selecteur selector |
| hide(selector[,speed,callback]) | Masque le ou les éléments DOM correspondant au selecteur selector |
| fadeIn(selector[,speed,callback]) | Effectue une transition sur le ou les éléments DOM correspondant au selecteur selector pour le(s) rendre opaque |
| fadeOut(selector[,speed,callback]) | Effectue une transition sur le ou les éléments DOM correspondant au selecteur selector pour le(s) rendre transparent |
| toggle(selector) | Affiche/masque le ou les éléments DOM correspondant au selecteur selector |
| animate(selector[,params,speed,extra]) | Effectue une animation sur le ou les éléments DOM correspondant au selecteur selector |
| addClass(selector,class[,immediatly]) | Ajoute la classe class sur les éléments DOM correspondant au selecteur selector |
| toggleClass(selector,class[,immediatly]) | Ajoute/supprime la classe class sur le ou les éléments DOM correspondant au selecteur selector |