【问题标题】:cakephp - how to change pagination condition?cakephp - 如何更改分页条件?
【发布时间】:2011-07-10 03:45:37
【问题描述】:

在同一个控制器的几个地方我有这样的代码:

$publications = $this->paginate('Publication', $conditions);

...其中 $conditions 是条件数组,选择哪些字段以及如何选择(在 mysql 中使用 LIKE)。

他们每个人都有不同的“订购依据”声明。

我怎样才能做到这一点,并定义 sql 的不同“order by”部分?

更新(2011-03-11):这是我定义分页的一部分:

$this->paginate = array(
        'limit' => 1, 
        'fields' => array('`Publication`.*, PublicationNumeration.*, Collection.*, Publisher.*, Publication.title as PublicationTitle'), 
        'joins' => array( array('table' => 'publication_numerations', 'alias' => 'PublicationNumeration', 'type' => 'LEFT', 'conditions' => array( 'Publication.id = PublicationNumeration.publication_id' ) ) ) 
        , 'order' => array('PublicationTitle desc')
      );

            $publications = $this->paginate('Publication', $conditions);
            $this->set(compact('publications', 'urlArgs'));

带有“limit”的部分有效,但“order”无效,并且在调试模式下根本不显示。

【问题讨论】:

  • 请发布您的$conditions 数组。

标签: cakephp controller sql-order-by cakephp-1.3


【解决方案1】:

您可以在每次在每个不同的操作中实现分页功能时覆盖它。例如:

function list_recipes() {
    $this->paginate = array(
        'limit' => 10,
        'order' => array(
            'Recipe.title' => 'asc'
        )
    );
    $data = $this->paginate('Recipe');
    $this->set(compact('data'));
}

在您的情况下,您可能希望重用您的 $conditions 数组,但为每个不同的实现更改 'order' 的值。

进一步参考:Pagination doc

【讨论】:

  • 之前尝试过,但它会创建很多“未定义索引”错误消息。
  • 好的,所以“未定义索引”错误是我的错误,我必须在分页参数中添加“字段”部分。但是,“订单”部分不起作用。有'limit'的部分并且它可以工作,但是我在页面的调试块的sql查询中找不到'order'......我做错了什么?
  • 在下一篇文章stackoverflow.com/questions/2671442/… 中提到'models $order 属性只影响查找调用'.......我该如何解决我的问题?
  • 我设法解决了这个问题,将条件数组与一些假数组合并,例如: $conditions = array_merge( $conditions, array(1=>'1 order by Publication.title DESC ') ) ;那么,这个解决方案安全吗?
  • $order 属性在模型中,在分页函数中不必担心。你能发布你的整个 $conditions 数组吗?
【解决方案2】:

我利用这个想法为每页创建了一个自定义项目选择。
我的默认分页:

var $paginate = array( 'order' => array('User.id' => 'asc') );

我将此添加到我的控制器以将限制更改为 25(还为 5 和 10 添加了 1,只是为了看看它会如何运行并相应地更改限制值):

function list25() {
//fetches with different limit than default

    $this->paginate = array(
        'limit' => 25,
        'order' => array(
            'User.id' => 'asc'
        )
    );
    $data = $this->paginate('User');
    $this->set('users', $data); 
}

然后,在我的主视图 (index.ctp) 中,我在数据列表的底部添加了这个:

<span style="float:right;">
<?php echo "&nbsp;&nbsp;<span style='vertical-align:top;font-size:12px;'>Show:</span>";
      echo $html->link(' 5', array('controller'=>'users', 'action' => 'list5'));
      echo $html->link(' 10', array('controller'=>'users', 'action' => 'list10'));
      echo $html->link(' 25', array('controller'=>'users', 'action' => 'list25'));
    ?>
</span>
<span style="float:right;margin-right:10px;"><?php  echo $paginator->numbers(); ?></span>   

...在显示屏底部显示以下文本:显示:5 10 25
单击数字时,将链接到控制器操作,从而重置限制(并使用新的限制集刷新页面)。

也许有更好的方法来实现与我必须为每个选项创建视图相同的功能:list5.ctp、list10.ctp 和 list25.ctp。无论如何,它为用户提供了选择他们想在页面上看到多少数据的机会。评论?

....noob cakePHP 用户...

【讨论】:

  • 您必须为每个页面创建一个视图这一事实使这个问题变得糟糕。确实应该向您表明该想法有缺陷或您的实施不完整。
【解决方案3】:

试试这个:
echo $this->Paginator->link('5',array('limit' => '5')) echo $this->Paginator->link('10',array('limit' => '10')); echo $this->Paginator->link('10',array('limit' => '25'));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    相关资源
    最近更新 更多