|
Après avoir passé des heures à m'arracher
les cheveux pour faire un site web avec domino, j'ai fini par
trouver deux/trois techniques qui peuvent simplifier grandement
la vie des devs web avec domino.
Un des points les plus casse-bonbon de domino est la présentation
web.
Ma solution consiste à se passer de domino pour la présentation
; le javascript le fera à sa place.
Imaginons
- une vue " maVue " avec trois colonnes : nom, prenom,
mail.
- un masque de vue $$ViewTemplate for maVue
Pour gérer les données issues de la vue, il faut
les passer au javascript en appelant une fonction qui va enregistrer
tout ça.
La formule de la colonne nom est : "ajoutTab(' "+nom+"
', "
La formule de la colonne prenom est : ' "+prenom+"
', "
La formule de la colonne mail est : ' "+mail+" ');
"
Ainsi la vue affichera des lignes du style :
ajoutTab('tonNom','tonPrenom','tonMail@tonMail.com');
Dans le masque de vue , on passe en mode HTML-relais.
On tape l'entete du tableau HTML et un peu de script.
<table>
<tr><td>nom</td><td>prenom</td>mail</td></tr>
<script>
Ensuite on intègre la vue (création/élément
intégré/vue) toujours en HTMLrelais
Puis on tape
</script>
</table>
Dans l'entête JS du masque on ajoute la fonction de javascript
suivante :
noms= new Array() ;
prenoms= new Array() ;
mails= new Array() ;
function ajoutTab(nom,prenom,mail){
noms[noms.length]=nom ;
prenoms[prenoms.length]=prenom ;
mails[mails.length]=mail ;
}
Maintenant les données peuvent être chargées
dans des arrays javascript il ne reste plus qu'à les
afficher dans un tableau HTML
Créons une fonction qui va écrire une ligne de
tableau HTML. Elle prend en paramètre le numéro
de la ligne à afficher.
function ecrisUneLigne(indice){
uneLigne="";
uneLigne= "<tr>\n"
uneLigne=+"<td>"+noms[indice]+"</td><td>"+prenoms[indice]+"</td><td>"+mails[indice]+"</td>\n";
uneLigne=+"</tr>\n";
return uneLigne;
}
Revenons dans les balises script, entre la vue intégrée
et la balise </script> on ajoute ceci :
if(noms.length>0){
for (i=0 ;i<noms.length ;i++){
Document.write(ecrisUneLigne(i)) ;
}
}else{
document.write("<tr><td colspan=3>PAS DE DOCUMENTS
!</td></tr>");
}
L'avantage de cette technique c'est que dans les masques vous
ne vous souciez plus de présentation tout est concentré
dans les masques de vues.
Dernier détail, il arrive que le contenu de la vue comporte
des guillemets et des apostrophes ce que javascript supporte
assez mal.
La solution :
Dans les formules de colonnes mettre @ReplaceSubstring(monChamp;"\'";"\\\'")
Mais la solution que je préfère est de tout encoder
au format URL, ainsi plus de problèmes d'accent, de guillemets
ou autre.
@URLEncode("";monChamp)
Par contre dans la fonction javascript ecrisUneLigne, on doit
faire le decodage avec la méthode unescape :
function ecrisUneLigne(indice){
uneLigne="";
uneLigne= "<tr>\n"
uneLigne+="<td>"+unescape(noms[indice])+"</td>";
uneLigne+="<td>"+unescape(prenoms[indice])+"</td>";
uneLigne+="<td>"+unescape(mails[indice])+"</td>\n";
uneLigne+="</tr>\n";
return uneLigne;
}
Petit plus de cette technique :
Les vues regroupent souvent énormément de documents,
et pour nos gentils interanutes, on aimerait pouvoir n'afficher
qu'un seul type de documents.
Imaginons que j'ai un masque A possédant des champs "
nom ", " prenom ", " mail " et "
maCategorie ".
Les documents issus de ce masque peuvent voir leur champ "
maCatagorie " prendre trois valeurs :
" maCatToto ", " maCatTiti " et " maCatTutu
"
Le but du jeu est de n'afficher que les documents appartenant
à la catégorie " maCatTutu ".
Dans ce cas, la vue qui sera alliée au masque de vue
(cf plus haut) devra avoir en première colonne le champ
" maCategorie ". cette colonne devra être catégorisée
et invisible à l'affichage. (options des colonnes). Les
trois autres colonnes sont définies par les formules
citées plus haut.
Dans le masque de vue, la vue intégrée possède
une propriété " n'afficher qu'une seule catégorie
".
Il suffit de mettre " maCatTutu " et hop ! domino
n'affichera que les documents correspondant à cette catégorie.
Remarquez cette solution est bien mais pas top. Si on a 150
options différentes pour le champs maCategorie, il risque
d'être assez complexe de faire 150 vues.
La solution est de passer un paramètre dans l'url.
Ex : http://serveur/maBase.nsf/maVue ?openView&monParam=maCatTutu&login
Avec un champ nommé " query_string_decoded "
on récupère le morceau d'url après le point
d'interrogation.
Ajoutons un autre champ " monParam "
Sa formule sera :
@left( @right(query_string_decoded ; " monParam= ")
; " &login " )
et on obtient le contenu de monParam , c'est à dire
" maCatTutu ".
il suffit ensuite de mettre le nom du champ " monParam
" dans la propriété de la vue intégrée
et c'est bon.
Il restera plus qu'a faire une liste déroulante qui rechargera
la page avec le bon paramètre.
Enfin dernier truc :
Il peut arriver qu'on ait besoin de plus d'un paramètre
d'affichage.
En reprenant l'exemple précédent, le masque A
possède en plus de " maCategorie " un autre
champ " maSousCategorie ".
La solution consiste à modifier la première colonne
de la vue (celle qui est catégorisée) :
maCategorie+ " # "+maSousCategorie
Il suffit ensuite dans la propriété de la vue
de reconstituer cette paire de valeurs en utilisant le même
système de récupération de variables d'url
que tout à l'heure.
|