Сортировка таблиц

Материал из 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} вручную.

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Разработчику
Администратору
Инструменты