juillet
2009
Salut
Dans ma dernière revue de presse, j’avais parlé d’un blog traitant d’un moyen d’avoir les feedbacks à côté des saisies.
Or, en regardant la bête de plus près, j’ai encore une fois été bluffé par la flexibilité et la puissance de Wicket, en l’occurrence cette fois sur les FeedbackPanel, composant qu’on est amené à beaucoup manipuler et qu’il est donc utile de bien connaitre.
Voyons ensemble comment faire pour avoir des feedback panel dédiés à des composants précis.
Dans votre formulaire, vous devez bien sûr avoir un composant précis pour lequel vous voulez ajouter les feedback juste à côté. Disons un champ de texte :
add(name);
Notez bien le « final » : de la sorte on pourra réutiliser cette référence dans les classes anonymes à venir…
En l’occurrence, pour définir votre feedbackPanel dédié, faites ainsi :
dedicatedFP.setFilter(new IFeedbackMessageFilter(){
public boolean accept(FeedbackMessage message)
{
if (message.getReporter().equals(name) && !(message.isRendered())){
message.markRendered();
return true ;
}else{
return false ;
}
}});
add(dedicatedFP);
Plusieurs choses à noter :
- la surcharge de la méthode accept() nous permet d’indiquer au feedbackpanel quels messages prendre en compte. A noter qu’ici j’ai choisi de me limiter à l’origine du message, mais on pourrait aussi choisir d’autres critères, par exemple le niveau du message, via un message.getLevel()
- la notion de « rendered » est à gérer par le développeur : par défaut, un feedbackpanel affiche tous les messages, qu’ils soient déjà rendered ou non. Nous faisons donc le tri, car dans le cas présent nous ne voulons pas de doublons d’affichage de message : si le message n’a pas encore été « rendered » par un feedbackpanel, alors je le « rendered » dans le panel courant.
- je récupère bien les messages émis par mon composant via le getReporter(). Cela veut dire que si je voulais ajouter des messages « à ma sauce » pour ce composant, je devrai alors faire un name.info(« mon message »), ou autre name.error(« mon message »). Rien que du très logique en fiat
- Les feedbackpanel sont dans des div, il faudra donc veiller dans la page html à faire un tableau avec dans la 1ere colonne le champ de saisie et dans la 2eme le feedbackpanel (qui sera vide par défaut).
Enfin, pour m’assurer que j’ai bien affiché au moins une fois chaque message, je mets un feedbackpanel général, en tenant compte bien sûr de l’affichage ou non de chaque message :
panel.setFilter(new IFeedbackMessageFilter(){
public boolean accept(FeedbackMessage message)
{
return !message.isRendered();
}
});
add(panel);
Vous allez me dire, c’est beaucoup de code pour un simple feedbackpanel dédié. Mais justement, et c’est là toute la richesse de Wicket, il devient alors très aisé de faire un DedicatedFeedbackPanel(String id, Component component) que l’on pourra réutiliser à plaisir, et surtout avec ses propres choix concernant les critères de choix des messages à afficher.
Sympa non ?
++
joseph