AJAX в Yii

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

AJAX в Yii

Сообщение samdark »

Попробую разобрать пример простой асинхронной обработки формы.

Создадим новый контроллер 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();?>
Оригинал
Аватара пользователя
Ozzy
Сообщения: 269
Зарегистрирован: 2009.04.02, 15:09
Откуда: Украина, Одесса

Re: AJAX в Yii

Сообщение Ozzy »

нормал :)
Мой маленький блог - http://dbhelp.ru
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: AJAX в Yii

Сообщение slavcodev »

Для удобства проверки асинхронного запроса, в Yii есть соответсвущий фильтр.

Дополним контроллер из первого поста, добавив ограничения на экшн index:

Код: Выделить всё

class AjaxController extends CController {
    public function filters() {
        return array(
            'ajaxOnly + index',
        );
    }
} 
Жду Yii 3!
Аватара пользователя
Ozzy
Сообщения: 269
Зарегистрирован: 2009.04.02, 15:09
Откуда: Украина, Одесса

Re: AJAX в Yii

Сообщение Ozzy »

Вот это кул дополнение ) сенк
Мой маленький блог - http://dbhelp.ru
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: AJAX в Yii

Сообщение samdark »

Добавлена информация о том, что при включенной защите от CSRF необходимо передавать параметром токен: http://yiiframework.ru/doc/cookbook/ru/js.ajax
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: AJAX в Yii

Сообщение slavcodev »

Sam,

Код: Выделить всё

// Результат запроса записываем в элемент, найденный по CSS-селектору #output.
'update' => '#output', 
Откуда это он запишет результат куда-то?
В доке написано что третий параметр это массив ajaxOption с jQuery, там нет такой опции.
Жду Yii 3!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: AJAX в Yii

Сообщение samdark »

В jQuery нет, но Yii её добавляет: http://www.yiiframework.com/doc/api/1.0 ... jax-detail
Аватара пользователя
bartersib
Сообщения: 17
Зарегистрирован: 2009.12.16, 12:03
Откуда: Россия, Красноярск
Контактная информация:

Re: AJAX в Yii

Сообщение bartersib »

Как можно это (или что взамен) использовать для динамически создаваемых форм (js-ом создается на странице, например с использованием thickbox)
При этом на странице не создается обработчик jQuery('#submit_element_ID').click(...)

Подскажите как выкрутиться.
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: AJAX в Yii

Сообщение timlar »

bartersib писал(а):Как можно это (или что взамен) использовать для динамически создаваемых форм (js-ом создается на странице, например с использованием thickbox)
При этом на странице не создается обработчик jQuery('#submit_element_ID').click(...)

Подскажите как выкрутиться.
Подключить свой js-скрипт, в котором описать создание формы.
Twitter: @timlar_ua
Аватара пользователя
bartersib
Сообщения: 17
Зарегистрирован: 2009.12.16, 12:03
Откуда: Россия, Красноярск
Контактная информация:

Re: AJAX в Yii

Сообщение bartersib »

Сорри, если невнятно вопрос задал. HTML формы создается на сервере и тянется ajax-om на страницу. Надо валидить эту форму по примеру первого поста.
Сейчас отправляю поля формы на сервер самописным ajax-om. Както криво смотрится.
dimas1313
Сообщения: 14
Зарегистрирован: 2010.08.04, 20:47

Re: AJAX в Yii

Сообщение dimas1313 »

Подскажите, пожалуйста. А как сделать то же самое, но только не нажимаю кнопку?
Сейчас как - мы набираем маленькие буквы в первом поле, потом нажимаем кнопку - и они появляются во втором поле большими.
А что бы было так - мы только набрали одну маленькую буковку - она сразу появляется большой во втором поле - как это реализовать?
Через CActiveForm? Там только enableAjaxValidation. Значения полей по ajax не вернешь.
Остается использовать CHtml и писать свой скрипт обработки событий?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: AJAX в Yii

Сообщение samdark »

Да.
dimas1313
Сообщения: 14
Зарегистрирован: 2010.08.04, 20:47

Re: AJAX в Yii

Сообщение dimas1313 »

Спасибо большое
Tungsten
Сообщения: 8
Зарегистрирован: 2010.11.18, 14:38

Re: AJAX в Yii

Сообщение Tungsten »

Может мне кто-то, пожалуйста, подсказать, почему у меня не отсылается аяксовый запрос? Чего не хватает в коде? При нажатии на кнопку отправляется обычный запрос на сервер с последующей загрузкой страницы.

Код: Выделить всё

<?php echo CHtml::beginForm(); ?>

        <?php echo CHtml::textField('TITLE', $deliverable->TITLE); ?>

        <?php
        echo CHtml::ajaxSubmitButton('Save', '/deliverable/ajax/update', array(
            'type' => 'POST',
            'success'=>'function(resposne) { formResponse(response); }'
        ));
        ?>

 <?php echo CHtml::endForm(); ?>

<script type="text/javascript">
    function formResponse(response)
    {
        console.log('r: ', response);
    }
</script>
Нужно добавить, что эта форма загружается аяксом. Возможно, не проходит какая-то инициализация...

Спасибо.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: AJAX в Yii

Сообщение samdark »

Код: Выделить всё

'success'=>'js:function(resposne)
ap0stal
Сообщения: 15
Зарегистрирован: 2010.12.23, 11:17
Откуда: Екатеринбург
Контактная информация:

Re: AJAX в Yii

Сообщение ap0stal »

Опа, спасибо. У меня была проблема, с тем что Yii мой код в свойстве виджета считал PHP-кодом и ругался на то что функции не существует. Значит просто поставить, по аналогии префикс js:?
"Отказ -- это предложение поднять цену" Жорж Элгози
Аватара пользователя
Dr.Death
Сообщения: 129
Зарегистрирован: 2011.05.07, 18:24
Контактная информация:

Re: AJAX в Yii

Сообщение Dr.Death »

Подскажите как добавить дополнительные параметры в форму при использовании ajaxSubmitButton чтоб собственно этот запрос и отследить, например ajax=preview, data удаляет параметры формы :(
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: AJAX в Yii

Сообщение Insolita »

т.е. по сути это реализуется вариант php -ajax по методике ближе к работе библиотек xajax и phpQuery ?
А возможно ли реализовать в приведенном примере дополнительн кнопку "Стоп" - которая при нажатии прервала бы выполнение php -сценария ?
Ra1
Сообщения: 4
Зарегистрирован: 2012.01.13, 08:32

Re: AJAX в Yii

Сообщение Ra1 »

Привет!

Как провести валидацию двух моделей с приходящих с одной формы?

Код: Выделить всё

$jurlico = new Jurlico;
$fizlico = new Fizlico;
if(isset($_POST['ajax']) && $_POST['ajax']==='registration-form')
{
   echo CActiveForm::validate($jurlico);
   Yii::app()->end();
}
Как вместе с этим провалидировать $fizlico?

---

Нашел рецепт:
http://www.yiiframework.com/wiki/218/ho ... n-edition/

Если кому нужно могу перевести.
Аватара пользователя
nizsheanez
Сообщения: 814
Зарегистрирован: 2011.04.29, 13:09
Откуда: Москва

Re: AJAX в Yii

Сообщение nizsheanez »

передавайте массив моделей в CActiveForm::validate
Ответить