Как отсортировать и буквенно-цифровое поле в AgileToolkit?

У меня небольшое приложение, и мне нужно исправить пару проблем:

  1. Необходимо установить поле с порядком сортировки по умолчанию. Это код, который у меня есть прямо сейчас

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

    В сетке отображается значок сортировки, но я хочу установить сортировку по умолчанию для этого поля по убыванию.

  2. Поле JOB_NO содержит буквенно-цифровые номера заданий: N999, N1000, N1001 и т. д.

Сортировка работает, однако N999 помещается вверху, а N1000 и N1001 даже отсутствуют, их можно найти несколькими страницами позже в разбивке на страницы. Как я могу установить сортировку, чтобы убедиться, что более высокие номера заданий остаются вверху? В основном игнорировать первую букву, может быть? Спасибо


person Trevor    schedule 30.05.2013    source источник


Ответы (2)


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
person DarkSide    schedule 01.06.2013

Я бы посоветовал вам иметь отдельное поле для сортировки.

Сначала создайте поле «foo_sort» в своей базе данных и внутри модели. Установите его как системное поле, чтобы оно не отображалось в пользовательском интерфейсе по умолчанию:

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

Затем создайте хук, который будет вычислять значение поля перед сохранением модели:

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

Вам не нужно делать ничего другого, возможно, вручную обновить существующие записи в базе данных. Этот метод можно использовать во многих других сценариях для обслуживания полей сортировки, таких как удаление HTML из данных полнотекстового поиска.

person romaninsh    schedule 04.06.2013