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