[РЕШЕНО]ajaxButton

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Whirpool
Сообщения: 14
Зарегистрирован: 2013.10.14, 10:46

[РЕШЕНО]ajaxButton

Сообщение Whirpool »

Здравствуйте, при изучении Yii столкнулся со следующей проблемой.

Дано:
На странице есть ListView с отображаемыми записями. У каждой записи есть ajax кнопка рейтинга - по первому нажатию добавляется голос, по второму этот голос забирается.
В боковом меню есть форма фильтрации но нескольким критериям. Запрос из формы идет через ajaxSubmitButton.

Проблема:
Поиск записей проходит правильно, вывожу view через renderPartial, processOutput = true, т.е. все скрипты на отображаемой странице работают корректно, но
а. Если после поиска записей по критериям на первую страницу попадает запись, которая до поиска была на первой странице, кнопка рейтинга отправляет два ajax запроса(срабатывает скрипт который был изначально на странице, а также из фрагмента добавленным черехз ajax);
b. если перейти на вторую или более страницу используя постраничную навигацию, то на странице корректно работают все скрипты, кроме кнопки рейтинга(не отправляет запрос);

Ели вопрос кажется глупым, не кидайтесь тапками, я всего лишь учусь.
Спасибо.

Проблему с дублированием запросов решил путем добавления к кнопке рейтинга htmlOptions параметра 'live' => false.
Остается только работа на второй и более странице. Если в ListView установить 'updateAjax' => fasle, то ни один из скриптов не загрузится и страница отобразится некорректно и с ошибками, а также т.к. ajax запрос с формы поиска идет через GET, при переходе на следующую страницу все параметры из формы идут в адресную строку, даже если некоторые пустые.
Последний раз редактировалось Whirpool 2013.12.06, 18:38, всего редактировалось 2 раза.
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: ajaxButton

Сообщение Nafania »

При обновлении грида или списка все надо навешивать через on или не использовать ajax обновление.
Whirpool
Сообщения: 14
Зарегистрирован: 2013.10.14, 10:46

Re: ajaxButton

Сообщение Whirpool »

сейчас стоит на кнопке рейтинга:

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

jQuery('body').on('click','#ratingBtn_105',function(){jQuery.ajax({'type':'POST','data':{'id':'105'},'cache':false,'dataType':'json','success':function(result){
                            $("#rating_105").html(result[0]);
                            $("#ratingBtn_105 i:first-child").attr({"class":result[1]});
                        },'url':'/index.php?r=posts/ajaxRating'});return false;}); 
а если установить ajaxUpdate в false у ListView, то не запускаются никакие скрипты и страница загружается не корректно
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: ajaxButton

Сообщение flashimage »

перепишите так и все будет ок

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

jQuery('#ratingBtn_105').on('click',function(){jQuery.ajax({'type':'POST','data':{'id':'105'},'cache':false,'dataType':'json','success':function(result){
                            $("#rating_105").html(result[0]);
                            $("#ratingBtn_105 i:first-child").attr({"class":result[1]});
                        },'url':'/index.php?r=posts/ajaxRating'});return false;});  
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
Whirpool
Сообщения: 14
Зарегистрирован: 2013.10.14, 10:46

Re: ajaxButton

Сообщение Whirpool »

обнаружил, что при отображении результата запроса из формы, на первой странице js код выглядит так, как я указал ранее.
При перемещении по страницам в ajax контенте js код выглядит так, как указали Вы.
Вот код кнопки рейтинга, ели он нужен:

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

$this->widget('bootstrap.widgets.TbButton', array(
                    'buttonType'  => 'ajaxButton',
                    'size'        => 'small',
                    'icon'        => ($data->checkVote($data->id)) ? 'icon-thumbs-down' : 'icon-thumbs-up',
                    'url'         => $this->createUrl('posts/ajaxRating'),
                    'ajaxOptions' => array(
                        'type'     => 'POST',
                        'data'     => array('id' => $data->id),
                        'cache'    => false,
                        'dataType' => 'json',
                        'success'  => 'js:function(result){
                            $("#rating_' . $data->id . '").html(result[0]);
                            $("#ratingBtn_' . $data->id . ' i:first-child").attr({"class":result[1]});
                        }',
                    ),
                    'htmlOptions' => array(
                        'id'   => 'ratingBtn_' . $data->id,
                        'live' => false,
                    )
                )
            ); 
Спасибо.
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: ajaxButton

Сообщение flashimage »

до вывода листа
CHtml::$liveEvents=false
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
Whirpool
Сообщения: 14
Зарегистрирован: 2013.10.14, 10:46

Re: ajaxButton

Сообщение Whirpool »

flashimage писал(а):перепишите так и все будет ок
Я так понял, это исправление дублирования запросов?
Спасибо, но я уже решил этот вопрос добавив в htmlOptions 'live' => false.
Осталась проблема игнорирования события для кнопки рейтинга, во второй и последующих страницах.

Спасибо.
Whirpool
Сообщения: 14
Зарегистрирован: 2013.10.14, 10:46

Re: ajaxButton

Сообщение Whirpool »

Проблема решена.
переделал из ajaxButton в button и написал на js один обработчик для всех кнопок, теперь код страницы стал чище и все функционирует как надо. Спасибо за советы.
Ответить