Сортировка таблиц
Материал из Eludia.
Во многих приложениях возникает необходимость реализовать изменение порядка сортировки в таблице одним щелчком на заголовок. Второй щелчок на тот же заголовок должен менять порядок сортировки на обратный.
В Eludia имя порядка сортировки всегда является значением параметра $_REQUEST {order}, а признак обратной сортировки — соответственно, параметра $_REQUEST {desc}. Ссылка с заголовка определяется опцией href соответствующего описания. Однако использовать href напрямую следует только в нестандартных случаях, поскольку для описанного выше сценария (первый щелчок — изменение порядка, второй — изменение направления) предусмотрена гораздо более удобная опция order, напрямую связывающая заголовок столбца с символическим именем порядка:
draw_table (
[
'Заявка',
'Статус',
{
label => 'Сумма, руб',
order => 'total',
},
{
label => 'Контрагент',
order => 'org',
},
...
В простейшем случае $_REQUEST {order} можно (было бы, кабы не опасность SQL injection) прямо подставлять в качестве имени столбца, а $_REQUEST {desc} превращать в константу DESC, но в реальности значения кликабельных столбцов обычно неуникальны, так что для однозначности крайне желательно присать в ORDER BY не одно поле, а список. Что создаёт некоторые неудобства при обработке $_REQUEST {desc}: ведь сортировка по разным полям может быть разнонаправленной.
Такого рода проблемы быстро и красиво решаются функцией order:
my $order = order ('dmnds.id DESC',
'id_dmnd_priority' => 'dmnds.id_dmnd_priority DESC, dmnds.id DESC!' ,
'total' => 'dmnds.total DESC, dmnds.id DESC!' ,
'dt_deadline' => "dmnds.dt_deadline, dmnds.id DESC!" ,
'dmnd_art' => "dmnd_arts.ord, dmnds.id DESC!" ,
'org' => "dmnds.org, dmnds.id DESC!" ,
);
Обратите внимание на опции DESC! (аналогично можно писать ASC!): для соответствующих полей направление сотрировки постоянное, для остальных — совпадает с описанным при пустом $_REQUEST {desc} и обратно ему при непустом.
Использование функции order помогает сэкономить при разработке немало времени, однако не стоит забывать о том, что соображения оптимизации могут заставить вас программировать отдельный SQL на каждый порядок сортировки — тогда всё-таки придётся обрабатывать $_REQUEST {order} вручную.
