Примеры работы Yii c Ajax.
- Отравляем в ajax запросе все значения на формы
- Отправляем на сервер определенное значения c формы
- Обрабатываем ответ ajax запроса
Отравляем в ajax запросе все значения с формы
Предположим требуется обрабатывать каждое изменение на форме.
Например при изменение разных параметров выполняются расчеты.
Вьюха:
<div class="form"> <?php $ajaxOpt = array( 'type'=>'POST', 'url'=>CController::createUrl('site/AjexTest'), 'update'=>'#output', 'data'=>'js:$("#form_").serialize()'); echo CHtml::form('','post',array('id'=>'form_')); ?> <div class="row"> <?php echo CHtml::textArea('input', $input, array('ajax' => $ajaxOpt)); ?> <?php echo CHtml::dropDownList('country_id','', array(1=>'USA',2=>'France',3=>'Japan'), array('ajax' => $ajaxOpt)); ?> <?php echo CHtml::textArea('output', $output);?> </div>'; <? echo CHtml::endForm(); ?> </div>
Обработка действия:
public function actionAjexTest() { foreach($_POST as $Key => $value) { if($Key != 'output') $output = $output.$Key.'='.$value."n"; // $input = Yii::app()->request->getPost('input'); } // если запрос асинхронный, то нам нужно отдать только данные if(Yii::app()->request->isAjaxRequest){ echo CHtml::encode($output); // Завершаем приложение Yii::app()->end(); } else { // если запрос не асинхронный, отдаём форму полностью $this->render('index', array( 'output'=>$output, )); } }
Отправляем на сервер определенное значения c формы
Меняет в $ajaxOpt поле «data»
$ajaxOpt = array( 'type'=>'POST', 'url'=>CController::createUrl('site/AjexTest'), 'update'=>'#output', 'data'=>array('input'=>'js:$("#input").val()'));
Поле input должно в обязательном порядке иметь id=»input»
... <?php echo CHtml::textArea('input', $input, array('id'='input','ajax' => $ajaxOpt)); ?> ...
Обрабатываем ответ ajax запроса
В нашем примере мы помещаем ответ на ajax запрос в поле ‘output’. Делается это за счет указания его в параметре ‘update’.
Но предположим ajax запрос возвращает код страны. И нам надо выделить страну с этим кодом в списике ‘country_id’. Для того что бы обрабатывать ответ добавим поле «success»:
$ajaxOpt = array( 'type'=>'POST', 'url'=>CController::createUrl('site/AjexTest'), 'update'=>'#output', 'success' =>'function(data){ $("#country_id").val(data); }', 'data'=>array('input'=>'js:$("#input").val()'));
Модифицируем экшен AjexTest
public function actionAjexTest() { if(Yii::app()->request->isAjaxRequest){ if(isset($_POST['input'])){ echo CHtml::encode($_POST['input']); Yii::app()->end(); } } }
Теперь в поле «input» можно вводить код страны (от 1 до 3) и в поле «country_id» будет показываться нужная страна
грамотно объяснил, но если мы отправляем отправляем несколько аякс , как нам на сервере сортировать их только через функцию гетПост??
‘data’=>’js:$(«#form_»).serialize()’ — срабатывает только 1 раз.
При первом ajax запросе отдает форму и обновляет div по idу,
при последующих запросах без принудительного обновления всей страницы,
data = пустой строке 🙁
«Отравляем в ajax запросе все значения с формы» — ты убийца! зачем отравлять значения формы?