<rmcreative>

RSS

AJAX в Yii

31 мая 2009

В PHP-фреймворке Yii неплохо реализована интеграция с jQuery. Попробую разобрать пример простой асинхронной обработки формы.

Создадим новый контроллер AjaxController. Запустить его можно будет как http://localhost/ajax/.

<?php
class AjaxController extends CController {
    // actionIndex вызывается всегда, когда action не указан явно.
    function actionIndex(){
    $input = $_POST['input'];
        // для примера будем приводить строку к верхнему регистру
    $output = mb_strtoupper($input, 'utf-8');
 
        // если запрос асинхронный, то нам нужно отдать только данные
    if(Yii::app()->request->isAjaxRequest){
        echo CHtml::encode($output);
    }
    else {
            // если запрос не асинхронный, отдаём форму полностью
        $this->render('form', array(
        'input'=>$input,
        'output'=>$output,
        ));
    }
    }
}

Теперь опишем форму:

<?php echo CHtml::form();
 
echo CHtml::label('Текст', 'input');
echo CHtml::textArea('input', $input); 
 
echo CHtml::label('Результат', 'output');
// name и id для textarea автоматически заданы как 'output'.
echo CHtml::textArea('output', $output);
 
// Второй параметр пуст, значит отсылаем данные на тот же URL. Третий параметр задаёт опции запроса. Подробнее с ними можно ознакомиться в документации jQuery.
echo CHtml::ajaxSubmitButton('Обработать', '', array(
    'type' => 'POST',
    // Результат запроса записываем в элемент, найденный по CSS-селектору #output.
    'update' => '#output',
),
array(
    // Меняем тип элемента на submit, чтобы у пользователей с отключенным JavaScript всё было хорошо.
    'type' => 'submit'
)); 
 
echo CHtml::endForm();?>

Комментарии RSS

  1. №4345
    flashimagee
    flashimagee 12 апр. 2011 г., 1:31:18
    Yii::app()->request->isAjaxRequest

    У меня в контролере несколько разных ajax запросов. Как я понял проверить можно на наличие в post массиве той или иной переменной. А есть ли более красивый способ?

  2. №4347
    Sam
    Sam 12 апр. 2011 г., 16:08:03

    Нет.

  3. №4374
    flashimagee
    flashimagee 13 апр. 2011 г., 1:27:34

    Еще вопросик, если можно. У меня возникла проблема при работе с разными ajax запросами созданными через ajaxlink на разные экшены - срабатывал всегда первый. Поковырявшись немного, я понял в чем дело. Произошло пересечение id, которыми награждает ajaxlink. Попробовал кинуть свои id через htmlOptions - ajax не работает, не срабатывает даже beforeSend. Подскажете что нибудь?

  4. №4375
    flashimagee
    flashimagee 13 апр. 2011 г., 3:18:39

    Проблема решена. Не правильно был описан renderPartial, из которого я пытался вызвать ajax запрос.

  5. №5039
    anon
    anon 19 июля 2011 г., 7:18:41

    Хуйня, спизженно с официальной документации, плодите плагиатщину и ничего больше!

  6. №5041
    Sam
    Sam 19 июля 2011 г., 14:18:27

    anon, с этой? ;)

  7. №5479
    Omskmax
    Omskmax 07 окт. 2011 г., 14:19:22

    anon, в офф документации статья Sam Dark

  8. №5945
    jedi
    jedi 22 февр. 2012 г., 0:39:46

    Теперь опишем форму:

    в каком файле?

  9. №5946
    omskmax
    omskmax 22 февр. 2012 г., 6:58:20

    /protected/views/ajax/form.php - в файле, который будет отображаться )

  10. №5947
    jedi
    jedi 22 февр. 2012 г., 7:44:25

    спасибо! папка ajax от имени контроллера файл form - от $this->render('form',...

    правильно?

  11. №5948
    omskmax
    omskmax 22 февр. 2012 г., 8:40:36

    Да именно так. ) В общем-то как и любая другая вьюха =)

  12. №6053
    Евгений
    Евгений 15 марта 2012 г., 17:33:25

    Приветствую. После загрузки контента, к примеру через ajaxButton (при выводе через renderPartial) возникат проблема, связанна с тем, что есть в загруженной вьюхе есть ajaxButton или другие подобные элемнты - они не срабатывают, ясное дело на наих live не повешен. Однако это делает бесполезными элементы типа ajaxButton, загруженные по AJAX. Ясное дело что решение есть, как-то повесить live на ID батона, однако интереснее найти более элегантное решение. )

  13. №6056
    Sam
    Sam 15 марта 2012 г., 20:55:44

    Максим Ekstazi обещал релизнуть такое решение.

  14. №6123
    acid23m
    acid23m 12 апр. 2012 г., 17:13:03

    Как решить проблему?.. Если тип запроса GET, то YII_CSRF_TOKEN передается и все 200ОК. А если меняю на POST, то ошибка 'The CSRF token could not be verified.'. Как передавать токен при пост запросе? И еще: CJSON::encode($q); сериализует в json, но разбор получается только, если убрать [ ] (квадратные скобки) в начале и в конце строки.

  15. №6126
    Sam
    Sam 14 апр. 2012 г., 21:06:15

    Если форма собирается Yii, то он генерт токен, если нет — придётся примерно вот так.

  16. №7191
    Одиночка Айс
    Одиночка Айс 06 дек. 2012 г., 17:23:44

    Sam, привет! Таки я разобрался с этой темой, правда возникает такая проблема: если несколько раз нажимать кнопку Редактировать или Просмотр в CRUD (gridview), то создается куча подключений скриптов из assets, например jquery.min.js, и куча GET'ов текущего урла. Наверно запутано получилось, но смотрел в нете варианты решения, ни один не помог (((

  17. №7192
    Sam
    Sam 06 дек. 2012 г., 18:14:32

    Это решается расширением NLSClientScript.

  18. №7196
    Одиночка Айс
    Одиночка Айс 07 дек. 2012 г., 16:59:58

    Спасибо, читал про него в habrahabr.ru/post/140109/&post=-20629724_98055/ Неужели без него никак? ((

  19. №7197
    Одиночка Айс
    Одиночка Айс 07 дек. 2012 г., 17:53:39

    Подключил, но оно не работает (( правда я не знаю что писать в параметры includePattern и excludePattern. Не подскажет кто-нибудь?

  20. №7368
    Владимир
    Владимир 09 янв. 2013 г., 15:39:51

    А какой или какие js файлы конкретно отвечают, за такие ajax запросы, мне пришлось отказаться от стандартной библиотеки идущей с установкой, пока не нашел для ajaxsubmitbutton?

  21. №7798
    Евгений
    Евгений 11 апр. 2013 г., 14:59:54

    А есть ли решение отправлять аяксом данные формы?

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.