samedi, juillet 22, 2006

AJAX - Rico LiveGrid : personnalisation Lotus Notes

En utilisant Firebug, on peut constater que Rico envoie une requète AJAX sous le format : data.xml?openview&id=data_grid&page_size=70&offset=149&sort_col=titre1&sort_dir=ASC&_=. Il faut donc modifier le format de cette requète pour qu'elle prenne en compte les paramètres d'URL standard d'appel des vues Notes.

Pour rappel ces paramètres sont :
  • Start : pour définir la ligne de départ. C'est l'équivalent du offset. Attention, le offset commence à 0 alors que le Start commence à 1.
  • Count : nombre de ligne à afficher. C'est l'équivalent du page_size.
  • ResortDescending=xx ou ResortAscending=xx : pour forcer un tri décroissant ou croissant sur la colonne xx. C'est l'équivalent de &sort_col=titre1&sort_dir=ASC. Attention, Rico prend en compte le titre de la colonne alors que Notes attend le numéro de la colonne.
Pour plus d'informations sur le format d'URL de Domino, consulter la page "Domino URL cheat sheet" du site IBM Lotus.

Fonction prototype object.extend

Les paramètres de l'URL sont codés dans la fonction fetchBuffer de la classe RICO.LiveGrid dans le fichier rico.js. Ne souhaitant pas modifier le fichier rico.js j'ai préféré utiliser la fonction prototype Object.extend.
Object.extend permet de redéfinir la fonction fetchBuffer sans avoir à toucher au fichier rico.js.
Pour utiliser cette fonction avec Rico il faut pour le moment l'appliquer sur une instance de la classe. Ceci devrait être corrigé dans la prochaine version de prototype.

Dans la pratique celà va donner :
var PobreLiveGrid = new Rico.LiveGrid ("data_grid",18, 445,
"data.xml?openview", opts);
Object.extend(PobreLiveGrid, {
...
});
Personnalisation de RICO.LiveGrid pour Notes

Je copie le code de la fonction définie dans RICO est ne modifie que la définition de QueryString dans le cas d'un appel standard et dans le cas d'un appel avec un tri sur colonne.

Le code final est :
Object.extend(PobreLiveGrid, {
/**
* PobreLiveGrid : fetchBuffer
* LiveGrid pour IBM Lotus Notes/Domino
* -----------------------------------------------------------
* Modification de la création de l'URL d'appel de mise à jour
* des données de la table pour l'adapter aux URL de contrôle
* des vues Lotus Notes.
*
* page_size <=> count
* offset <=> start
* sortcol=x&sort_dir=ASC <=> ResortAscending=x
* sortcol=x&sort_dir=DESC <=> ResortDescending=x
*
* -----------------------------------------------------------
* Special thanks to Ross Lawley on Rico Forum
*
**/

fetchBuffer: function(offset) {
if ( this.buffer.isInRange(offset) &&
!this.buffer.isNearingLimit(offset)) {
return;
}
if (this.processingRequest) {
this.unprocessedRequest = new Rico.LiveGridRequest(offset);
return;
}

var bufferStartPos = this.buffer.getFetchOffset(offset);
this.processingRequest = new Rico.LiveGridRequest(offset);
this.processingRequest.bufferOffset = bufferStartPos;
var fetchSize = this.buffer.getFetchSize(offset);
var partialLoaded = false;

var queryString;
if (this.options.requestParameters)
queryString = this._createQueryString(this.options.requestParameters, 0);

queryString = (queryString == null) ? '' : queryString+'&';

queryString = queryString+'id='+this.tableId+'&Count='+
fetchSize+'&Start='+(bufferStartPos+1)+'&offset='+bufferStartPos;

if (this.sortCol) {
var sortNotes =
(this.sortDir=="ASC"?"ResortAscending":"ResortDescending");
queryString = queryString+'&'+sortNotes+'='+escape(this.sortCol);
}

this.ajaxOptions.parameters = queryString;

$(ajax_call).innerHTML = queryString;
ajaxEngine.sendRequest( this.tableId + '_request', this.ajaxOptions);

this.timeoutHandler = setTimeout( this.handleTimedOut.bind(this),
this.options.bufferTimeout);
}
})
J'ai gardé la références standard de Rico offset qui sert dans le code. Celà ne pose pas de problème à Lotus Notes qui ignore ce paramètre.
Reste tout de même un problème. Nous souhaitons récupérer le numéro de la colonne à trier et non son nom. Heaureusement LiveGrid offre une option de paraméttrage de la classe très interressante qui non seulement va permettre de règler ce dernier soucis mais en plus permet de restreindre le nombre de colonnes que l'on souhaite triable.

Il faut modifier la définition de opts comme ceci :
var opts = {
prefetchBuffer: false,
onscroll : updateHeader,
sortAscendImg: 'sort_asc.gif',
sortDescendImg: 'sort_desc.gif',
columns : [["1",true],["3",true],["5",true],["7",true],["9",true]]
};
Le paramètre columns : [["valeur de colonne",triable(vrai/faux)]] doit contenir toutes les références aux colonnes affichées. Il renvoi "valeur de colonne" comme identifiant de la colonne au lieu de son nom.

Il faut faire très attention car les numéros de colonnes affichées sur la page Web ne correspondent pas obligatoirement aux numéro de colonne de la vue Lotus Notes. Ainsi dans l'exemple présenté dans l'article précédent (AJAX - Rico LiveGrid pour représenter les vues Lotus Notes), une colonne sur deux permettait de définir les balises HTML qui sont par la suite interprétées.
Les colonnes contenant les valeurs, sont les colonnes impaires dans ce cas (1, 3, 5, 7, 9). C'est ce qu'il faudra renvoyer à Lotus Notes.

Pour voir le code complet, je vous invite à lire le code source de l'exemple en ligne Rico LiveGrid.

1 Commentaires:

Anonymous info@quintessens.com dit...

Sorry but I am unabel to succeed in downloading RICO.

Could you send it to me or a integrated example (.snf)

Nice to practice my french a little via your blog =)

KR Patrick Kwinten

vendredi, août 11, 2006 10:50:00 AM  

Enregistrer un commentaire

Lien vers ce message:

Créer un lien

<< Home

Rechercher sur ce blog
Effacer résultat