Astuce Wicket : Utiliser les enclosures pour contrôler la visibilité d’un bloc

Bien que l’un des principes de base de Wicket est de séparer le HTML (présentation) de Java (le contrôle), il offre tout de même quelques goodies utilisables dans le HTML et qui permettent de simplifier les choses (sans toutefois aller jusqu’à un jeu de tags à la JSTL par exemple).

Dans ce billet, je parlais de l’un de ces goodies, qui est le <wicket:container>. Ici, je vais parler de <wicket:enclosure>.

Ce tag s’avère très utile dans la situation suivante : on a un ensemble de tags HTMLs dont l’un au moins est attaché à un composant Wicket, et la visibilité d’un de ces tags (qui doit être attaché à un composant Wicket) contrôle la visibilité de l’ensemble des tags.

[Suite:]

Par exemple :

<div class="extra_info"> 
  <span>Deuxième Nom :</span> 
  <span wicket:id="secondName">valeur</span> 
</div>

et du côté Java :

 
add(new Label("secondName", person.getSecondName());

Si par exemple une des personnes ne dispose pas de second nom (sa valeur est nulle), on pourrait décider d’afficher le

tout en liassant la valeur du second nom vide, mais on pourrait aussi décider de cacher complètement tout le bloc

.

Dans le second cas, il nous faut pouvoir contrôler la visibilité de tout le div depuis Wicket.
Or, pour ce faire, on devrait normalement attacher de div à un composant Wicket, puis cacher ce composant, ce qui est loin d’être idéal.
Pire encore, si l’ensemble de tags annexes ne sont pas groupés comme ici dans un seul tag, comme par exemple :

<h2>Infos optionnelles</h2> 
<span>Deuxième Nom :</span> 
<span wicket:id="secondName">valeur</span>

Cacher le tout serait encore plus fastidieux à réaliser : il nous faut soit attacher chacun des tags à un composant Wicket (et cacher chacun d’eux), ou encore les entourer d’un tag fantôme (<wicket:container>, décrit ici), attacher ce denier à un composant Wicket, puis le cacher …

C’est loin d’être optimal car ça pollue inutilement le code (Java et HTML).

C’est là que le tag <wicket:enclosure> entre en jeu : il permet de contrôler la visibilité de tout ses fils (tags) selon la visibilité de l’un d’entre eux.
Dans notre cas, le tag qui contrôle la visibilité du tout est le second span :

<span wicket:id="secondName">valeur</span>

Il suffit dès lors d’entourer le tout par un <wicket:enclosure> et de préciser l’identifiant du composant Wicket qui contrôle la visibilité via l’attribut child :

<wicket:enclosure child="secondName"> 
  <h2>Infos optionnelles</h2> 
  <span>Deuxième Nom :</span> 
  <span wicket:id="secondName">valeur</span> 
</wicket:enclosure>

Dès lors, si du côté Java on cache le composant “secondName”, c’est tout le bloc qui se trouve caché :

Label secondNameLabel = new Label("secondName", person.getSecondName());  
if(person.getSecondName()==null){ 
  secondNameLabel.setVisible(false); 
} 
add(secondNameLabel);

—-

Advertisements

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: