1

我有一个小应用程序,我需要解决几个问题:

  1. 需要设置一个具有默认排序顺序的字段。这是我现在拥有的代码

        $crud->grid->getColumn('JOB_NO')->makeSortable();
    

    网格显示排序图标,但我想将此字段的默认排序设置为降序。

  2. JOB_NO 字段包含字母数字作业编号:N999、N1000、N1001 等...

排序是有效的,但是它将 N999 放在顶部,而 N1000 和 N1001 甚至不存在,只是在分页后面的几页中找到。如何设置排序以确保较高的工作数量保持在顶部?基本上忽略第一个字母可能吗?谢谢

4

2 回答 2

1

1)有两种选择如何做到这一点。

第一个选项是将排序添加到模型而不是直接添加到网格。

然后你可以使用:

$model->addField('foo')->sortable(true);
$model->setOrder('foo','desc');

第二个选项(如果您想或必须在网格级别执行此操作):

$grid->getColumn('foo')->makeSortable('-');

// or even (not sure, didn't test this)
$grid->makeSortable('-foo');

2)不确定如何执行此操作,但您可以尝试以下方法之一:

  • 在模型中创建新的计算字段并像 SUBSTR(JOB_NO,1) 一样计算它 - 剥离第一个字符。然后按此字段排序。
  • 仅将该代码的数字部分保存在数据库中,然后在仅视图级别的数字前添加“N”(例如网格列格式化程序)。
  • 请注意,您也可以以某种方式这样做: SELECT job_no FROM jobs ORDER BY length(job_no),job_no
于 2013-06-01T23:15:08.630 回答
0

我建议你有一个单独的字段进行排序。

首先在您的数据库和模型内部创建字段“foo_sort”。将其设置为系统字段,以便默认情况下不会出现在 UI 中:

$model->addField('foo_sort')->system(true);
$model->setOrder('foo_sort');

然后创建一个钩子,它将在保存模型之前计算字段的值:

$model->addHook('beforeSave',function($m){
    $m['foo_sort']=substr(0,1,$m['foo']);
});

您不需要做任何其他事情,也许可以手动更新数据库中的现有记录。此方法可用于维护排序字段的许多其他场景,例如从全文搜索数据中剥离 HTML。

于 2013-06-04T08:54:49.143 回答