CActiveForm и AJAX
Re: CActiveForm и AJAX
validateOnSubmit не реагирует на ajaxSubmitButton. Хотя реагирует на submitButton. Ajax submit в Yii есть и он работает, вот только провести валидацию перед отправкой.
Re: CActiveForm и AJAX
Имея результат валидации (в json), как применить его к форме с помощю js ? Реализация в jquery.yiiactiveform.js
/**
* yiiactiveform set function.
* @param map settings for the active form plugin. Please see {@link CActiveForm::options} for availablel options.
*/
Re: CActiveForm и AJAX
Код: Выделить всё
<?php
$form=$this->beginWidget(
'CActiveForm',
array(
'id' => 'add_category_form'
, 'action' => Yii::app()->createUrl("admin/AddCategory" )
, 'enableAjaxValidation' => true
, 'clientOptions' => array(
'validateOnSubmit'=>true
, 'validationUrl' => Yii::app()->createUrl("admin/FormValidation" )
, 'ajaxVar' => 'ajax'
, 'afterValidate' => "js: function(form, data, hasError) {
//if no error in validation, send form data with Ajax
if (! hasError) {
$.ajax({
type: 'POST',
url: form[0].action,
data: $(form).serialize(),
success: function(ret) {
//alert(data)
}
});
}
return false;
}
"
)
)
);
?>
<div class="name" id='name_wrapper'>
<?php echo $form->labelEx($model,'name'); ?>
<?php echo $form->textField($model,'name' ); ?>
<?php echo $form->error($model,'name'); ?>
</div>
<?php
echo CHtml::submitButton(Yii::t('user', 'Submit') );
?>
Re: CActiveForm и AJAX
Так у меня работает через аякс
Код: Выделить всё
$form=$this->beginWidget('CActiveForm', array(
'id'=>'review-form',
'enableAjaxValidation'=>true,
'action'=>Yii::app()->createUrl('review/create'),
));
Код: Выделить всё
echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save',array(
'ajax'=>array(
'type'=>'POST',
'url'=>Yii::app()->createUrl('review/create'),
'success'=>'function(data) {$("#test").html(data)}',
)
));
- SowenoK
- Сообщения: 43
- Зарегистрирован: 2011.03.17, 18:09
- Откуда: Россия, Краснодар
- Контактная информация:
Re: CActiveForm и AJAX
Подскажите, форма валидируется аяксом при нажатии на инпут, форма отсылает аякс, но если есть ошибки валидации при нажатии на кнопку, то аяксом возвращаются ошибки в jsone и в поля для ошибок не выводятся, как это исправить?
Самурай без меча - это тоже, что самурай с мечом, но только без меча.
Re: CActiveForm и AJAX
Вложу и свои труды, может кому поможет.
Сначала скажу, что мой Action может вернуть 3 разных ответа на ajax запрос.
1) Делаем определённые действия (например, я создаю объект и отсылаю пользователю письмо в случае успеха), у нас всё получается - возвращаем ответ: echo '200';
2) Делаем определённые действия, у нас происходит сбой/ошибка (например, объект не создался по каким-то причинам) - возвращаем ответ: echo '400';
3) Мы приняли ajax-запрос, проверили на корректность поля и поняли, что не все соответствуют наших правилам модели, поэтому мы вообще никаких действий не выполняем, а сразу возвращаем нашему скрипту ответ JSON с ошибками: echo CActiveForm::validate($modelForm);
Код представления:
Кстати, возможно, вы заметили вот такую странность ".html(\'\'+value);". Зачем же здесь к пустому месту прибавлять value. Если честно, то я и сам не знаю, но у меня работает только так. Если передавать просто value, то ничего не произойдёт (ошибки не добавятся в нужные нам места). Если кто-нибудь мне сможет пояснить с чем это связано, буду благодарен!
Сначала скажу, что мой Action может вернуть 3 разных ответа на ajax запрос.
1) Делаем определённые действия (например, я создаю объект и отсылаю пользователю письмо в случае успеха), у нас всё получается - возвращаем ответ: echo '200';
2) Делаем определённые действия, у нас происходит сбой/ошибка (например, объект не создался по каким-то причинам) - возвращаем ответ: echo '400';
3) Мы приняли ajax-запрос, проверили на корректность поля и поняли, что не все соответствуют наших правилам модели, поэтому мы вообще никаких действий не выполняем, а сразу возвращаем нашему скрипту ответ JSON с ошибками: echo CActiveForm::validate($modelForm);
Код представления:
Код: Выделить всё
<?php
$form = $this->beginWidget('CActiveForm', array(
'id' => 'ID ВАШЕЙ ФОРМЫ',
'enableClientValidation' => true,
));
?>
<!-- здесь ваш html-код формы -->
<?php echo CHtml::ajaxSubmitButton('Send my coupon', '', array(
'type' => 'POST',
'success' => 'js: function(data) {
if (data=="200") {
// ваши действия при успехе
}
else if (data=="400") {
// ваши действия при провале
}
else {
// а это случай, когда в качестве ответа от экшена проходят данные по валидации
// мы парсим запрос и раскидываем сообщения об ошибках по соответствующим блокам
// разумеется, если вы как-то изменяете стандартную форму (созданную тем же gii),
// то возможно у вас будут другие id-шники, не забудьте их поменять ( key+"_em_" меняем на ваши)
var response= jQuery.parseJSON (data);
$.each(response, function(key, value) {
$("#"+key+"_em_").show();
$("#"+key+"_em_").html(\'\'+value);
});
}
}',
),
array(
'type' => 'submit',
); ?>
<?php $this->endWidget(); ?>
Re: CActiveForm и AJAX
Всё. Разобрался благодаря js-дебагеру из-за чего без \'\' не работает. Там value не строка, а массив из одного элемента оказывается.
Меняем это
на это
profit!
Меняем это
Код: Выделить всё
$("#"+key+"_em_").html(\'\'+value);
Код: Выделить всё
$("#"+key+"_em_").html(value[0]);
Re: CActiveForm и AJAX
в ClientOptions определить js функцию, которая будет віполняться после ajaxvalidation и в ней сабмитить форму через ajax
вот кусок из доки по єтому поводу:
afterValidate: function, the function that will be invoked after performing ajax-based validation triggered by form submission action (available only when validateOnSubmit is set true). The expected function signature should be afterValidate(form, data, hasError) {...}, where 'form' is the jquery representation of the form object; 'data' is the JSON response from the server-side validation; 'hasError' is a boolean value indicating whether there is any validation error. If the return value of this function is NOT true, the normal form submission will be cancelled.
вот кусок из доки по єтому поводу:
afterValidate: function, the function that will be invoked after performing ajax-based validation triggered by form submission action (available only when validateOnSubmit is set true). The expected function signature should be afterValidate(form, data, hasError) {...}, where 'form' is the jquery representation of the form object; 'data' is the JSON response from the server-side validation; 'hasError' is a boolean value indicating whether there is any validation error. If the return value of this function is NOT true, the normal form submission will be cancelled.
Мож это поможет
$form = $this->beginWidget('CActiveForm', array(
'id' => isset($id)?$id:null,
'method'=>isset($method)?$method:'POST',
'action' => isset($action)?$action:null,
'enableAjaxValidation' => true,
'clientOptions' => array(
'beforeValidate'=>'js:function(){
alert("");
}',
'validateOnSubmit' =>true,
'validateOnChange' => true,
),
'id' => isset($id)?$id:null,
'method'=>isset($method)?$method:'POST',
'action' => isset($action)?$action:null,
'enableAjaxValidation' => true,
'clientOptions' => array(
'beforeValidate'=>'js:function(){
alert("");
}',
'validateOnSubmit' =>true,
'validateOnChange' => true,
),
-
- Сообщения: 12
- Зарегистрирован: 2013.10.19, 10:47
Re: CActiveForm и AJAX
Вот примеры валидации и вывода ошибок AJAX-формы с использованием ajaxSubmitButton и без.
Re: CActiveForm и AJAX
Если используем обыкновенный сабмит а не аякс
то чтоб происходила Аякс валидация - нужно чтоб присутствовала строчка
<?php echo $form->error($model,'name'); ?>
без нее аякс валидация ТОЛЬКО по аякссабмиту возможна
то чтоб происходила Аякс валидация - нужно чтоб присутствовала строчка
<?php echo $form->error($model,'name'); ?>
без нее аякс валидация ТОЛЬКО по аякссабмиту возможна