2012-01-23 26 views
5

que tienen el siguiente fragmento de código dentro de un h:formPrimefaces Captcha desaparece o no se actualiza/actualiza en entradas no válidas?

<h:panelGrid id="captchaGrid"> 
    <p:captcha id="captcha" label="Captcha" required="true" 
     requiredMessage="required" 
     validatorMessage="..."> 
    </p:captcha> 
    <p:message id="captchaMessage" for="captcha" /> 
</h:panelGrid> 

<p:commandButton id="submitButton" value="save" 
    actionListener="#{userBean.save}" update="captchaGrid" 
    onstart="doSomething()" 
    oncomplete="doSomethingElse(xhr, status, args)" icon="ui-icon-check"> 
</p:commandButton> 

Esto funciona bien si entro en el captcha correctamente. Sin embargo, si ingreso un valor inválido, el componente captcha simplemente desaparece.

He intentado eliminar el atributo update="captchaGrid". Esta vez, el captcha no desapareció. En cambio, no se actualizó visualmente, pero (supongo) internamente. Porque escribir las dos palabras correctamente todavía genera un error de validación.

Además; No quiero usar ajax="false".

Actualización: También probé oncomplete="Recaptcha.reload()". No funcionó Hay un error. Pero no sé si es mi código o Primefaces 3.0 :)

Actualización 2: Como maple_shaft señaló, este es un problema con Primefaces/Recaptcha. Así que estoy buscando cualquier truco sucio que pueda sugerir.

Cualquier ayuda apreciada.

Respuesta

7

No te va a gustar mi respuesta, pero esto no es un error.

Primefaces Issue 1642 está marcado como No se solucionará.

Primefaces Captcha utiliza Recaptcha, que no admite la actualización de Ajax ni puede hacerlo. Debe hacer una devolución de datos de página completa para que este componente funcione correctamente. Tenga en cuenta que esto también afecta la capacidad de usar Captcha en los componentes que requieren actualización Ajax de un panel, como una vista de pestaña o un componente de asistente.

EDIT: En otro aspecto, podría ser posible utilizar el componente captcha dentro de un para lograr un efecto similar, pero eso parece un truco sucio. Lo siento, no podría ser más de una ayuda.

+0

Realmente no me gustaba su maple_shaft respuesta, pero gracias :) ¿Hay alguna manera de presentar un 'h: form' que contiene un' iframe'? Por supuesto, me gustaría enviar el contenido del 'iframe' también. –

+0

@Murat No creo que así es como funcionan los iframes.El contenido del iframe es una página completamente diferente, por lo que, para que sea posible, probablemente se necesite un código JavaScript inteligente. No he usado iframes en más de 8 años, así que no recuerdo mucho. Debe preguntar sobre el envío de un formulario dentro de un iframe de la página maestra en una pregunta diferente para obtener una mejor respuesta. –

3

Está sucio, pero intente usar captcha en el cuadro de diálogo. se está trabajando para mí ....

<p:dialog widgetVar="captchaDlgWar" modal="true" closable="false" resizable="false" 
       header="Prove you are human..." width="350" height="200"> 

     <h:form> 
      <h:panelGrid columns="1"> 

       <p:captcha label="Captcha" 
          id="captchaId" 
          language="tr" 
          theme="white" 
          required="true" 
          requiredMessage="Please Enter Capcha Text" 
          validatorMessage="Captcha text does not match."/> 
       <p:commandButton id="btnContinue" 
           ajax="false" 
           value="Continue" 
           actionListener="#{MyBean.onButtonAction}"/> 

      </h:panelGrid> 
     </h:form> 
    </p:dialog> 

myBean ------->

public void onButtonAction(ActionEvent e) { 
    RequestContext.getCurrentInstance().execute("captchaDlgWar.hide()"); 
    //Do your stuff 
} 
0

no he encontrado ninguna manera de volver a cargar el código de imagen, así que lo que hago es vuelva a cargarlo en el evento oncomplete o onerror usando JavaScript.

Recaptcha.reload(); 

Tal vez funcione para usted.

2

Una derivación de la sugerencia @ user2393398.

No actualice el p:captcha, use el p:ajaxStatus para volver a cargarlo.

<h:form style="width: 400px;" > 
    <h:outputText value="Informe seu CPF/CNPJ ou E-mail abaixo, e um e-mail de recuperação será enviado para seu endereço." /> 
    <br /><br /> 
    <p:messages id="messageGlobal" globalOnly="true" /> 
    <h:panelGrid columns="3" cellspacing="5" > 
     <h:outputLabel for="inputUsuarioRecuperacao" value="CPF/CNPJ ou E-mail: " style="float: right;"/>  
     <p:inputText id="inputUsuarioRecuperacao" value="#{loginController.usuario}" required="true" size="30" /> 
     <p:message id="messageUsuarioRecuperacao" for="inputUsuarioRecuperacao" display="icon" /> 
     <p:spacer /> 
     <p:captcha id="inputCaptcha" theme="white" secure="true" validatorMessage="Os caracteres inseridos não correspondem à verificação de palavras. Tente novamente." /> 
     <p:message id="messageCaptcha" for="inputCaptcha" display="icon" /> 
     <p:spacer /> 
     <p:commandButton value="Enviar" actionListener="#{loginController.enviarEmailRecuperarSenha()}" update="messageGlobal messageCaptcha messageUsuarioRecuperacao" /> 
    </h:panelGrid> 
    <p:ajaxStatus onsuccess="Recaptcha.reload();" /> 
</h:form> 
+0

Sí, solo agregando ' 'parece hacer el truco para mí. – peater

Cuestiones relacionadas