Cakephp 直接使用分页器并在关联列上定义排序不起作用

Cakephp 直接使用分页器并在关联列上定义排序不起作用,cakephp,pagination,Cakephp,Pagination,CakePHP版本:4.0.1 导言 这个问题源于我遇到的另一个问题,其中一个不理想的解决方案是重定向回自身。不幸的是,我正在测试的控制器没有任何相关列,因此没有发现这个新问题 我在食谱中提到过 希望下面的代码能让问题重现 联系人表 联系人控制器 发生了什么 该页面在框架中显示类型错误 C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\View\Helper\PaginatorHelper.php strtolower期望参数1是字符串,bool给定

CakePHP版本:4.0.1

导言

这个问题源于我遇到的另一个问题,其中一个不理想的解决方案是重定向回自身。不幸的是,我正在测试的控制器没有任何相关列,因此没有发现这个新问题

我在食谱中提到过

希望下面的代码能让问题重现

联系人表

联系人控制器

发生了什么

该页面在框架中显示类型错误

C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\View\Helper\PaginatorHelper.php

strtolower期望参数1是字符串,bool给定

public function sortDir(?string $model = null, array $options = []): string
{
    $dir = null;

    if (empty($options)) {
        $options = $this->params($model);
    }

    if (isset($options['direction'])) {

        debug($options['direction']);  // THIS IS FALSE NOT asc or desc?

        $dir = strtolower($options['direction']);
    }

    if ($dir === 'desc') {
        return 'desc';
    }

    return 'asc';
}
Stacktrace from error.log

2020-06-01 10:33:20错误:[TypeError]strtolower希望参数1是字符串,bool在第264行的C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\View\Helper\PaginatorHelper.php中给出

堆栈跟踪: -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\View\Helper\PaginatorHelper.php:264 -C:\xampp\htdocs\crm\templates\Contacts\index.php:5 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\View\View.php:1164 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\View\View.php:1125 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\View\View.php:750 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Controller\Controller.php:691 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Controller\Controller.php:533 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Controller\ControllerFactory.php:79 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Http\BaseApplication.php:229 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Http\Runner.php:77 -C:\xampp\htdocs\crm\vendor\cakephp\authentication\src\Middleware\AuthenticationMiddleware.php:122 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Http\Runner.php:73 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\I18n\Middleware\LocaleSelectorMiddleware.php:70 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Http\Runner.php:73 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Http\Runner.php:77 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Http\Middleware\CsrfProtectionMiddleware.php:132 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Http\Runner.php:73 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Http\Runner.php:58 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Routing\Middleware\RoutingMiddleware.php:162 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Http\Runner.php:73 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Routing\Middleware\AssetMiddleware.php:68 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Http\Runner.php:73 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Error\Middleware\ErrorHandlerMiddleware.php:118 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Http\Runner.php:73 -C:\xampp\htdocs\crm\vendor\cakephp\debug\u kit\src\Middleware\debugkitmidleware.php:60 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Http\Runner.php:73 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Http\Runner.php:58 -C:\xampp\htdocs\crm\vendor\cakephp\cakephp\src\Http\Server.php:90 -C:\xampp\htdocs\crm\webroot\index.php:40

请求URL:/contacts 参考网址:

问题:

为什么会显示类型错误,而不是加载带有帐户名称排序的索引模板

谢谢你

编辑

我刚刚尝试了一个新的安装

composer自我更新和composer创建项目-首选dist cakephp/app:4.*crm

以及烘焙用户、联系人和帐户

新版本是4.0.8,我在新项目中添加了上面的代码,但不幸的是得到了完全相同的类型错误


如果排序在同一个表上,即:Contacts.last_name姓氏上有排序,但如果我将其更改为关联的表Accounts.account_name,则会显示类型错误

直接使用分页器时,排序字段白名单必须在配置中传递

$config = $this->paginate = [
    'sortWhitelist' => [
        'Contacts.first_name',
        'Contacts.last_name',
        'Accounts.account_name',
        'Users.first_name',
        'Users.last_name',
        'Contacts.primary_tel',
        'Contacts.mobile',
        'Contacts.email'
    ],
    'page' => $page,
    'sort' => $sort,
    'direction' => $direction,
    'limit' => 10
];

$contacts = $this->Paginator->paginate($query, $config);
$this->set(compact('contacts'));

排序现在显示在帐户名上。

第5行的Contacts\index.php模板做什么?还要注意,您没有传递排序字段白名单,这是使用关联字段所必需的。@ndm-第5行的Contacts\index.php模板是:debug$this->Paginator->sortDir;。另外,我可以请您对不通过排序字段白名单做一点扩展,因为我认为我已经通过了。我已经在公共分页属性中声明了排序字段白名单,如本文所示。这不是传递排序字段白名单吗?它不是,不,该属性由Controller::paginate方法使用,paginator组件不会自己获取它,但即使它会,您也会在控制器操作中完全覆盖它。@ndm-啊-那么我不确定如何传递排序字段白名单。我在这里引用了4本食谱:它没有说明任何其他内容。你介意让我知道怎么做吗?或者我在哪里可以找到怎么做。
public function sortDir(?string $model = null, array $options = []): string
{
    $dir = null;

    if (empty($options)) {
        $options = $this->params($model);
    }

    if (isset($options['direction'])) {

        debug($options['direction']);  // THIS IS FALSE NOT asc or desc?

        $dir = strtolower($options['direction']);
    }

    if ($dir === 'desc') {
        return 'desc';
    }

    return 'asc';
}
$config = $this->paginate = [
    'sortWhitelist' => [
        'Contacts.first_name',
        'Contacts.last_name',
        'Accounts.account_name',
        'Users.first_name',
        'Users.last_name',
        'Contacts.primary_tel',
        'Contacts.mobile',
        'Contacts.email'
    ],
    'page' => $page,
    'sort' => $sort,
    'direction' => $direction,
    'limit' => 10
];

$contacts = $this->Paginator->paginate($query, $config);
$this->set(compact('contacts'));