Yii & Ajax

Примеры работы Yii 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» будет показываться нужная страна

Yii & Ajax: 3 комментария

  1. Аноним

    грамотно объяснил, но если мы отправляем отправляем несколько аякс , как нам на сервере сортировать их только через функцию гетПост??

  2. Аноним

    ‘data’=>’js:$(«#form_»).serialize()’ — срабатывает только 1 раз.
    При первом ajax запросе отдает форму и обновляет div по idу,
    при последующих запросах без принудительного обновления всей страницы,
    data = пустой строке 🙁

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *