JQuery AJAX-запрос с Zend_Form_Captcha ReCaptcha - PullRequest
2 голосов
/ 14 декабря 2011

Я пытаюсь создать форму AJAX с Zend_Form.Все это работает, за исключением случаев, когда форма возвращается недействительной, сценарии ReCaptcha отфильтровываются с помощью jQuery.Я пробовал несколько разных методов, но безрезультатно.

Форма отправки:

<?php

class Application_Form_Login extends Zend_Form
{

    public function init()
    {
        $this->setName('loginfrm')
             ->setOptions(array('class' => 'niceform', 'action' => 'login/index'));

        $username = $this->addElement('text', 'username', array(
            'filters' => array(
                'StringTrim',
                'StringToLower'
            ),
            'validators' => array(
                'Alnum',
                array('StringLength', false, array(3,20))
            ),
            'required' => true,
            'label' => 'Your Username:'
        ));

        $password = $this->addElement('password', 'password', array(
           'filters' => array('StringTrim'),
            'validators' => array(
                'Alnum',
                array('StringLength', false, 6, 32)
            ),
            'required' => true,
            'label' => 'Your Password:'
        ));

        $config = new Zend_Config_Ini( APPLICATION_PATH . '/configs/config.ini', 'auth' );
        $recaptcha = new Zend_Service_ReCaptcha(
              $config->keys->recaptcha->public , $config->keys->recaptcha->private , null, array( 'theme' => 'clean' )
         );

        $captcha = $this->addElement('captcha', 'captcha', array(
            'label' => 'Type the characters you see in the picture below',
            'captcha' => 'ReCaptcha',
            'captchaOptions' => array(
                'captcha' => 'ReCaptcha',
                'service' => $recaptcha
            )
        ));


        $this->addElement('button', 'submit', array(
            'label' => 'Login',
            'ignore' => true,
            'class' => 'submit'
        ));

        $this->setDecorators(array(
           'FormElements',
            array('HtmlTag', array('tag' => 'dl', 'class' => 'form')),
            array('Description', array('placement' => 'prepend', 'class' => 'errors')),
            'Form'
        ));
    }


}

Файл Javascript: (удален некоторый код, чтобы сэкономить ваше время)

//
// Namespace - Module Pattern.
//
var first = (function ($, window, document, undefined) {
    // Expose innards of first.
    return {
        go: function () {
            for (var i in first.init) {
                first.init[i]();
            }
        },
        init: {

             partofcode: function() {
                var d = $(document);

                // support form submits
                d.on('click', 'button', function(ev) {
                    var form = $(this).closest("form");
                    first.util.ajax(
                        form.attr("action"),
                        form.serialize(),
                        function(data) {
                            if(window.debug){ alert(data); }

                            var topDiv = form.closest(".window_main_full");

                            topDiv.html(data);

                        },
                        "html"
                    );
                });
            }
        },
        util: {
            ajax: function(location, data, success, dataType) {
                $.ajax({
                   dataType: dataType,
                   type: 'POST',
                   url: location,
                   data: data,
                   beforeSend: function() {
                       // show the loading image
                       var panel = $('#ajax_panel').show();
                       panel.html('Loading...');

                       // center the ajax_panel
                       panel.css({
                           'width'       : (panel.width() + 25) + 'px',
                           'margin-left' : (($(window).width() / 2) - (panel.width() / 2 )) + 'px'
                       });
                       if(window.debug){ alert("before"); }
                   },
                   success: function(data){
                       if(window.debug){ alert("Before function..."); }
                       success(data);
                       $('#ajax_panel').html('').hide();
                       if(window.debug){ alert("after"); }
                   },
                   error: function(xhr, status, error) {
                       $('#ajax_panel').html('<span class="error"><strong>Oops!</strong> Try that again in a few moments.</span>');
                       if(window.debug){
                           alert('XHR: ' + xhr.status + '\nStatus:' + status + '\nError: ' + error);
                           setTimeout(function() {
                               $('#ajax_panel').slideUp(500, function() {
                                   $('#ajax_panel').hide();
                               });
                           }, 2000);
                       }
                   }
                });
            }
        }
    };
    // Pass in jQuery.
})(jQuery, this, this.document);

//
// Kick things off.
//
jQuery(document).ready(function () {
    first.go();
});

Я знаю, что целые сценарии фильтрации .html () задавались много раз, но я просто не могу найти решение.

...