CListView ajax pagination and widget workin at ajaxLink

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
cioxideru
Сообщения: 26
Зарегистрирован: 2012.03.05, 17:57

CListView ajax pagination and widget workin at ajaxLink

Сообщение cioxideru »

Суть проблемы:
есть widget, в нем Chtml:ajaxLink
код виджета:

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

echo CHtml::ajaxLink(
                    Yii::t('site','Add to favorite'),
                    array('/default/favorite.ajax'),
                    array(
                        'type' => 'POST',
                        'replace' => '#widget_id_prefix_' . $id,
                        'dataType' => 'html',
                        'data'=>array(
                            'fav_uid'=>$this->fav_uid,
                            'action'=>'add',
                        )
                    )
                    ,array(
                        'id'=>'fw_link'.$id
                    )
                );
когда я использую widget в CDetailView как показано ниже:

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

шаблон: _favorites.php

$this->widget('zii.widgets.CDetailView', array(
    'data' => $data,
    'attributes' => array(
        array(
            'label' => 'Favorite',
            'type'=>'raw',
            'value'=> $this->widget('FavoriteLinkWidget', array(...),true),
        ),
    ),
));
соответственно шаблон где есть CDetailView в свою очередь использует:

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

$this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_favorites',
));
дабы избежать лишних вопросов, вот код из контроллера

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

if(Yii::app()->request->isAjaxRequest)
            $this->renderPartial('index', compact('dataProvider'),false, true);
        else
            $this->render('index', compact('dataProvider'));
На первой странице все корректно, но когда ajax paginator отдает 2ую страницу, начинается самое интересное.
ajaxLink перестают работать. page #2 приходит полностью корректная, есть скрипты, в консоле ошибок нету.
Все с первого взгляда хорошо и мне кажется что вся проблема в том что скрипты срабатывают перед тем как пагинатор вставляет новые элементы.

Ниже приведен небольшой пример контента который возвращается при аякс пагинации

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

<ul class="categoryList">
  <li>
    <a  href="#" id="fw_link31yw1">Romance</a></li>
  <li>
    <a href="#" id="fw_link32yw2">Mystery</a></li>
  <li>
    <a  href="#" id="fw_link33yw3">Thriller</a></li>
  <li>
    <a href="#" id="fw_link34yw4">Sci-Fi</a></li>
</ul>

// all the below stuff is written to the DOM by the ajaxLink() function using Javascript:

<script type="text/javascript">
/*<![CDATA[*/
$('body').on('click','#fw_link31yw1',function(){jQuery.ajax({'type':'POST','dataType':'html','data':{'fav_uid':'31','action':'remove'},'url':'/default/favorite.ajax','cache':false,'success':function(html){jQuery("#favorite_link_31yw1").replaceWith(html)}});return false;});
$('body').on('click','#fw_link32yw3',function(){jQuery.ajax({'type':'POST','dataType':'html','data':{'fav_uid':'32','action':'add'},'url':'/default/favorite.ajax','cache':false,'success':function(html){jQuery("#favorite_link_32yw3").replaceWith(html)}});return false;});
$('body').on('click','#fw_link33yw5',function(){jQuery.ajax({'type':'POST','dataType':'html','data':{'fav_uid':'33','action':'add'},'url':'/default/favorite.ajax','cache':false,'success':function(html){jQuery("#favorite_link_33yw5").replaceWith(html)}});return false;});
$('body').on('click','#fw_link34yw7',function(){jQuery.ajax({'type':'POST','dataType':'html','data':{'fav_uid':'34','action':'add'},'url':'/default/favorite.ajax','cache':false,'success':function(html){jQuery("#favorite_link_34yw7").replaceWith(html)}});return false;});
/*]]>*/
</script>
cioxideru
Сообщения: 26
Зарегистрирован: 2012.03.05, 17:57

Re: CListView ajax pagination and widget workin at ajaxLink

Сообщение cioxideru »

Для решения этой проблемы, нужно генерировать весь клиентский код в inline. т.е в обработчиках onclick onchange итд
Странно почему всеже стандартным образом CListView не может обработать отдельно приходящий jsкод и разметку генерируемую CHtml::AjaxLink.
uleen
Сообщения: 5
Зарегистрирован: 2013.05.31, 12:52

Re: CListView ajax pagination and widget workin at ajaxLink

Сообщение uleen »

если не трудно, можешь подробнее объяснить, как решил? второй день не могу найти ответа.
Мои новости на сайте выводятся с помощью CListView

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

<?php $this->widget('bootstrap.widgets.TbListView', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_viewnews',
       
)); ?>
сам элемент _viewnews

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

echo CHtml::ajaxLink(
        $data->title,
        Yii::app()->createUrl('News/show'),
        array('update' => '#news',
            'data'=>array(
                                'ajax'=>true,
                                'id'=>$data->id
                                ),
            
            ),
Собственно новости выводятся а при клике на тайтл новости срабатывает ajax который передаёт действию id. И всё работает чудесно ...
НО только на первой странице в пагинации, на второй не работает и далее ничего не работает. Инспектор Хрома уверяет что даже никаких данных не передаётся
uleen
Сообщения: 5
Зарегистрирован: 2013.05.31, 12:52

Re: CListView ajax pagination and widget workin at ajaxLink

Сообщение uleen »

Если кому интересно ответ на мой вопрос:
<?php $this->widget('bootstrap.widgets.TbListView', array(
'dataProvider'=>$dataProvider,
'itemView'=>'_viewnews',
'ajaxUpdate'=>false,
)); ?>
Нужно было добавить
'ajaxUpdate'=>false,
Tpona
Сообщения: 222
Зарегистрирован: 2011.06.05, 19:00

Re: CListView ajax pagination and widget workin at ajaxLink

Сообщение Tpona »

'ajaxUpdate'=>false - делает переход по страницам с перегрузкой самой страницы

Но проблема с аяксом осталась, если мне хочется всеже оставить листание через аякс как тогда быть?
cioxideru, не совсем понятно что ты предлагаешь? Можно примерчик, как в onclick произвести требуемое действие, например запрос на удаление или редактирование сущности?
Ответить