Supposons que l'on souhaite afficher un formulaire (ou tout autre composant) de saisie dans une page (affichant d'autres choses) seulement si l'utilisateur clique sur un bouton
A compléter
Schéma ou exemple
Piste 1 : utiliser le renderer
... celui du form ou d'un panelGrid avec un booléen dans le contrôleur (ici showUserForm)
<h:panelGrid id="panelFormAddUser" columns="1" rendered="#{welcomeController.showUserForm}">
<h:form id="formAddUser">
[...]
</h:form>
</h:panelGrid>
...activé par le bouton suivant
<p:commandButton value="Afficher formulaire" update="@form,panelFormAddUser,growl"
action="#{welcomeController.showFormNewUser}" >
</p:commandButton>
... qui donne, si true
<table id="panelFormAddUser"><tbody> <tr><td> <form id="formAddUser" name="formAddUser" method="post" action="/stylesheets/private/todo_private_demo.xhtml" enctype="application/x-www-form-urlencoded"> [...] </form></td></tr> </tbody> </table>
...si false
rien du tout :-)
donc update="...panelFormAddUser..." n'a aucun effet puisqu'il n'est pas sur la page.
Il faut donc un contenant qui s'affiche toujours, qui sera vide par defaut et contiendra le formulaire à l'appel du clique
Piste 2 : Utiliser un binding
Ceci consiste à mapper un objet qui compose la vue à une propriété du contrôleur.
On déclare par exemple dans welcomeController :
import javax.faces.component.UIComponent;
[...]
private UIComponent panelUserForm;
public void showFormNewUser() {
this.panelUserForm.setRendered(true);
}
[...]
public UIComponent getPanelUserForm() {
return panelUserForm;
}
public void setPanelUserForm(UIComponent panelUserForm) {
this.panelUserForm = panelUserForm;
}
[...]
... et dans la JSP on mappe :
<h:panelGrid id="panelFormAddUser" binding="#{welcomeController.panelUserForm}" columns="1" rendered="false">
<h:form id="formAddUser">
[...]
</h:form>
</h:panelGrid>