AJAX в Yii

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Аватара пользователя
chungachguk
Сообщения: 435
Зарегистрирован: 2012.07.17, 11:52

Re: AJAX в Yii

Сообщение chungachguk »

Спасибо. Нашел в чем косяк был. Испорчены системные файлы были.
unet900
Сообщения: 7
Зарегистрирован: 2012.04.02, 23:36

Re: AJAX в Yii

Сообщение unet900 »

Не хватает примера для обычной ссылки по щелчку на которой выдается кусок html.
+ если есть плагины для AJAX не мешало бы их тут привести
alimexe
Сообщения: 3
Зарегистрирован: 2013.03.14, 15:46

Re: AJAX в Yii

Сообщение alimexe »

а как быть если данные должны придти не в

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

echo CHtml::textArea('output', $output); 
, а в

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

echo CHtml::textField('output', $output); 
не нашел или не понял в доках
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: AJAX в Yii

Сообщение anton44eg »

какая разница?
alimexe
Сообщения: 3
Зарегистрирован: 2013.03.14, 15:46

Re: AJAX в Yii

Сообщение alimexe »

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

Re: AJAX в Yii

Сообщение samdark »

textField генерит input, в него тем же методом значение не записать. Нужно писать в его свойство value.
bl4
Сообщения: 2
Зарегистрирован: 2013.03.26, 10:21

Re: AJAX в Yii

Сообщение bl4 »

Подскажите такую вещь, есть параметр 'update' => '#output', в поле с id = #output вставляются данные которые передает функция. Собственно вопрос: можно ли как то обновить несколько полей сразу (нужно вставить разные данные), либо при нажатии на кнопку отправить несколько запросов.
Для болей наглядности опишу что я делаю, есть корзина интернет магазина, необходимо что бы при изменение количества, менялась стоимость данной позиции и общая сумма, общее количество.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: AJAX в Yii

Сообщение samdark »

Тут придётся написать JavaScript самостоятельно.
Maxgen
Сообщения: 2
Зарегистрирован: 2012.12.03, 00:26

Re: AJAX в Yii

Сообщение Maxgen »

Повторил Ваш пример с формой.

Пытался задать для клавиши в HtmlOptions id для тега клавиши:

echo CHtml::ajaxSubmitButton('Обработать', '', array(
'type' => 'POST',
//Задаем параметр 'id' для тега
'id' => 'MyButton',
// Результат запроса записываем в элемент, найденный
// по CSS-селектору #output.
'update' => '#output',
),

Но система меняет id:

<input id="yt0" type="submit" value="Обработать" name="yt0">

Для таких кнопок система сама ведет именование.
Но если попытаться также задать атрибут 'class' то он просто не формируется.

Клавишу надо как-то в отдельный <div> оборачивать?

Нельзя ли было бы на сайте какой-то справочник по нестандартным применениям htmlOptions завести?
В описании классов некоторые описаны, но не все.
alexander.05
Сообщения: 1
Зарегистрирован: 2013.04.18, 22:16

Re: AJAX в Yii

Сообщение alexander.05 »

Доброго времени суток всем,

Вот тоже интересует использование ajax, со стандартным примером разобрался, тут ничего сложного, но он ограничивается только тем что подменяет содержимое тега.

Допустим у меня форма в попапе, после успешной отправки хочу заменить контент формы, нотисом об успехе.
контроллер может возвратить мне массив с

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

 array('success' => true);
либо в случае ошибок, например,

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

 array('error' = array('wrong_email' => true, 'no_name' => true )); 
вижу решение, как и всегда делать это через скрипт jquery,
но как мне получить в js выходной массив данных чтобы я смог его обработать :)
OKyJIucT
Сообщения: 33
Зарегистрирован: 2013.06.24, 14:31

Re: AJAX в Yii

Сообщение OKyJIucT »

Добрый день. Возник следующий вопрос - как с помощью этого рецепта можно обновлять таблицу без перезагрузки все страницы?

