Форма просмотра сообщения

Материал из Eludia
Перейти к: навигация, поиск

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

На таких формах хорошо смотрятся кнопки перехода к прошлой/следующей записи, а также поля типа article для вывода текста сообщений.

Рассмотрим один пример из жизни, где всё желаемое было получено при помощи минимума кодирования. Наш тип экрана называется request_tasks. Таблица request_tasks содержит реплики, создаваемые в рамках запросов (requests), доступные по ссылке request_tasks.id_request.

Извлечение данных

Прежде всего, сгенерируем по шаблону StEludio процедуру get_item_of_request_tasks, счистим всё лишнее и научимся доставать скалярные поля записи:

sub get_item_of_request_tasks {
 
	my $data = sql (request_tasks => ['id'],
		'users AS user_initiators',
		'users AS user_executors',
		'requests',
		'request_status (label)',
		'workgroups (label)',
		'request_types (label)',
	);
 
	$_REQUEST {__read_only} = 1;
 		
	__d ($data, 'dt', 'dt_done', 'dt_aborted');
 
	return $data;
 
}

Функция sql позволяет одним махом извлечь и 2 этажа родительских объектов (requests, request_types) для формирования path, и привязанные справочники (users, workgroups). Поля label указаны для экономии, чтобы не создавать слишком большие хэши: в соответствующих таблицах десятки полей.

Прошлое и будущее

Теперь поищем данные для кнопок 'ранее' и 'далее'. Поскольку в рамках одного запроса создаётся не более десятка задач, мы вполне можем позволить себе достать из БД всю эту последовательность, после чего поискать в ней текущую задачу:

($data -> {prev}, $data -> {next}) = prev_next_n ($data, sql (request_tasks => [
	[id_request => $data -> {id_request}],
	['ORDER'    => 'id'],
]));

Теперь — рисуем

Не будем приводить здесь полный вызов draw_form. Отметим только два момента. Во-первых, всё те же кнопки горизонтальной навигации:

left_buttons => [
	{
		icon     => 'left',
		label    => 'ранее',
		href     => {id => $data -> {prev} -> {id}},
		off      => !$data -> {prev} -> {id},
		keep_esc => 0,
		hotkey   => {code => 37},
	},
],

right_buttons => [
	{
		icon     => 'right',
		label    => 'далее',
		href     => {id => $data -> {next} -> {id}},
		off      => !$data -> {next} -> {id},
		keep_esc => 0,
		hotkey   => {code => 39},
	},
],

Опция keep_esc обеспечивает возврат по кнопке Esc на один и тот же, вызывающий экран со всех реплик, а hotkey позволяет листать странички клавишами-стрелками: влево и вправо.

А теперь приведём специфическое оформление широкого поля для формулировки запроса:

{
	label   => 'Заявка',
	type    => 'banner',
},
{
	type    => 'article',
	value   => $data -> {request} -> {label},
},

В отличие от стандартного случая, здесь заголовок поля вынесен в отдельное определение псевдополя типа banner.

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

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