2012-01-23 5 views
5

Ho il seguente pezzo di codice all'interno di un h:formPrimefaces Captcha scompare o non si aggiorna/aggiorna su un input non valido?

<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> 

Questo funziona bene se entro correttamente il captcha. Tuttavia, se inserisco un valore non valido, il componente captcha scompare.

Ho provato a rimuovere l'attributo update="captchaGrid". Questa volta, il captcha non è scomparso. Invece, non si è aggiornato visivamente ma (credo) internamente. Perché digitare correttamente le due parole genera ancora un errore di convalida.

Inoltre; Non voglio usare ajax="false".

Aggiornamento: Ho anche provato oncomplete="Recaptcha.reload()". Non ha funzionato C'è un bug Ma non so se è il mio codice o Primefaces 3.0 :)

Aggiornamento 2: Come indicato da maple_shaft, risulta che questo è un problema con Primefaces/Recaptcha. Quindi sto cercando degli hack sporchi che potresti suggerire.

Qualsiasi aiuto apprezzato.

risposta

7

Non ti piacerà la mia risposta, ma questo non è un bug.

Primefaces Issue 1642 è contrassegnato come Non risolvera.

Il Primefaces Captcha utilizza Recaptcha, che non supporta e non supporta l'aggiornamento Ajax. È necessario eseguire un postback di una pagina intera affinché questo componente funzioni correttamente. Tenere presente che ciò influisce anche sulla possibilità di utilizzare Captcha in componenti che richiedono l'aggiornamento Ajax di un pannello, ad esempio un componente Tab View o Wizard.

EDIT: In un'altra nota, potrebbe essere possibile utilizzare il componente all'interno di un captcha per ottenere un effetto simile, ma che sembra un hack sporco. Mi dispiace non potrei essere più di aiuto.

+0

Io davvero non come la tua risposta maple_shaft, ma grazie :) c'è un modo posso presentare una h ': form' che contiene un' iframe'? Naturalmente, mi piacerebbe presentare anche il contenuto dell 'iframe. –

+0

@ Murat Non credo che sia così che funzionano gli iframe.Il contenuto dell'iframe è una pagina completamente diversa, quindi affinché ciò sia possibile, è probabilmente necessario un Javascript intelligente. Non ho usato iframe in oltre 8 anni, quindi non ricordo molto. Dovresti chiedere di inviare un modulo all'interno di un iframe dalla pagina principale in una domanda diversa per ottenere una risposta migliore. –

3

È sporco ma prova a usare captcha nella finestra di dialogo. si sta lavorando per me ....

<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

non ho trovato alcun modo di ricaricare il captcha, quindi quello che faccio è quello di ricaricalo nell'evento oncomplete o onerror utilizzando JavaScript.

Recaptcha.reload(); 

Forse funzionerà per voi.

2

Una derivazione del suggerimento @ user2393398.

Non aggiornare p:captcha, utilizzare p:ajaxStatus per ricaricarlo.

<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ì, aggiungendo semplicemente ' 'sembra fare il trucco per me. – peater