Идея следующая - есть определенный список в таблице (строки из базы данных). И в каждой строке есть кнопка "Удалить". Вот хотелось бы, чтобы сама таблица обновлялась после удаления без перезагрузки страницы.

имею такой код:

Контроллер

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

class PostController extends Controller
{
public function actionHistory()
    {
        $name = Yii::app()->user->name;
        
        if(isset($_POST['deleteTurn']))
        {
            $idTurn = Turn::model()->findByAttributes(array('md5' => $_POST['turnId']));
            
            Turn::model()->deleteByPk($idTurn['id']);
            
            $turnList = Turn::model()->findAllByAttributes(array('owner' => $name));
 
            // если запрос асинхронный, то нам нужно отдать только данные
            if(Yii::app()->request->isAjaxRequest)
            {
                $this->render('_test', array(
                    'turnList'=>$turnList,
                ));
                // Завершаем приложение
                Yii::app()->end();
            }
    }
        
    $turnList = Turn::model()->findAllByAttributes(array('owner' => $name));

        $this->render('history', array(
            'turnList'=>$turnList,
        ));


}
}
 
Вид

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


<div class="row">
    
    <div class="col col-lg-12" id="output">

        <?php echo $this->renderPartial('_test', array('turnList' => $turnList)); ?>

    </div>
    
</div>

и собственно сам _test

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


<table class="table table-hover">
    <thead>
    <tr>
        <th>#</th>
        <th class="text-center">Аккаунт</th>
        <th class="text-center">Время</th>
        <th class="text-center">Удалить</th>
    </tr>
    </thead>
    <tbody>

    <?php
        $i = 0;
        foreach($turnList as $turn)
        {
            $i++;
    ?>

    <tr>
        <td><?=$i;?></td>
        <td><?=$turn->account;?></td>
        <td class="text-center"><?=$turn->random;?></td>
        <td class="text-center">
            <form method="post">
                <input type="hidden" name="turnId" value="<?=$turn->md5;?>">
                <?php
                    echo CHtml::ajaxSubmitButton('Обработать', '', array(
                        'type' => 'POST',
                        // Результат запроса записываем в элемент, найденный
                        // по CSS-селектору #output.
                        'update' => '#output',
                    ),
                    array(
                        // Меняем тип элемента на submit, чтобы у пользователей
                        // с отключенным JavaScript всё было хорошо.
                        'type' => 'submit',
                        'name' => 'deleteTurn'
                    ));
                ?>
            </form>
        </td>
    </tr>

    <?php
        }
    ?>

    </tbody>
</table>

Так вот - при нажатии кнопки информация без перезагрузки меняется, но получается сайт в сайте. Сам блок с id="output", внутри которого и должна обновляться инфа, заполняется копией сайта (будто iframe вставили в этот блок с ссылкой на эту же страницу). Подскажите, где у меня ошибка? Премного благодарен))

Я начинающий программист, и Yii недавно только начал изучать, потому за кривой код просьба сильно не пинать :lol:
Последний раз редактировалось OKyJIucT 2013.06.24, 15:05, всего редактировалось 2 раза.
OKyJIucT
Сообщения: 33
Зарегистрирован: 2013.06.24, 14:31

Re: AJAX в Yii

Сообщение OKyJIucT »

Оказывается, все намного проще, чем я думал - надо было всего лишь подключить JQuery к сайту :)

Проблема частично решена - сайт теперь не выглядит как подгруженный через iframe, но подгрузка части контента через AJAX не работает.

В общем, методом проб и ошибок удалось добиться работы через AJAX, все дело в невнимательности))
Данил
Сообщения: 13
Зарегистрирован: 2013.06.10, 12:20

Re: AJAX в Yii

Сообщение Данил »

