【问题标题】:cakephp3- table sorting not workingcakephp3-表格排序不起作用
【发布时间】:2017-10-11 17:46:40
【问题描述】:

版本:3.3.*

我正在使用 $paginator->sort() 方法在我的 CMS 中的分页搜索结果表的列标题中创建链接。您应该能够单击它们一次以按升序排序,然后再次单击以反转为降序。但反过来对我来说从来没有用过。

但这并不适用于所有领域。假设我有 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>

我可以使用usernameageschool 对表格进行两种排序,但不能使用idjoined。当我最初获取列表时,我在模型函数中指定以升序获取基于idjoined 的结果。 是不是因为这个,我无法降序排序?

有什么方法可以实现吗?

控制器功能

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 中提到的问题与我面临的问题相似。我尝试了其中提到的解决方案,但它不起作用。

【问题讨论】:

  • 您询问在自定义查找器中指定排序顺序是否可能是问题所在。看来你自己测试是一件非常微不足道的事情?

标签: sorting cakephp pagination cakephp-3.0 query-builder


【解决方案1】:

最初获取列表时,我已在模型函数中指定 根据 id 获取结果并按升序加入。是吗 因此,我无法按降序对其进行排序?

是的,就是这样。您可以通过在自定义 finder 方法中注释掉 $query-&gt;order 语句来验证这一点。你会发现后裔排序Students.id 会起作用。

我建议在配置 $paginate 变量时直接将排序排除在自定义查找方法之外并定义默认排序选项。

StudentsController

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;
}

【讨论】:

    【解决方案2】:

    要实现这一点,你必须稍微修改一下你的控制器和模型函数。

    首先,将 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']);
    }
    

    现在您需要覆盖您的 dateJoinedid 排序顺序。默认情况下,它的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;
    }
    

    现在,当您通过特定方向时,排序将正常工作。

    【讨论】:

    • $params 未定义。
    猜你喜欢
    • 2016-11-05
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    相关资源
    最近更新 更多