Paginator (Migration from Cake 1.3 to 2.0)

匿名 (未验证) 提交于 2019-12-03 09:14:57

问题:

I am struggling with the paginator in Cakephp 2.0. While I am trying to migrate my application to 2.0 I cant find any solution to jump directly to the last page. In 1.3 it was quiet to do that from outside like this:

echo $this->Html->link(__('Flights'), array('controller' => 'flights',     'action' => 'index','page' => 'last')); 

but this little trick putting 'page:last' in does not work anymore in 2.0. Of course there is a Paginator function called last, but this would only help if I would be already inside the app. My Problem is to access from an outside link directly the last page of the paginator.

回答1:

This is the simple way:

echo  $this->Paginator->last('Any text'); 

Other way to get the number of the last page is:

echo  $this->Paginator->counter(array('format' => '{:pages}')); 

Then you can use it to generate your link.

For more info: http://book.cakephp.org/2.0/en/core-libraries/helpers/paginator.html#PaginatorHelper::last



回答2:

Shortly after creating a bounty for this question I found the solution to MY problem using CakePHP 2.2.4. I was trying to accomplish the same task but instead using version 2.2.4 instead instead of 2.0. Basically if I had a link that looked like http://www.domain.com/articles/page:last that the controller's pagination method would know what page to go to and display the correct results (articles) for that page. For example, if I have 110 articles and the pagination limit is set to 25, by going to that URL it would display page 5 of 5, showing records 101-110. I also wanted the same capability if I go to “page:first”.

I needed to change my library file lib/Cake/Controller/Component/PaginatorComponent.php.

I changed

if (intval($page) < 1) {     $page = 1; } 

To

if ((intval($page) < 1 && $page != "last") || $page == "first") {     $page = 1; } 

I also added

if($page == "last"){     $page = $pageCount; } 

After the line

$pageCount = intval(ceil($count / $limit)); 

Christian Waschke, with this solution, you can use the same link helper exactly how you wrote it in your question. For me, the link helper looked like this

<?php echo $this->Html->link('Go to Last Page', array('controller' => 'articles', 'action' => 'index', 'page' => 'last')); ?> 


回答3:

You can 'calculate' the last page yourself if 'last' is passed as the page number;

I would discourage making modifications in the CakePHP library files as this will make it hard to perform upgrades in the future.

Basically, the PaginatorHelper uses viewVars that are calculated and set by the PaginatorComponent, as seen here: https://github.com/cakephp/cakephp/blob/master/lib/Cake/Controller/Component/PaginatorComponent.php#L212

You can replicate this in your action; for example:

public function index() {     if (!empty($this->request->params['named']['page'])) {         switch($this->request->params['named']['page']) {            case 'first':                 // replace the 'last' with actual number of the first page                 $this->request->params['named']['page'] = 1;                 break;             case 'last':                 // calculate the last page                 $limit = 10; // your limit here                 $count = $this->Flight->find('count');                 $pageCount = intval(ceil($count / $limit));                  // replace the 'last' with actual number of the last page                 $this->request->params['named']['page'] = $pageCount;                 break;         }      }      // then, paginate as usual     $this->set('data', $this->paginate('Flight')); } 

To improve this, this logic should be moved to a separate method, or to a behavior. However; as seen above, it is not required to make modifications in the PaginatorComponent!

Also note that the 'find(count)' in my example does not take additional conditions, they should be added if required

If you have a look in the CakePHP 1.3 source for paginate(), the code above is comparable; https://github.com/cakephp/cakephp/blob/1.3/cake/libs/controller/controller.php#L1204



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!