Primefaces Captcha исчезает или не обновляется / обновляется при неверном вводе? - PullRequest
5 голосов
/ 24 января 2012

У меня есть следующий фрагмент кода внутри h:form

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

Это нормально работает, если я правильно ввожу код проверки. Однако, если я введу недопустимое значение, компонент капчи просто исчезнет.

Я попытался удалить атрибут update="captchaGrid". На этот раз капча не исчезла. Вместо этого он не обновлялся визуально, но (я думаю) внутри. Потому что при правильном наборе этих двух слов по-прежнему возникает ошибка проверки.

Кроме; Я не хочу использовать ajax="false".

Обновление: Я тоже пробовал oncomplete="Recaptcha.reload()". Не сработало Есть ошибка. Но я не знаю, мой ли это код или Primefaces 3.0:)

Обновление 2: Как указал maple_shaft, выясняется, что это проблема с Primefaces / Recaptcha. Поэтому я ищу любые грязные хаки, которые вы могли бы предложить.

Любая помощь приветствуется.

Ответы [ 4 ]

7 голосов
/ 24 января 2012

Вам не понравится мой ответ, но это не ошибка.

Primefaces Issue 1642 помечен как исправление не будет.

PrimefacesCaptcha использует Recaptcha, который не поддерживает и не поддерживает обновление Ajax.Вы должны сделать полный постбэк для того, чтобы этот компонент работал правильно.Имейте в виду, что это также влияет на возможность использования капчи в компонентах, которые требуют Ajax-обновления панели, таких как Tab View или Wizard.

EDIT: С другой стороны, этоМожно было бы использовать компонент captcha в <iframe> для достижения аналогичного эффекта, но это выглядит как грязный хак.Извините, я не мог больше помочь.

3 голосов
/ 14 июня 2012

Это грязно, но попробуйте использовать капчу в диалоговом окне. это работает для меня ....

  <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
}
2 голосов
/ 09 марта 2015

Вывод подсказки @ user2393398.

Не обновляйте p:captcha, используйте p:ajaxStatus для его перезагрузки.

<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 голосов
/ 19 июля 2013

Я не нашел способа перезагрузить капчу, поэтому я перезагружаю ее в случае завершения или ошибки при использовании JavaScript.

Recaptcha.reload();

Может быть, это сработает для вас.

...