2013-05-31 6 views
0

У меня проблема. Я использую добавление комментария ajax, поэтому мне нужно обновить listview. И после этого мне нужно выбрать последнюю страницу списка.Yii CListView выберите последнюю страницу, после обновления

А может выбрать последнюю страницу при загрузке, используя этот

$dataProvider = new CArrayDataProvider($model->comments); 
$pager=$dataProvider->pagination; 
$pager->itemCount=$dataProvider->totalItemCount; 
if(!Yii::app()->request->isAjaxRequest) 
    $pager->currentPage=$pager->pageCount; 

Я могу ручное обновление CListView

$.fn.yiiListView.update("commentsList"); 

Но, я не могу сделать это все вместе :) Я также попытался пройти массив данных, к обновлению функции javascript. Итак, мне нужно добавить комментарий, используя ajax, тогда мне нужно обновить clistview и выбрать последнюю страницу. Любые идеи, как я могу это сделать?

+0

Вы пытались представить комментарии в обратном порядке? – topher

+0

конечно :), но я заинтересован в asc odder, я думаю, что это более удобно. –

ответ

2

В качестве обходного пути вы можете вызвать событие click на кнопку «Последняя страница» пейджера.

$('#pagination li.last a').trigger('click'); 
+1

спасибо, я думаю, что буду использовать его, если больше нет собственного решения;) –

1

После нескольких попыток я наконец добился желаемого поведения. Это было тяжелее, чем я ожидал, может быть, есть более простой способ, но у меня есть то, что у меня есть.

Таким образом, я использовал

div.keys 

Это CListView использует для предоставления URL-адреса данных для обновления.

Каждый раз, когда пользователь добавляет или удалить комментарий, мы называем метод обновления

$.fn.yiiListView.update('commentsList'); 

Это берет название атр из div.keys. Итак, я решил изменить заголовок attr вручную, прежде чем вызывать метод обновления. Я также необходимую информацию о общем количестве страниц, поэтому я добавить класс к моему commentsList

$this->widget('bootstrap.widgets.TbListView',array(
      'dataProvider'=>$dataProvider, 
      'itemView'=>'/comment/_comment', 
      'id'=>'commentsList', 
      'htmlOptions' => array(
       "class"=>$pager->pageCount, 
      ), 
     )); 

Я написал функцию, чтобы получить всю информацию

var getUrlInfo = function() { 
    var divKeys = commentsBlock.find('div.keys'), 
     keys = divKeys.attr('title'), 
     currentPage = "", 
     lastPage = parseInt (commentsBlock.find('#commentsList').attr('class')) +1, 
     temp = keys.lastIndexOf("page=") + 5, 
     pageNumberIndex = temp; 

    while (!isNaN(parseInt(keys[temp]))) { 
      currentPage +=keys[temp]; 
      temp++; 
    }; 

    return {'divKeys':divKeys, 'keys':keys, 'currentPage':currentPage,  'lastPage':lastPage, 'pageNumberIndex':pageNumberIndex}; 
}; 

И после этого, я установил правила, чтобы изменить название Аттрибут для добавления комментария var urlInfo = getUrlInfo(); , если (urlInfo.currentPage.length) { urlInfo.divKeys.attr ( 'название', urlInfo.keys.slice (0, urlInfo.pageNumberIndex) + urlInfo.lastPage + urlInfo.keys.slice (urlInfo.pageNumberIndex + urlInfo.currentPage.length) ); }

  else { 
       if (urlInfo.keys.indexOf('ajax')>0) 
        { 
         urlInfo.divKeys.attr('title', urlInfo.keys + "&page=" + urlInfo.lastPage); 
        } 
       else urlInfo.divKeys.attr('title', urlInfo.keys + "?page=" + urlInfo.lastPage); 
      } 

и для удаления комментариев функции

var urlInfo = getUrlInfo(); 

      if (!urlInfo.currentPage.length) { 
       console.log('da'); 
       if (urlInfo.keys.indexOf('ajax')>0) 
        { 
         urlInfo.divKeys.attr('title', urlInfo.keys + "&page=" + urlInfo.lastPage); 
        } 
       else urlInfo.divKeys.attr('title', urlInfo.keys + "?page=" + urlInfo.lastPage); 
      } 

Я также установить это правило для моего view.php

if(!Yii::app()->request->getQuery('ajax') && !Yii::app()->request->getQuery('page')) { 
      $pager->currentPage=$pager->pageCount; 
     } 
+0

Последняя часть PHP - это интересная. – funktioneer

1

Найдено решение, которое работает для меня с добавлением параметра в $ .fn.yiiListView.Обновление функции

JS Часть:

$.fn.yiiListView.update('switchlist-designer-clistview',{ 
        data: $(this).serialize()+"&gotoLastPage=true", 
        complete:function(){ 
        //Ajax loading is finished   
        }); 

PHP Часть в контроллере

if(Yii::app()->getRequest()->getParam("gotoLastPage")=="true"){ 
     //Important to unset the gotoLastPage Parameter otherwise the pagination wont work 
     unset($_GET["gotoLastPage"]); 

     //Get the last page 
     $lastPage = ceil($activeDataProvider->getTotalItemCount()/$activeDataProvider->getPagination()->pageSize); 

     //Set the lastpage 
     $paginator->currentPage=$lastPage; 
     $activeDataProvider->setPagination($paginator); 
    } 
0

Вы также можете изменить URL-адрес вариант, как это:

$.fn.yiiListView.update('productslistview', { 
    url: 'http://domain/search/controller?str=test&Controller_page=' + pageNumber + '&ajax=listview' 
}) 

И последняя страница, которую вы можете получить на стороне php у ваших данныхProvider:

$dataProvider->getCount() 
Смежные вопросы