2010年4月2日星期五

Re: [fw-mvc] How to deal with Zend_Form validation errors on a form called via AJAX?

Here is how I solved this in mz prev project

class Umpirsky_AjaxForm extends Umpirsky_Form {
/**
     * Render form and add ajax behaviour.
     *
     * @param  Zend_View_Interface $view
     * @return string
     */
    public function render(Zend_View_Interface $view = null) {
$this->getView()->jQuery()->addOnLoad(sprintf('%s("#%s").uiForm();',
   ZendX_JQuery_View_Helper_JQuery::getJQueryHandler(),
   $this->getAttrib('id')
));

return parent::render($view);
    }
}

uiForm is simple jQuery plugin

jQuery.fn.uiForm = function() {
var self = this;
this.ajaxForm({
dataType: 'json',
     success: function(response) {
     var errorContainer = self.find('.form-errors');
     var successContainer = self.find('.success-box');
     if (response.valid) {
     // Remove error
     errorContainer.remove();
     self.find('[id$="_wrapper"]').removeClass('element-error');
    
     // Add success
     if (successContainer.size() > 0) {
     successContainer.replaceWith(response.html);
     } else {
     self.prepend(response.html);    
     }
    
     // Clear fields
     self.clearForm();
     } else {
     // Remove success
     successContainer.remove();
    
     // Form errors
     if (errorContainer.size() > 0) {
     errorContainer.replaceWith(response.html);
     } else {
     self.prepend(response.html);
     }
    
     // Higlight elements
for (name in response.errors) {
if ($.isEmptyObject(response.errors[name])) {
$('#' + name + '_wrapper').removeClass('element-error');
} else {
$('#' + name + '_wrapper').addClass('element-error');
}
}    
     }
     }
});
}

project specific, but you can use it as an example.

If form is not valid

$this->view->html = $form->renderFormErrors();
$this->view->errors = $form->getErrors();

plugin uses this thigs for generating markup.

Form action is set to be handled via ajaxContext, so you can add target action json context.

Regards,
Saša Stamenković


On Fri, Apr 2, 2010 at 4:24 PM, Bill Chmura <Bill@explosivo.com> wrote:

Okay, well the subject was a tough one to come up with so here is a better description:

I have a Zend_Form...  When you call the controller it renders the zend form on the page and gives it to you.

You complete the zend form and JS packages it up and sends an Ajax request

The ajax request takes the data, creates the form, and validates, etc that way and sends the data back

Which then gets the data back and makes a pretty table.

So my question is, how do I pass back the validation errors via the AJAX response?

My thoughts currently are:

1) Screw the ajax, force a full page refresh each time

2) Render and pass the whole form back inside the response

3) Send back a validation error listing and parse it out in the client


#2 seems easiest, but I feel strange about it for some reason.

Anyone else tackle this before?

没有评论: