Хранимые запросы

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

Когда широко используемый экран-список имеет полтора десятка столбцов и примерно столько же фильтров, сам по себе встаёт вопрос о настройке. Возможность обновить выборку, передёрнув select на тулбаре — это хорошо, но трёхслойный тулбар совершенно не смотрится. Хочется форму (расширенного поиска, естественно), где все эти элементы ввода аккуратно расставлены и откомментированы.

Это было бы почти точь-в-точь редактирование настраиваемых умолчаний (см. выше), но...

... ведь параллельно возникает сильное желание управлять порядком столбцов и выборочно отключать их видимость (ага, ещё порядок сортировки). Опции ord, hidden и order в draw_table сильно облегчают оформление выборки, но не поддержку экрана редактирования запроса.

Так вот для этих-то экранов очень хочется придумать что-то удобное и универсальное. Ведь практически всегда фильтры на выборку в точности соответствуют некоторым (если не всем) столбцам. То есть просматривается табличный GUI со списком колонок, для каждой из которых можно указать:

  • опции показа:
    • порядок показа;
    • порядок в ORDER BY (на будущее, для сортировки по нескольким колонкам);
    • максимальную длину;
  • фильтр.

Если изначально идея настройки запроса, как правило, рассматривается как хранение настроек для экрана/пользователя, то после первой реализации само собой напрашивается ведение реестра запросов. Из которых уже можно выбирать щелчком на единственном тулбарном селекте. Значение которого уже является автоматически хранимым параметром.

Набросок реализации

1. Заводим таблицу с именем, скажем, _queries и полями (про id и fake не говорю):

type
тип экрана;
id_user
ссылка на автора;
label
наименование (для явно хранимых запросов);
params
параметры в формате Data::Dumper;
title
описание (человекочитаемый абзац про фильтры и значения).

2. Подпиливаем draw_table и draw_top_toolbar так, чтобы при их вызове все столбцы и фильтры попутно заносились в некий глобальный массив. Соответствие между столбцами и фильтрами устанавливать по ключу ord, соответствующую опцию добавить к draw_toolbar_input_*.

3. Реализуем тип экрана _queries, который бы брал описания полей ввода и словарные данные из этого глобального индекса. И рисовал бы на экране форму ввода, где каждому столбцу таблицы соответствовала бы 1 строка с опциями показа и, 0-2 фильтрами (2 имеет смысл для интервала дат от .. до). Фильтры без ord на форму не попадают (так должно быть для q), некоторые фильтры могут быть видны только на форме (будет дополнительная опция).

4. Вводим в рассмотрение спецпараметр, скажем, $_REQUEST {__edit__query}. Если он задан для экрана (списка), то после вызова select_$_REQUEST{type}/draw_$_REQUEST{type} на экран выдаётся не их результат, а результат get_item_of__queries / draw_item_of__queries.

5. После поста формы отображается экран-список с установленными значениями фильтров и соответственно расставленными столбцами. В заголовке светится описание запроса (title).

6. При желании запрос можно сохранять под заданным именем. Сохранённые запросы — выбирать из списка. Сохранённые запросы могут определяться в программе глобально и быть доступными всем пользователям — тогда их нельзя редактировать.

7. При каждом показе экрана-списка ($_REQUEST {id} == 0) определён $_REQUEST {id__query}. Если он пуст, то соответствующая запись создаётся автоматически и её номер пишется в $_REQUEST {id__query}.

8. Передёргивание полей ввода на тулбаре приводит к редактированию текущего запроса. Если текущий запрос — именованный, то он предварительно клонируется в безымянный. В дальнейшем на экране настройки его можно будет:

  • сохранить под старым именем (переписать прототип);
  • сохранить под новым именем (должно быть уникально для пользователя);
  • не запоминать в списке, а только применить при текущем просмотре.

Что привлекательно: при описанном подходе состав и наполнение фильтров и столбцов на экране настройки полностью автоматически удовлетворяет полномочиям текущего пользователя, поскольку формируется той же процедурой.

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

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