如何使用Cakephp 2.x中的分页对包含罗马数字的列进行排序

时间:2016-02-02 21:31:25

标签: php sorting cakephp pagination cakephp-2.x

我有一个字段(单选按钮)来选择一个世纪。

因此,当我在视图中显示我的字段列表时,我可以对列进行排序(ASC或DESC),但罗马数字是带有这些选项的字符串:

(XVI, XVII, XVIII, XIX, XX, XXI)

有没有办法告诉paginator使用自定义usort函数,只是为了那个列?

我已经有了一个转换和排序罗马的函数,但是如何在视图中使用它和paginator sort函数?

CakePHP 2.x。

1 个答案:

答案 0 :(得分:2)

您必须在数据库级别进行排序,因此usort()无法提供帮助。

可能的解决方案是执行以下操作:

  1. 创建一个MySQL 用户定义函数,将罗马数字转换为阿拉伯数字。以下问题提供了一些内容:

    1. 创建一个虚拟字段,使用此函数以数字格式返回世纪:

      public function __construct($id = false, $table = null, $ds = null) {
          parent::__construct($id, $table, $ds);
          $this->virtualFields['century_number'] = sprintf('convert_to_number(%s.century))', $this->alias);
      }
      
    2. 使用此虚拟字段对您的分页中的结果进行排序。 CakePHP可以处理这个问题,如Cookbook 2.x中所述:Pagination and virtual fields

    3. 虽然上述方法有效,但如果将数百年的数据存储在数字字段类型(或日期)中,也许会使事情变得更容易。在视图中可以轻松转换为罗马数字。