ADF: Actions dans un switcher

Vous avez un switcher dans votre page adf faces, et vous voulez faire des actions sur des composants comme selectOneChoice mais vous n’avez pas réussi à les faire.
Dans cet article nous présentons une méthodologie pour faire des actions dans un switcher.

Point de départ
On considère une page jspx contenant un switcher sur 2 facets:

 
<af:showDetailItem text="#{elmviewcontrollerBundle.SYNTHESIS}"                             id="sdiSynthesis" binding="#{pageFlowScope.backingBean.showDetailItem}">
<af:switcher id="sversion"
facetName="version#{pageFlowScope.backingBean.varFacet}"
defaultFacet="versionFacet1">
<f:facet name="versionFacet1">
<af:commandLink partialSubmit="true"
text="#{sideBarItem.linkTittle}"
actionListener="#{pageFlowScope.backingBean.switchFacet}" id="cl1">
</f:facet>
<f:facet name="versionFacet2">
…
</f:facet>
</af:switcher>
</af:showDetailItem>

On crée dans le BackingBean de la page :

  • une variable String varFacet: deux valeurs possibles {Facet1 ou Facet2}
  • la méthode switchFacet() a comme but de rafraichir la page
  • un binding showDetailItem sur le composant qui englobe le switcher
  • le composant commandLink permet de passer vers le facet2

Actions sur Facet2 sous le switcher
Dans la page précédente détaillée, en cliquant sur le commandLink on aura l’affichage de facet2 dont il y a le selectOnChoice.
La fonctionnalité souhaitée est d’afficher un outPutText suivant la valeur sélectionnée dans le selectOneChoice sur le même fragment notamment sur le Facet2.
Les méthodes possibles sont :

  1. Utiliser la méthode « valueChangeListner »
  2. Utiliser un partialTriggers

Le résultat: avec les 2 méthodes on n’aura rien en changeant la valeur, et le outPutText ne s’affiche pas en fonction des changements des valeurs dans le selectOneChoice.
Le contenu de Facet2 est le suivant :

 
<f:facet name="versionFacet2">
<af:selectOneChoice value="#{bindings.LmClientDefProductForProVersionVO.inputValue}"
label="#{elmviewcontrollerBundle.PRODUCT_SELECTION}"
valuePassThru="true" id="soc11" autoSubmit="true"
valueChangeListener="#{pageFlowScope.backingBean.getValueChangeListener}">
<f:selectItems value="#{bindings.LmClientDefProductForProVersionVO.items}" id="si23"/>
</af:selectOneChoice>
<af:outputText value="#{pageFlowScope.backingBean.displayOption}" id="optd13p"
partialTriggers=":: soc11” />
</f:facet>

Solution pour activer les actions
Le principe est que le switcher ne supporte pas l’attribut partialTriggers; du coup il suffit de l’englober par un panelGroupLayout et ajouter le partialTriggers sur ce composant comme suit :

 
<af:showDetailItem text="#{elmviewcontrollerBundle.SYNTHESIS}"                             id="sdiSynthesis" binding="#{pageFlowScope.backingBean.showDetailItem}">
<af:panelGroupLayout id="pgl101" partialTriggers="soc11">
<af:switcher id="sversion"
facetName="version#{pageFlowScope.backingBean.varFacet}"
defaultFacet="versionFacet1">
<f:facet name="versionFacet1">
<af:commandLink partialSubmit="true"
text="#{sideBarItem.linkTittle}"
actionListener="#{pageFlowScope.backingBean.switchFacet}" id="cl1">
</f:facet>
<f:facet name="versionFacet2">
<af:selectOneChoice value="#{bindings.LmClientDefProductForProVersionVO.inputValue}"
label="#{elmviewcontrollerBundle.PRODUCT_SELECTION}"
valuePassThru="true" id="soc11" autoSubmit="true"
valueChangeListener="#{pageFlowScope.backingBean.getValueChangeListener}">
<f:selectItems value="#{bindings.LmClientDefProductForProVersionVO.items}" id="si23"/>
</af:selectOneChoice>
<af:outputText value="#{pageFlowScope.backingBean.displayOption}" id="optd13p"
partialTriggers=":: soc11” />
</f:facet>
</af:switcher>
</af:panelGroupLayout>
</af:showDetailItem>

Un extrait du backingBean de la page est le suivant:

      /**
* Switching to the 2nd facet
*/
public void switchFacet(ClickEvent clickEvent) {
…
RequestContext reqContextIns = RequestContext.getCurrentInstance();
reqContextIns.addPartialTarget(showDetailItem);
}
/**
* Action to selectOneChoice
*/
public void getValueChangeListener (ValueChangeEvent valueChangeEvent) {
// Traitement pour le outputText du facet2 dans le switcher
}