2012-01-23 10 views
5

Tôi có đoạn mã sau bên trong một h:formThủ tướng Captcha biến mất hoặc không cập nhật/làm mới trên đầu vào không hợp lệ?

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

này hoạt động tốt nếu tôi nhập mã xác nhận khác một cách chính xác. Tuy nhiên, nếu tôi nhập một giá trị không hợp lệ, thành phần captcha sẽ biến mất.

Tôi đã cố xóa thuộc tính update="captchaGrid". Lần này, hình ảnh xác thực không biến mất. Thay vào đó, nó không làm mới trực quan nhưng (tôi đoán) trong nội bộ. Bởi vì gõ hai từ chính xác vẫn tạo ra một lỗi xác nhận.

Hơn nữa; Tôi không muốn sử dụng ajax="false".

Cập nhật: Tôi cũng đã thử oncomplete="Recaptcha.reload()". Không làm việc. Có một lỗi. Nhưng tôi không biết nếu đó là mã của tôi hoặc Primefaces 3.0 :)

Cập nhật 2: Như maple_shaft đã chỉ ra, nó chỉ ra rằng đây là vấn đề với Primefaces/Recaptcha. Vì vậy, tôi đang tìm kiếm bất kỳ hacks bẩn bạn có thể đề nghị.

Bất kỳ trợ giúp nào được đánh giá cao.

Trả lời

7

Bạn sẽ không thích câu trả lời của tôi, nhưng đây không phải là lỗi.

Primefaces Issue 1642 được đánh dấu là sẽ không khắc phục.

Captcha Primefaces sử dụng Recaptcha, không có và không thể hỗ trợ làm mới Ajax. Bạn phải đăng một trang đầy đủ để thành phần này hoạt động bình thường. Hãy nhớ điều này cũng ảnh hưởng đến khả năng sử dụng Captcha trong các thành phần yêu cầu làm mới Ajax của một bảng điều khiển, chẳng hạn như một thành phần Tab View hoặc Wizard.

EDIT: Lưu ý khác, có thể sử dụng thành phần hình ảnh xác thực trong một số để đạt được hiệu ứng tương tự, nhưng điều đó có vẻ như là một hack bẩn. Xin lỗi tôi không thể giúp đỡ nhiều hơn.

+0

Tôi thực sự không thích câu trả lời của bạn maple_shaft, nhưng cảm ơn :) Có cách nào tôi có thể gửi 'h: form' chứa' iframe'? Ofcourse, tôi cũng muốn gửi nội dung của 'iframe'. –

+0

@Matat Tôi không tin đó là cách iframe hoạt động.Nội dung của khung nội tuyến là một trang hoàn toàn khác nhau để có thể một số Javascript thông minh có thể là cần thiết. Tôi đã không sử dụng iframe trong hơn 8 năm vì vậy tôi không thể nhớ nhiều. Bạn nên hỏi về việc gửi biểu mẫu trong iframe từ trang cái trong một câu hỏi khác để có câu trả lời hay hơn. –

3

Nó bị bẩn nhưng hãy thử sử dụng hình ảnh xác thực trên hộp thoại. nó đang làm việc cho tôi ....

<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

tôi đã không tìm thấy cách nào tải lại hình ảnh xác thực, vì vậy những gì tôi làm là để tải lại nó trong trường hợp không đầy đủ hoặc onerror bằng cách sử dụng JavaScript.

Recaptcha.reload(); 

Có thể nó sẽ phù hợp với bạn.

2

Một dẫn xuất của mẹo @ user2393398.

Không cập nhật p:captcha, sử dụng p:ajaxStatus để tải lại.

<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

Chỉ cần thêm ' 'dường như làm thủ thuật cho tôi. – peater