Форма просмотра сообщения
Материал из 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.
