cakephp3- table 排序不工作
cakephp3- table sorting not working
版本:3.3.*
我正在使用 $paginator->sort() 方法在 headers 列中为我的 CMS 中的 table 分页搜索结果创建链接。您应该能够单击它们一次以按升序排序,然后再次单击以反转为降序。但反过来对我来说从来没有用过。
但这并不适用于所有领域。假设我有 5 个字段。
<tr class="design">
<th scope="col"><?= $this->Paginator->sort('Students.id','Id',array('class'=>'link')); ?></th>
<th scope="col"><?php echo $this->Paginator->sort('Students.userName','Name',array('class'=>'link')); ?></th>
<th scope="col"><?php echo $this->Paginator->sort('Students.age','Age',array('class'=>'link')); ?></th>
<th scope="col"><?php echo $this->Paginator->sort('Students.currentClass','Class',array('class'=>'link')); ?></th>
<th scope="col"><?php echo $this->Paginator->sort('Students.dateJoined','Joined Date',array('class'=>'link')); ?></th>
</tr>
我可以使用 username
、age
和 school
两种方式对 table 进行排序,但不能使用 id
和 joined
。当我最初获取列表时,我在我的模型函数中指定要基于 id
和 joined
按升序获取结果。
是不是因为这个,我无法按降序排列?
有什么方法可以实现吗?
控制器功能
public function index()
{
//Listing Students
$this->paginate = [
'finder' => 'ListStudents',
'sortWhitelist' => ['Students.id',
'Students.userName',
'Students.age',
'Students.currentClass',
'Students.dateJoined',],
'limit' => 25,
];
$students = $this->paginate($this->Students);
$this->set(compact('students'));
$this->set('_serialize', ['students']);
}
模型函数
public function findListStudents(Query $query, array $options)
{
$query
->select(['id','userName','age','currentClass','dateJoined'
])
$query->group('Students.id');
$query->order(['status' => 'asc']);
$query->order(['Students.dateJoined' => 'asc']);
$query->order(['Students.id' => 'asc']);
return $query;
}
这个 link 中提到的问题与我 facing.I 中提到的解决方案类似,但它没有用。
为此,您必须稍微修改您的控制器和模型函数。
首先,将 extraOptions 添加到您的控制器功能
public function index()
{
//Listing Students
$this->paginate = [
'finder' => 'ListStudents',
'sortWhitelist' => ['Students.id',
'Students.userName',
'Students.age',
'Students.currentClass',
'Students.dateJoined',],
'limit' => 25,
'extraOptions' =>[
'params' => $params ]
];
$students = $this->paginate($this->Students);
$this->set(compact('students'));
$this->set('_serialize', ['students']);
}
现在您需要覆盖 dateJoined
和 id
排序顺序。默认情况下,它是 asc
。
如果用户通过特定方向,则应采用。所以,为此你需要稍微修改你的模型函数。
public function findListStudents(Query $query, array $options)
{
$query
->select(['id','userName','age','currentClass','dateJoined'
])
$query->group('Students.id');
$direction = (!empty($options['extraOptions']['params']['direction'])) ? $options['extraOptions']['params']['direction'] : 'asc';
$query->order(['status' => 'asc']);
$query->order(['Students.dateJoined' => $direction]);
$query->order(['Students.id' => $direction]);
return $query;
}
现在,当您经过特定方向时,排序将正常工作。
When I fetch the list initially I have specified in my Model function
to fetch result based on id and joined in ascending order. Is it
because of this, I'm not being able to sort it in descending order?
是的,是这样的。您可以通过在自定义查找器方法中注释掉 $query->order
语句来验证这一点。你会发现后代排序 Students.id
会起作用。
我建议在配置 $paginate
变量时简单地离开自定义查找器方法的排序并定义默认排序选项。
学生控制器
public function index()
{
$this->paginate = [
'finder' => 'ListStudents',
'sortWhitelist' => [
'Students.id',
'Students.userName',
'Students.age',
'Students.currentClass',
'Students.dateJoined'
],
'limit' => 25,
// add custom sorting options here
'order' => [
'Students.status' => 'asc',
'Students.dateJoined' => 'asc',
'Students.id' => 'asc'
]
];
$students = $this->paginate($this->Students);
$this->set(compact('students'));
$this->set('_serialize', ['students']);
}
学生表
public function findListStudents(Query $query, array $options)
{
$query ->select([
'id', 'userName', 'age', 'currentClass', 'dateJoined'
]);
$query->group('Students.id');
// remove the sorting here
/*
$query->order(['status' => 'asc']);
$query->order(['Students.dateJoined' => 'asc']);
$query->order(['Students.id' => 'asc']);
*/
return $query;
}
版本:3.3.*
我正在使用 $paginator->sort() 方法在 headers 列中为我的 CMS 中的 table 分页搜索结果创建链接。您应该能够单击它们一次以按升序排序,然后再次单击以反转为降序。但反过来对我来说从来没有用过。
但这并不适用于所有领域。假设我有 5 个字段。
<tr class="design">
<th scope="col"><?= $this->Paginator->sort('Students.id','Id',array('class'=>'link')); ?></th>
<th scope="col"><?php echo $this->Paginator->sort('Students.userName','Name',array('class'=>'link')); ?></th>
<th scope="col"><?php echo $this->Paginator->sort('Students.age','Age',array('class'=>'link')); ?></th>
<th scope="col"><?php echo $this->Paginator->sort('Students.currentClass','Class',array('class'=>'link')); ?></th>
<th scope="col"><?php echo $this->Paginator->sort('Students.dateJoined','Joined Date',array('class'=>'link')); ?></th>
</tr>
我可以使用 username
、age
和 school
两种方式对 table 进行排序,但不能使用 id
和 joined
。当我最初获取列表时,我在我的模型函数中指定要基于 id
和 joined
按升序获取结果。
是不是因为这个,我无法按降序排列?
有什么方法可以实现吗?
控制器功能
public function index()
{
//Listing Students
$this->paginate = [
'finder' => 'ListStudents',
'sortWhitelist' => ['Students.id',
'Students.userName',
'Students.age',
'Students.currentClass',
'Students.dateJoined',],
'limit' => 25,
];
$students = $this->paginate($this->Students);
$this->set(compact('students'));
$this->set('_serialize', ['students']);
}
模型函数
public function findListStudents(Query $query, array $options)
{
$query
->select(['id','userName','age','currentClass','dateJoined'
])
$query->group('Students.id');
$query->order(['status' => 'asc']);
$query->order(['Students.dateJoined' => 'asc']);
$query->order(['Students.id' => 'asc']);
return $query;
}
这个 link 中提到的问题与我 facing.I 中提到的解决方案类似,但它没有用。
为此,您必须稍微修改您的控制器和模型函数。
首先,将 extraOptions 添加到您的控制器功能
public function index()
{
//Listing Students
$this->paginate = [
'finder' => 'ListStudents',
'sortWhitelist' => ['Students.id',
'Students.userName',
'Students.age',
'Students.currentClass',
'Students.dateJoined',],
'limit' => 25,
'extraOptions' =>[
'params' => $params ]
];
$students = $this->paginate($this->Students);
$this->set(compact('students'));
$this->set('_serialize', ['students']);
}
现在您需要覆盖 dateJoined
和 id
排序顺序。默认情况下,它是 asc
。
如果用户通过特定方向,则应采用。所以,为此你需要稍微修改你的模型函数。
public function findListStudents(Query $query, array $options)
{
$query
->select(['id','userName','age','currentClass','dateJoined'
])
$query->group('Students.id');
$direction = (!empty($options['extraOptions']['params']['direction'])) ? $options['extraOptions']['params']['direction'] : 'asc';
$query->order(['status' => 'asc']);
$query->order(['Students.dateJoined' => $direction]);
$query->order(['Students.id' => $direction]);
return $query;
}
现在,当您经过特定方向时,排序将正常工作。
When I fetch the list initially I have specified in my Model function to fetch result based on id and joined in ascending order. Is it because of this, I'm not being able to sort it in descending order?
是的,是这样的。您可以通过在自定义查找器方法中注释掉 $query->order
语句来验证这一点。你会发现后代排序 Students.id
会起作用。
我建议在配置 $paginate
变量时简单地离开自定义查找器方法的排序并定义默认排序选项。
学生控制器
public function index()
{
$this->paginate = [
'finder' => 'ListStudents',
'sortWhitelist' => [
'Students.id',
'Students.userName',
'Students.age',
'Students.currentClass',
'Students.dateJoined'
],
'limit' => 25,
// add custom sorting options here
'order' => [
'Students.status' => 'asc',
'Students.dateJoined' => 'asc',
'Students.id' => 'asc'
]
];
$students = $this->paginate($this->Students);
$this->set(compact('students'));
$this->set('_serialize', ['students']);
}
学生表
public function findListStudents(Query $query, array $options)
{
$query ->select([
'id', 'userName', 'age', 'currentClass', 'dateJoined'
]);
$query->group('Students.id');
// remove the sorting here
/*
$query->order(['status' => 'asc']);
$query->order(['Students.dateJoined' => 'asc']);
$query->order(['Students.id' => 'asc']);
*/
return $query;
}