Как перезагрузить капчу в форме отправки через Ajax? - PullRequest
2 голосов
/ 30 января 2012

Я отправляю формы, используя Ajax.Я использую капчу в своей форме, и в первый раз она работает отлично, когда я отправляю форму без какой-либо ошибки проверки.Иногда сервер возвращает некоторые ошибки проверки и не отправляет форму.На данный момент мне нужно обновить изображение капчи без перезагрузки всей страницы.

Код Captcha в Zend Form:

$captcha= new Zend_Form_Element_Captcha('captcha', array(
                'id'=>'captcha',
                'title'=>'Security Check.',
                'captcha'  => array(
                'captcha'  => 'Image',
                'required' => true,
                'font'     => '../public/fonts/ARIALN.TTF',
                'wordlen'  => '6',
                'width'    => '200',
                'height'   => '50',
                'imgdir'   => '../public/images/captcha/',
                'imgurl'   => '/images/captcha/'
                )));

JПросмотр формы отправки:

jQuery('form.AjaxForm').submit( function() {

    $.ajax({
        url     : $(this).attr('action'),
        type    : $(this).attr('method'),
        dataType: 'json',
        data    : $(this).serialize(),
        success : function( data ) {
                      // reload captcha here
                      alert('Success'); 
                  },
        error   : function( xhr, err ) {
                      // reload captcha here
                      alert('Error');
                }
    });

    return false;
}); 

Как перезагрузитьКапча на форме отправить?

Спасибо

1 Ответ

1 голос
/ 31 января 2012

У меня нет примера на данный момент, но я посмотрел на то, как генерируется капча в форме, и я думаю, что вам, возможно, придется сделать, это вернуть новый HTML-код для элемента формы капчи в вашем json ответ, если форма не прошла проверку.

Элемент captcha использует ссылку на изображение, которое создается и сохраняется в папке изображений, а в форме html используется идентификатор, связанный с этим изображением.

Если вы позвоните по номеру $yourForm->getElement('captcha')->render(); и добавите его в ответ json, вы можете обновить свою страницу новым элементом captcha. Единственная проблема заключается в том, что вызов метода render с декораторами по умолчанию может также вернуть теги <dt> и <dd>, и вам придется каким-то образом заменить это на javascript в html. Если вы используете пользовательские декораторы, то это может отличаться для вас, или вы можете визуализировать только изображение и скрытые поля, а не метку, и вставить это в тег div.

// in your controller where the form was validated
$form = new Form();
if (form->isValid($this->getRequest()->getPost()) == false) {
    $captcha = $form->getElement('captcha')->render();
    $json['captchahtml'] = $captcha;
}

$this->view->json = json_encode($json);

Затем в обратном вызове jquery success проверьте, не прошла ли проверка формы, и обновите html-код.

Надеюсь, это поможет.

...