Подскажите, вот мне нужно сделать сохранение модели через модальное окно.
вид

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

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'createCatForm',
        'action'=>'/administrator/createcat',
    'enableClientValidation'=>true,
    'enableAjaxValidation'=>true,
    'clientOptions'=>array(
        'validateOnSubmit'=>false,
    ),
)); ?>
//тут текстовые поля и тд.
<?php
echo CHtml::ajaxSubmitButton('Обработать', '/administrator/CreateCat', array(
    'type' => 'POST',
    'update' => '#output',
),
array(
    'type' => 'submit'
));*/
?>
<?php $this->endWidget(); ?>
контроллер

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

protected function performAjaxValidation($newCategory)
        {
            if(Yii::app()->request->isAjaxRequest)
                {
                    $newCategory->save();
                    echo 'success';
                    Yii::app()->end();
                }
        }
public function actionCreateCat()
                {
                    $newCategory=new Tree_admin;
                    $model=new changeForm;
                    if(isset($_POST['Tree_admin']))
                        {   
                            $newCategory->attributes=$_POST['Tree_admin'];
                            $newCategory->alias=Yii::app()->translit->make($newCategory->title);
                            $newCategory->parent_id=$_POST['Tree_admin']['parent'];
                            $newCategory->level=$newCategory->parent_id+1;
                            if ($newCategory->validate())
                                {
                                    $this->performAjaxValidation($newCategory);
                                }
                                //else {var_dump($newCategory->getErrors());}
                        }    
                                $this->renderPartial('createCatForm', array(
                                'model'=>$newCategory,
                                'list'=>array('0'=>'root')+$newCategory->getTabList(),
                            ),
                            false,true
                            );
               }
проблема в том, что у меня происходит сохранение модели еще того, как я нажимаю кнопку submit.
пробовал вместо

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

if(Yii::app()->request->isAjaxRequest)
делать

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

if(isset($_POST['ajax']) && $_POST['ajax']==='Tree_admin')
но проблема в том, что $_POST['ajax'] ПУСТОЙ, не пойму, почему.
пробовал разные варианты отправки через ajax, например свой костыль

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

$('body').on('click', '.create', function(){
   var formdata=$('#createCatForm').serializeArray();
   $.ajax({
               url: '/administrator/createcat',             
               dataType : "html",
               data:formdata,
               type: 'POST',
               success: function (answer)
               {
                   if (answer=='success')
                   {
                        removeModal();
                        $('#sideReload').empty();
                        $('#sideReload').load("/administrator #categories");
                   }
                   else 
                   {
                       $('#modal').empty();
                       $('#modal').append(answer);
                   }
               }
           })
});
и через json тоже пробовал передавать,
как бы все работает, но происходит сохранение до нажатия на submit, и $_POST['ajax'] пустой в любом случае.
Подскажите пожалуйста, как все таки сделать, чтобы и ajax валидация у клиента работала, но при этом сохранение происходило только при нажатии submit. Спасибо.
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: AJAX в Yii

Сообщение lancedevnull »

if ($newCategory->validate())
{
$this->performAjaxValidation($newCategory);
}


это бред, посмотрите как сделано в блоге
Аватара пользователя
Akulenok
Сообщения: 437
Зарегистрирован: 2014.05.05, 18:32
Откуда: localhost

Re: AJAX в Yii

Сообщение Akulenok »

Подскажите как проверять ajax запросы, например в гриде нажимаю удаление
и хочу в контроллере посмотреть VarDumper::dump($model); die();
но этот код не срабатывает, как мне вывести на экран инфу?
ភាសាខ្មែរ Yii2 - это кайф!
Joseph Jevelin
Сообщения: 339
Зарегистрирован: 2012.01.06, 22:07

Re: AJAX в Yii

Сообщение Joseph Jevelin »

Akulenok писал(а):Подскажите как проверять ajax запросы, например в гриде нажимаю удаление
и хочу в контроллере посмотреть VarDumper::dump($model); die();
но этот код не срабатывает, как мне вывести на экран инфу?
Использовать Firebug.
Ответить