¿Cómo recargar captcha en el envío de formulario a través de Ajax?

Estoy enviando formularios usando Ajax. Estoy usando captcha en mi formulario y la primera vez funciona perfectamente cuando envío el formulario sin ningún error de validación. A veces, los servidores devuelven algunos errores de validación y no envían el formulario. En este punto, necesito actualizar la imagen captcha sin volver a cargar la página completa.

Código Captcha en forma Zend:

$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/'
                )));

jQuery para el envío de formularios:

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;
}); 

¿Cómo recargar captcha en el formulario de envío?

Muchas Gracias

preguntado el 30 de enero de 12 a las 19:01

1 Respuestas

No tengo un ejemplo en este momento, pero miré cómo se genera el captcha en el formulario, y creo que lo que puede tener que hacer es devolver un nuevo código html para el elemento del formulario captcha en su respuesta json si el formulario de validación fallida.

El elemento captcha usa una referencia a una imagen que se crea y almacena en la carpeta de imágenes y el formulario html usa una identificación asociada con esa imagen.

Si haces una llamada a $yourForm->getElement('captcha')->render(); y agregue eso a la respuesta json, puede actualizar su página con el nuevo elemento captcha. El único problema es que llamar a render con los decoradores predeterminados puede devolver el <dt> y <dd> etiquetas también y de alguna manera tendrá que reemplazar eso con javascript en el html. Si está utilizando decoradores personalizados, entonces puede ser diferente para usted, o puede representar solo la imagen y los campos ocultos y no la etiqueta e insertarla en una etiqueta 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);

Entonces en tu jquery success devolución de llamada, verifique si el formulario falló en la validación y actualice el captcha html.

Espero que ayude.

Respondido el 31 de enero de 12 a las 10:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.