私は同じ問題を抱えていて、 cakephp バージョン 2.5.3の次のクラスで問題を解決しました
。私のアプローチが古いバージョンでも機能するかどうかは確認していません。最初に、PaginationComponent と PaginationHelper を拡張し、いくつかのメソッドを上書きする Helper と Component クラスを作成しました。
/app/Controller/Component/_PaginatorComponent.php
<?php
/**
* Filename: _PaginatorComponent.php
* User:
* Date: 18.01.14
*/
App::import('Component', 'Paginator');
class _PaginatorComponent extends PaginatorComponent{
public function paginate($object = null, $scope = array(), $whitelist = array())
{
//Adopt from the beginning of parent::paginate
if (is_array($object))
$object = null;
$object = $this->_getObject($object);
$options = $this->mergeOptions($object->alias); //get options
$params = $this->Controller->request->params; //get params
//if custom page name is set
if(isset($params['named'][$options['pageRequestName']]))
{
//get the page number and set it as 'page' in the request (for other methods in the Component)
$page = $params['named'][$options['pageRequestName']];
$this->Controller->request->params['named']['page'] =intval($page);
}
else
$this->Controller->request->params['named']['page'] = 1; //else set the page number to 1
$pageRequestName = null; //important for parent::paginate
$results = parent::paginate($object, $scope, $whitelist); // TODO: Change the autogenerated stub
unset($this->Controller->request->params['named']['page']); //remove the appended page number
//get the options again
$options = $this->mergeOptions($object->alias);
//and add the pageRequestName to the paging array
if(isset($options['pageRequestName']))
$this->Controller->request['paging'] = array_merge_recursive(
(array)$this->Controller->request['paging'],
array($object->alias => array('pageRequestName'=>$options['pageRequestName']))
);
return $results;
}
}
/app/View/Helper/_PaginatorHelper.php
<?php
/**
* Filename: _PaginatorHelper.php
* User:
* Date: 18.01.14
*/
App::uses('PaginatorHelper', 'View/Helper');
class _PaginatorHelper extends PaginatorHelper{
public function link($title, $url = array(), $options = array()) {
//change the page parameter 'page' to the custom pageRequestName
if(isset($url['page']))
{
$params = $this->params($this->model);
if(isset($params['pageRequestName']))
{
$url[$params['pageRequestName']] = $url['page'];
unset($url['page']);
}
}
return parent::link($title,$url,$options);
}
protected function _pagingLink($which, $title = null, $options = array(), $disabledTitle = null, $disabledOptions = array())
{
//Prevent the deletion of the variable model
$disabledOptions['model'] = $options['model'];
return parent::_pagingLink($which, $title, $options, $disabledTitle, $disabledOptions); // TODO: Change the autogenerated stub
}
private $model = null;
public function numbers($options = array())
{
//Only to set the model again
if(isset($options['model']))
$this->model = $options['model'];
return parent::numbers($options); // TODO: Change the autogenerated stub
}
}
そして、ページネーションをすばやく使用するビュー要素:
/app/View/Element/paging.ctp
<div class="paging">
<?php
$options = !isset($modelName)?array():array('model'=>$modelName);
echo $this->Paginator->prev('< ' . __('zurück'), $options, null, array('class' => 'prev disabled'));
echo $this->Paginator->numbers(array('separator' => '')+$options);
echo $this->Paginator->next(__('vor') . ' >', $options, null, array('class' => 'next disabled'));
?>
</div>
次のように、ビューでページング要素を呼び出すことができます: (ドキュメント)
<?php
echo $this->element('paging',array('modelName'=>'Customer'));
?>
新しく作成されたページネーターを使用する場合は、通常のページネーターの代わりに自分のクラスを使用するように Cakephp と指定する必要があります。コントローラーで、PaginatorHelper と PaginatorComponent を次のように設定します: (ここにあります)
public $helpers = array('Paginator' => array('className' => '_Paginator' ));
public $components = array('Paginator' => array('className' => '_Paginator' ));
コントローラー内での使用。$paginate は Modelgroups にグループ化する必要があります: (ドキュメント)
public $paginate = array(
'Customer' => array (
'limit' => 25,
'pageRequestName' => 'cpage'
),
'Employer' => array (
'limit' => 25,
'pageRequestName' => 'erpage'
),
'Employee' => array (
'limit' => 25,
'pageRequestName' => 'eepage'
)
);
ただし、次のコンテキストで使用します。
$this->Paginator->settings['Customer'] = array(
'conditions'=>array(
'OR'=>array(
array('name LIKE'=>'%'.$search_query.'%'),
)
),
'limit' => 5,
'pageRequestName' => 'cpage'
);
$result = $this->Paginator->paginate('Customer');
私は、javascript のハックを望んでいないが、片側に複数のページネーションを持つ本当の可能性を望んでいない一部の人々を助けることができれば幸いです.
現時点では、'paramType' => 'named'のみを使用できます
私の意見では、PaginationComponent と PaginationHelper の元のコードは、読み取り、拡張、適応がひどいものです。