AJAX в Yii
31 мая 2009
В PHP-фреймворке Yii неплохо реализована интеграция с jQuery. Попробую разобрать пример простой асинхронной обработки формы.
Создадим новый контроллер AjaxController. Запустить его можно будет как http://localhost/ajax/.
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, )); } } }
Теперь опишем форму:
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 по email OK
У меня в контролере несколько разных ajax запросов. Как я понял проверить можно на наличие в post массиве той или иной переменной. А есть ли более красивый способ?
Нет.
Еще вопросик, если можно. У меня возникла проблема при работе с разными ajax запросами созданными через ajaxlink на разные экшены - срабатывал всегда первый. Поковырявшись немного, я понял в чем дело. Произошло пересечение id, которыми награждает ajaxlink. Попробовал кинуть свои id через htmlOptions - ajax не работает, не срабатывает даже beforeSend. Подскажете что нибудь?
Проблема решена. Не правильно был описан renderPartial, из которого я пытался вызвать ajax запрос.
Хуйня, спизженно с официальной документации, плодите плагиатщину и ничего больше!
anon, с этой? ;)
anon, в офф документации статья Sam Dark
в каком файле?
/protected/views/ajax/form.php - в файле, который будет отображаться )
спасибо! папка ajax от имени контроллера файл form - от $this->render('form',...
правильно?
Да именно так. ) В общем-то как и любая другая вьюха =)
Приветствую. После загрузки контента, к примеру через ajaxButton (при выводе через renderPartial) возникат проблема, связанна с тем, что есть в загруженной вьюхе есть ajaxButton или другие подобные элемнты - они не срабатывают, ясное дело на наих live не повешен. Однако это делает бесполезными элементы типа ajaxButton, загруженные по AJAX. Ясное дело что решение есть, как-то повесить live на ID батона, однако интереснее найти более элегантное решение. )
Максим Ekstazi обещал релизнуть такое решение.
Как решить проблему?.. Если тип запроса GET, то YII_CSRF_TOKEN передается и все 200ОК. А если меняю на POST, то ошибка 'The CSRF token could not be verified.'. Как передавать токен при пост запросе? И еще: CJSON::encode($q); сериализует в json, но разбор получается только, если убрать [ ] (квадратные скобки) в начале и в конце строки.
Если форма собирается Yii, то он генерт токен, если нет — придётся примерно вот так.
Sam, привет! Таки я разобрался с этой темой, правда возникает такая проблема: если несколько раз нажимать кнопку Редактировать или Просмотр в CRUD (gridview), то создается куча подключений скриптов из assets, например jquery.min.js, и куча GET'ов текущего урла. Наверно запутано получилось, но смотрел в нете варианты решения, ни один не помог (((
Это решается расширением NLSClientScript.
Спасибо, читал про него в habrahabr.ru/post/140109/&post=-20629724_98055/ Неужели без него никак? ((
Подключил, но оно не работает (( правда я не знаю что писать в параметры includePattern и excludePattern. Не подскажет кто-нибудь?
А какой или какие js файлы конкретно отвечают, за такие ajax запросы, мне пришлось отказаться от стандартной библиотеки идущей с установкой, пока не нашел для ajaxsubmitbutton?
А есть ли решение отправлять аяксом данные формы?