Marco Yii: formulario AJAX?
ajaxform (2)
Ok, necesito ayuda con algo que parece bastante sencillo, pero no puedo entenderlo.
Tengo una página en Yii en la que intento incrustar un formulario AJAX. Llamemos a la página A. El formulario tiene un valor único, y necesita validarlo y almacenarlo en el DB si está bien.
Hasta ahora, esto es lo que descubrí:
El formulario está en una vista _form.php, que contiene un CActiveForm y un ajaxSubmitButton que se ve así:
<?php echo CHtml::ajaxSubmitButton(''submit'', $this->createUrl(''/site/something''), array(''update''=>''#targetdiv''));?>
El formulario se llama dentro de la vista de otro A así:
<?php echo $this->renderPartial(''/site/_form'', array(''AModel''=>$model)); //Passing some info about A ?>
En la acción del controlador Algo, estoy haciendo lo siguiente:
if (Yii::app()->request->isAjaxRequest) {
$model = new AJAXForm(''submit'');
if (isset($_POST[''AJAXForm''])) {
$model->attributes = $_POST[''AJAXForm''];
if ($model->validate()) {
//When data''s valid, save to DB is working fine. This part is working perfectly.
}
else {
//This is the part I''m confused about and that''s not working
/*Trying to render the form to get the error messages and summary displayed
but nothing''s showing */
$this->renderPartial(''/site/_form'', array(''AModel''=>$model));
Yii::app()->end();
}
}
}
En Firebug, veo que cuando se encuentra un error, la respuesta contiene todo el formulario parcial procesado de nuevo. Sin embargo, targetdiv no se actualiza con el formulario actualizado con los mensajes de error.
Tengo la sensación de que estoy haciendo algo mal en ActionController, pero no puedo entender qué. Sería útil si pudiera ver un ejemplo completo de un formulario enviado de AJAX también.
¡Gracias!
Intente agregar ''dataType'' a sus atributos ajaxSubmitButton como:
array(''type'' =>''POST'',
''update'' => ''#targetdiv'',
''dataType'' => ''html'',
),
Es posible que desee intentar devolver algo de texto básico para probarlo primero: si solo está tratando de mostrar un mensaje de error, es posible que no necesite volver a procesar el formulario.
$model->getErrors()
le daría todos los errores para todos los atributos
http://www.yiiframework.com/doc/api/1.1/CModel#getErrors-detail
if ($model->validate()) {
//When data''s valid, save to DB is working fine. This part is working perfectly.
}
else {
$errors = $model->getErrors();
echo $errors;
Yii::app()->end();
}
Y luego pase esto a la ajaxSubmitButton()
ajax, según esta publicación en el foro Yii: http://www.yiichina.net/forum/index.php/topic/23236-extension-how-to-display-validation-errors -comming-from-ajax-validation /
''success''=>"function(html) {
if (html.indexOf(''{'')==0) {
var e = jQuery.parseJSON(html);
jQuery.each(e, function(key, value) {
jQuery(''#''+key+''_em_'').show().html(value.toString());
jQuery(''#''+key).addClass(''clsError'');
jQuery(''label[for=''+key+'']'').addClass(''clsError'');
});
}