cakephp 3.3:模型在url中时的分页和排序错误

时间:2017-12-18 20:31:20

标签: sorting cakephp pagination cakephp-3.3

我有以下事件控制器:

public $paginate = [
    'sortWhitelist' => ['title', 'id', 'price', 'date', 'Categories.description'],
    'order'         => ['date' => 'desc']
];

和索引方法:

$events = $this->Events->find()->contain(['Categories']);
$this->set('events', $this->paginate($events));

在我的视图文件中,我有一个包含echo $this->Paginator->sort('id', 'code')

的表格
echo $this->Paginator->numbers([
    'separator' => '',
    'currentTag' => 'a',
    'modulus' => 25,
    'currentClass' => 'active',
    'tag' => 'li',
    'first' => 1
]);

如果我转到页面/events,我会得到预期的结果。如果我按ID排序并在第2页点击,则网址会显示events?page=2&sort=Events.id&direction=asc,结果不正确。

我看到sql日志,没有order by子句出现。如果我手动编辑没有模型的网址:events?page=2&sort=id&direction=asc,结果是正确的。

我是做错了还是错误?

由于

1 个答案:

答案 0 :(得分:1)

排序字段不在白名单中。

配置sortWhitelist后,paginator组件会拒绝所有其他排序参数。

paginator组件理解sort=id查询参数,并假设您指的是分页的默认模型,但帮助程序遵循排序参数的命名约定。其中包括型号名称。 sort=id参数有效,因为id位于您的白名单中。

因此,您必须在Events

中添加sortWhitelist
public $paginate = [
    'sortWhitelist' => ['Events.title', 'Events.id', 'Events.price', 'Events.date', 'Categories.description'],
    'order' => ['Events.date' => 'desc']
];