如何在AgileToolkit中排序和字母数字字段?

时间:2013-05-30 15:26:45

标签: atk4 agiletoolkit

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

  1. 需要使用默认排序顺序设置字段。这是我现在的代码

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

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

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

  3. 排序正在运行,但它将N999置于顶部而N1000和N1001甚至不会在页面后面的几页中找到。 如何设置排序以确保更高的工作号码保持在最高位置?可能基本上忽略了第一个字母? 感谢

2 个答案:

答案 0 :(得分:1)

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

第一个选项是向Model添加排序,而不是直接添加到网格。

然后你可以使用:

$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

答案 1 :(得分: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。