2010-12-02 5 views
4

Je veux créer un composant composite et attacher des validateurs à ses enfants, mais je veux que le message de validation soit attaché au composant composite, pas à son enfant.Validation de composant composite JSF

Dans la page en utilisant le composant composite Je veux quelque chose comme ceci:

<zzz:mycomponent id="my" /> 
<h:message for="my" /> 

Maintenant, il ne fonctionne pas, car un message est pour l'enfant de composant, pas le composant composite lui-même. Comment faire pour tout le composant?

Ou mieux encore, je voudrais ajouter validateur au composant composite, comme:

<zzz:mycomponent id="my" validator="#{bean.validateComposite}" /> 

et le récepteur quelque chose comme tableau booléens comme valeur, car à l'intérieur il y a pièce composite h:selectBooleanCheckbox éléments. Est-ce possible?

Répondre

1

Peut-être que très tard pour répondre à cette question, mais voici comment je devrais le faire:

<zzz:mycomponent id="my"> 
    <f:event type="postValidate" listener="#{bean.doValidation}"/> 
</zzz:mycomponent> 

Le doValidation est alors appelé après la validation des Childs dans le « conteneur ». La méthode llooks comme ceci:

public void doValidation(ComponentSystemEvent event) { 
    ... 
} 

Et vous avez 2 options dans cette méthode:

  • accéder aux composants de l'enfant (event.getComponent() getChildren().) Et faire ce que vous voulez faire avec les valeurs soumises sur ces enfants.

  • Ou boucle sur les FacesMessages et réallouer la clientId afin qu'ils soient placés sur votre composant conteneur (id = ma)

1

Vous devez mettre le code suivant dans votre définition composite

 <cc:interface> 
      ..... 
      <cc:editableValueHolder name="attName" targets="Idcomponent" /><!--It allows to acces to the composite--> 
      <cc:facet name="textMessage"/>         <!--Define the Facet--> 
     </cc:interface> 
     <cc:implementation id="#{cc.attrs.id}" > 
      ...... 
      <h:inputText id="Idcomponent" value="#{cc.attrs.value}" required="#{cc.attrs.required}"/> 
      <cc:renderFacet name="textMessage"/> 
     </cc:implementation> 

Vous pouvez utiliser dans la page JSF

 <zzz:textBox id="txbTest" label="#{}" value="#{}" > 
      <f:validateLongRange for="attName" minimum="-10" maximum="10"/> 
      <f:facet name="textMessage"> 
       <h:message for="value" style="color: blue"/> 
      </f:facet> 
     </zzz:textBox> 

ou une autre option pourrait être:

 <zzz:textBox id="txbTest" label="#{}" value="#{}" validator="#{bean.yourValidateMethod}" > 
      <f:facet name="textMessage"> 
       <h:message for="value" style="color: blue"/> 
      </f:facet> 
     </zzz:textBox> 
Questions connexes