par stloje » 02 Nov 2009 à 16:07
La bibliothèque « prototype-1.6.0.3.js » se trouve dans le répertoire « html\prototype » du serveur Domino. Cela m’évite de créer une bibliothèque JavaScript dans chacune des bases Notes.
Je fais appel à cette bibliothèque à partir du « contenu de titre HTML » du masque à l’aide de la commande suivante :
<b>"‹script language=\"JavaScript\" type=\"text/javascript\" src=\"/prototype/prototype-1.6.0.3.js\"› ‹/script›"</b>
J’utilise aussi la bibliothèque LightBox pour afficher mes élements. Si tu le désires, je ferai un nouveau Post consacrée à cette bibliothèque.
<b>Fonctions utilitaire Prototype</b>
Il y en a uniquement une qui sera utilisée dans cet exemple
<b>$(‘id’)</b> : cette fonction est la concaténation de la commande JS « document.getElementById (‘id’) »
<i>Voici deux exemples d’utilisation d’Ajax</i>
<b>Exemple avec « get »</b>
A partir d’un bouton, sur l’événement « OnClick », je fais appel à une fonction JS.
<b>onClick="collapse_extendCPVille ('AjaxVilleCP', '3', 'cp', 'C')</b>
La fonction suivante se trouve dans une bibliothèque JS
/*
cette fonction permet de rechercher les codes postaux et villes en Ajax sur plusieurs niveaux (catégories)
entrée :
agentName : nom de l'agent Notes pour obtenir l'information
id : l'identifiant de départ de la ligne
view : le nom de la vue pour la recherche
categorie : clé de recherche
*/
function collapse_extendCPVille (agentName, id, view, categorie){
//on recherche la ligne de départ pour insérer de nouvelles cellules dans le tableau
var tblRow = $('cell' + id + '.1').parentNode;
//est-ce que cette ligne a déjà été chargée?
if ($(id).loaded != "1"){
//on utilise la bibliothèque prototype-1.6.0.3.js pour requêter en Ajax
//chargement du detail
new Ajax.Request ("../" + agentName + "?OpenAgent&" + view + "&" + categorie, {
method: 'get',
onLoading: function () {lightbox.prototype.displayWaitBox ('block');},
onSuccess: function(transport) {
lightbox.prototype.displayWaitBox ('none');
var newLevel = transport.responseJSON;
//on vérifie si on est sur le second ou troisième niveau
if (categorie.split ("^").length < 2) {
//on est sur le niveau 2
addLevel2CPVille (newLevel, tblRow, agentName, id, view, categorie);
}
else {
//on est sur le niveau 3
addLevel3CPVille (newLevel, tblRow, id, categorie);
}
}
});
$(id).loaded = 1;
$('b' + id).src = '../btnMinus.gif';
}
else{
showHideElements (id);
}
}
Ce qui est important à retenir c’est la partie concernant <b>Ajax</b>. Plusieurs options peuvent être rattachés à la classe Ajax
<b>new Ajax.Request (URL, {options});</b>
Cette méthode initialise et procède à une requête Ajax. Dans l’exemple plus haut, les paramètres sont fournis à même l’URL : "../" + agentName + "?OpenAgent&" + view + "&" + categorie
<i>Les options utilisées sont les suivantes :</i>
<b>method</b> : get : indique au serveur qu’on veut recevoir uniquement des données ;
<b>onLoading: function () {}</b> : indique à Ajax les instructions à compléter avant l’envoi de la requête au serveur; utile pour faire afficher une fenêtre d’attente à l’utilisateur ;
<b>onSuccess: function(transport) {}</b> : indique à Ajax les instructions à exécuter lorsque la requête a réussis. Le paramètre <b>Transport</b> est un objet de la méthode Ajax.Response. C’est lui qui contient le résultat provenant de la requête.
<b>Exemple avec « post »</b>
Je vais reprendre le même exemple que celui en haut, mais cette fois-ci ce sera en <b>post</b>.
/*
cette fonction permet de rechercher les codes postaux et villes en Ajax sur plusieurs niveaux (catégories)
entrée :
agentName : nom de l'agent Notes pour obtenir l'information
id : l'identifiant de départ de la ligne
view : le nom de la vue pour la recherche
categorie : clé de recherche
*/
function collapse_extendCPVille (agentName, id, view, categorie){
//on recherche la ligne de départ pour insérer de nouvelles cellules dans le tableau
var tblRow = $('cell' + id + '.1').parentNode;
//est-ce que cette ligne a déjà été chargée?
if ($(id).loaded != "1"){
//on utilise la bibliothèque prototype-1.6.0.3.js pour requêter en Ajax
//chargement du detail
new Ajax.Request ("../" + agentName + "?OpenAgent", {
method: 'post',
postBody: view + "&" + categorie,
onLoading: function () {lightbox.prototype.displayWaitBox ('block');},
onSuccess: function(transport) {
lightbox.prototype.displayWaitBox ('none');
var newLevel = transport.responseJSON;
//on vérifie si on est sur le second ou troisième niveau
if (categorie.split ("^").length < 2) {
//on est sur le niveau 2
addLevel2CPVille (newLevel, tblRow, agentName, id, view, categorie);
}
else {
//on est sur le niveau 3
addLevel3CPVille (newLevel, tblRow, id, categorie);
}
}
});
$(id).loaded = 1;
$('b' + id).src = '../btnMinus.gif';
}
else{
showHideElements (id);
}
}
<i>Les options utilisées sont les suivantes :</i>
<b>method</b> : post : indique au serveur qu’on envoi et qu’on recoit des données ;
<b>postBody</b> : c’est par cette option qu’on passe les paramètres au serveur. Les paramètres envoyés ici sont identiques à ceux envoyés dans l’URL de l’exemple précédent. A noter que le champ qui récupère ces valeurs sur le serveur Notes est <b>REQUEST_CONTENT</b>
<b>onLoading: function () {}</b> : idem à l’exemple précédent ;
<b>onSuccess: function(transport) {}</b> : idem à l’exemple précédent ;