Fernando Penteado
Fernando Penteado

Reputation: 101

Primefaces 2 <h:form> and 2<p:message> confusion

My login page has 2 forms, 1 for login itself, and another one to create new users and they are in a tab view(p:tabView), so users will never see both on the page, it would be, one or another. The problem is that everytime that a valitation fails on login tab, the failure is also shown in the new user tab, and vice-versa. How to handle this? i tried to set update property in the buttoncommand, but it did not work

see my code below:

<p:tabView id="loginTabView" orientation="right" style="margin-bottom:20px" styleClass="login_fields_panel">
        <p:tab title="Acesso" id="acessoTab" >
            <h:form>
                <h3><h:outputText value="#{bundle.loginHello}"  escape="false"/></h3>

                <p:messages id="messages_login" showDetail="false" autoUpdate="true" closable="true" showIcon="true"/>

                <p:outputLabel for="email" value="#{bundle.label_email}"/>
                <p:inputText value="#{loginMB.email}" label="#{bundle.label_email}" id="email" required="true" validatorMessage="#{bundle.emailInvalido}" size="45">
                    <f:validateRegex pattern="^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$" for="email"  />
                </p:inputText>

                <br/>

                <p:outputLabel for="senha" value="#{bundle.label_password}"  />
                <p:password value="#{loginMB.password}" id="senha" label="#{bundle.label_password}" required="true" size="45"/>
                <br/><br/>
                <p:commandButton action="#{loginMB.login}" value="#{bundle.btn_login}" ajax="false" update="messages_login"/>
            </h:form>
        </p:tab>
        <p:tab title="Faça seu cadastro aqui" id="newUserPanel" >
            <h:form id="formNewUser">
                <h3><h:outputText value="#{bundle.loginHello}"  escape="false"/></h3>

                <p:messages id="messages_new" showDetail="false" autoUpdate="true" closable="true" showIcon="true" />
                <h:panelGrid columns="2" id="matchGrid" cellpadding="1">
                    <p:outputLabel for="email" value="#{bundle.label_name}: "/>
                    <p:inputText value="#{loginMB.email}" label="#{bundle.label_name}:" id="name" required="true" validatorMessage="#{bundle.emailInvalido}" size="45" maxlength="100">
                    </p:inputText>

                    <p:outputLabel for="email" value="#{bundle.label_email}: "/>
                    <p:inputText value="#{loginMB.email}" label="#{bundle.label_email}" id="email" required="true" validatorMessage="#{bundle.emailInvalido}" size="45">
                        <f:validateRegex pattern="^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$" for="email"  />
                    </p:inputText>

                    <p:outputLabel for="senha" value="#{bundle.label_password}"  />
                    <p:password value="#{loginMB.password}" id="senha" label="#{bundle.label_password}" required="true" size="45"/>

                    <p:outputLabel for="senhaConfirmacao" value="#{bundle.label_password_confirmacao}"  />
                    <p:password value="#{loginMB.password}" id="senhaConfirmacao" label="#{bundle.label_password_confirmacao}" required="true" size="45"/>

                    <p:outputLabel for="birthday" value="#{bundle.label_birthday}"  />
                    <p:calendar id="birthday" value="#{calendarView.date2}" required="true" size="45" pattern="dd/MM/yyyy"/>
                </h:panelGrid>
                <br/><br/>
                <p:commandButton id="btn_create" action="#{loginMB.createUser}" value="#{bundle.btn_criar_usuario}" ajax="true" update="messages_new"/>
            </h:form>
        </p:tab>

thanks

Upvotes: 0

Views: 443

Answers (1)

BalusC
BalusC

Reputation: 1108742

The described problem with two forms and two message components is actually two-fold:

  1. You're using autoUpdate="true" on those message components. So regardless of what you specify in update attribute, those message components will be auto-updated.

    You need to either remove the autoUpdate="true" from the message components, or add ignoreAutoUpdate="true" to the command component.


  2. You're using ajax="false" on the first button. This forces a full page reload. Do note that all ajax-related attribtes such as process and update are ignored in such case.

    You need to either re-enable ajax on the first button, or to add redisplay="false" to the second message component.

Upvotes: 1

Related Questions