IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

Réévaluer la valeur de l'attribut "required" sur un événement "onchange"


Sujet :

JSF Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2008
    Messages : 179
    Par défaut Réévaluer la valeur de l'attribut "required" sur un événement "onchange"
    Bonjour,

    le problème du jour me laisse perplexe : il s'agit de rendre obligatoire certains champs en fonction de la valeur d'un autre champ (une liste de sélection pour être précis).
    Je pensais la chose très simple, mais après qqs heures de cuisine, je n'ai pas réussi à faire ce que je voulais ; quoi que je fasse, je n'arrive jamais à faire en sorte que la valeur associée à "required" soit réévaluée. A la place, elle reste toujours égale à sa première validation.

    Si quelqu'un a une idée, je suis tout ouïe.

    Mon code ci-dessous (épuré pour la lisibilité) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <h:form id="createAccountForm">
     
      <a4j:outputPanel>
     
        <fieldset>
     
          <t:selectOneMenu
          id="type"
          value="#{monBean.unObjet.type}" >
            <a4j:support event="onchange" reRender="monForm:mutableRegion"/>
            <f:selectItems value="#{monBean.listeTypes}" />
          </t:selectOneMenu>
     
          <a4j:outputPanel id="mutableRegion" ajaxRendered="true">
     
            <h:inputText
            id="cle"         
            label="#{bundle.key}"
            value="#{monBean.unObjet.key}"
            maxlength="2"
            required="document.getElementById('monForm:type').value != ''">
              <f:validator validatorId="keyValidator" />
            </h:inputText>
     
            <h:inputText
            id="code"         
            label="#{bundle.code}"
            value="#{monBean.unObjet.code}"
            maxlength="9"
            required="document.getElementById('monForm:type').value != ''">
              <f:validator validatorId="codeValidator" />
            </h:inputText>
     
          </a4j:outputPanel>
     
        </fieldset>     
      </a4j:outputPane
    </h:form>
    PS : je précise que la valeur ici testée pour le type signifie que je veux rendre les champs obligatoires SI un type est renseigné. Par défaut, il n'y en a aucun. Une petite alerte javascript m'a confirmé que la valeur est bien évaluée au moment du changement.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    jsf c'est pas du javascript. Tes conditions doivent être écrite dans des expression language, comme les value, les action, etc.

    Dans ton cas, il faut que tu stocke la première value dans un bean, et pour la deuxième tu met un truc du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    required=#{leBean.laValeur eq 'leTest'}
    Il faut aussi que le premier champ soit en immediate="true" pour être stocké dans le bean avant qu'on ne traite le deuxème champ.


    Il existe des composant, de mémoire, dans tomahwak pour faciliter les validation inter-composant (ceci est requis si ceci est entré, les deux champs doivent avoir la même valeur, etc)

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2008
    Messages : 179
    Par défaut
    Bonjour, et merci de tes réponses - et remarques!

    La solution était effectivement au travers du "immediate" associé à l'usage de l'EL.

    Ca donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <h:form id="createAccountForm">
     
      <a4j:outputPanel>
     
        <fieldset>
     
          <t:selectOneMenu
            id="type"
            immediate="true"
            value="#{monBean.unObjet.type}" >
            <f:selectItems value="#{monBean.listeTypes}" />  
                <t:jsValueChangeListener for="cle" property="required" expressionValue="($srcElem.value == 'FR' || $srcElem.value == 'HE')"/>
                <t:jsValueChangeListener for="code" property="required" expressionValue="($srcElem.value == 'FR' || $srcElem.value == 'HE')"/>
          </t:selectOneMenu>
     
     
          <t:inputText
            id="cle"         
            label="#{bundle.key}"
            value="#{monBean.unObjet.key}"
            maxlength="2"
            required="#{monBean.unObjet.type ne ''}">
              <f:validator validatorId="keyValidator" />
          </h:inputText>
     
          <t:inputText
            id="code"         
            label="#{bundle.code}"
            value="#{monBean.unObjet.code}"
            maxlength="9"
            required="#{monBean.unObjet.type ne ''}">
              <f:validator validatorId="codeValidator" />
          </t:inputText>
     
     
        </fieldset>     
      </a4j:outputPane
    </h:form>
    J'ai utilisé un composant tomahawk, du coup : pas pour faire marcher le tout, mais en cherchant ce que tu avais suggéré, j'ai trouvé très pratique la surbrillance "rouge" que met en place le composant tomahawk sur les champs obligatoires. Ca met en évidence le caractère obligatoire de façon dynamique.
    Ca marche aussi sans le <t:jsValueChangeListener> donc.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [xslt] affecter la valeur d'un attribut HTML
    Par ouioui2000 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 16/12/2005, 10h49
  2. modifier la valeur d'un attribut xml
    Par totoche dans le forum ASP
    Réponses: 2
    Dernier message: 13/12/2005, 15h01
  3. [XSD] test de la valeur d'un attribut
    Par ka0z dans le forum Valider
    Réponses: 3
    Dernier message: 21/08/2005, 20h46
  4. Réponses: 2
    Dernier message: 07/07/2005, 18h11
  5. Valeur d'un attribut
    Par DarkMoox dans le forum Requêtes
    Réponses: 5
    Dernier message: 10/10/2004, 18h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo