如何在CakePHP中为单个模型/控制器创建多个分页实例

时间:2010-11-02 04:34:14

标签: php ajax cakephp pagination

我有一个视图,它有两个不同的同一个模型的动作(按最新排序的项目列表,以及按最常用排序的相同列表)。一个列表我想一次分页8个项目,一次分成12个项目。我正在使用AJAX来分页。如何设置控制器来处理此任务?问题似乎是我无法创建两个不同的分页实例,因此无论操作如何,我都只能在相同数量的项目中进行分页。

提前感谢您的帮助。

到目前为止我尝试了什么

基本上尝试设置特定于每个操作的限制,而不是初始分页帮助程序:

var $paginate = array('order'=>array('Category.name'), 'limit'=>'8');

这就是帮助者的样子,无论限制是什么,它都会提供。即使我删除了这个限制并试图像这样应用它:

var $paginate = array('order'=>array('Item.name'));

function discover_list(){    
    $this->set('d_ajax_items', $this->paginate('Item', array('Item.discover_order' => null, 'Item.moderated' => 1), null, 'Item.id DESC', null, 8));
}

function trend_paging(){
    $this->set('trend_items', $this->paginate('Item', array('Item.moderated' => 1),NULL,  'rank DESC', NULL, 12));  
}

操作结束时的限制将被忽略,并且一次只能输入一些默认的20个项目

3 个答案:

答案 0 :(得分:3)

我误解了你原来的问题。如果要为每个操作设置不同的限制,可以执行此操作

function discover_list() {    
    $this->paginate['limit'] = 8;
    $this->paginate['conditions'] = array('Item.discover_order' => null, 'Item.moderated' => 1);
    $this->set('d_ajax_items', $this->paginate('Item'));
}

修改

一个不错的方式

$this->paginate = array(
    'limit' => 8,
    'conditions' => array('Item.discover_order' => null, 'Item.moderated' => 1),
);
$this->set('d_ajax_items', $this->paginate('Item'));

答案 1 :(得分:1)

我以前做过这件事,我希望自己没有。保持两者同步对最终用户来说是困惑的,也是开发人员的噩梦。

你有什么尝试?我确信你可以有两个实例,但是你需要将参数直接传递给函数paginate(),而不是将它们设置在类变量paginate上。

修改

为避免混淆,我几乎总是在调用本身中定义分页选项。

在第二个示例中,您将六个参数传递给paginate(),但它只需要三个:

function paginate($object = null, $scope = array(), $whitelist = array())

如果省略$ object并将数组作为第一个arg传递,则最后两个args向左移动。

您是否尝试输入订单并将值限制为第三个位置的数组($ whitelist)?

http://api13.cakephp.org/class/controller#method-Controllerpaginate

http://api13.cakephp.org/view_source/controller/#line-1056

答案 2 :(得分:0)

你可以用2个空div开始你的页面,并通过ajax调用2个映射到controller / action的不同url。然后你只需要担心ajax分页,但你不会有任何cakephp问题,因为每个分页都会影响他自己的行为。

如果您需要unbostrusive javascript,这不是一个非常好的方法,但如果您的整个应用需要javascript,它将会有效。