Qform DSL knowledge base

<form> ×767 в коде

Структура: форма

Основной тэг формы. В нём описываются вкладки и поля формы.

На данный момент, такой тэг в xml-файле может быть только один.

Может содержать 22

ТегОписаниеВключений здесь
SQL/обработка 7 · включений здесь: 734
<check> Блок проверки данных перед сохранением (SQL или PHP, с critical/некритическим режимом) 196
<javascript> JS-блок, выполняющийся в браузере (onsuccess/afterinit/presubmit/update/ondeleted/onerror) 194
<finishsql> Финализирующий SQL — выполняется после store/delete (для пересчётов/триггеров на стороне приложения) 191
<php> PHP-блок (выполняется на сервере) — onsuccess/store/beforestore/ondeleted 127
<loadsql> SQL, выполняемый при загрузке формы (для подкачки доп.данных) 20
<defaultssql> SQL для подгрузки значений по умолчанию полей формы при создании новой записи 6
<sqlforupdate> не везде Альтернатива записи в основную таблицу — выполнить произвольный SQL:
Структура: форма 1 · включений здесь: 636
<elements> Все элементы формы: поля, html-вставки, группы полей (fieldset) и прочее необходимо оборачивать в… 636
Текст/заголовки 4 · включений здесь: 633
<text> Текстовый блок: либо контейнер заголовков (внутри list/form), либо самостоятельный текст в форме 573
<header> Header-блок печатной/excel-формы отчёта 48
<footer> Footer-блок печатной/excel-формы отчёта 6
<legend> Легенда списка — описание цветов/иконок, используемых в столбцах 6
Отчёты 1 · включений здесь: 413
<tab> Описание вкладки (tab) формы — группа элементов на отдельной странице 413
Источники данных 2 · включений здесь: 8
<sources> Контейнер дополнительных источников (см. <source>) 7
<source> Дополнительный источник данных (one-to-one таблица для elements source="…") 1
(без группы) 4 · включений здесь: 5
<dbstructure> не везде 2
<export> не везде 1
<input> не везде 1
<success-action> не везде 1
Модули/контролы 1 · включений здесь: 3
<control> Контейнер контролов модуля — содержит модули, отчёты и подобные регистрации 3
Поля ввода 1 · включений здесь: 2
<condition> Условие отображения/применимости элемента (зависит от значения другого поля) 2
Оформление (HTML) 1 · включений здесь: 0
<div> не везде HTML div-контейнер (для встраивания произвольной разметки, обычно в дашбордах)

Может встречаться внутри 5

ТегОписаниеВключений здесь
Корневой 1 · включений здесь: 749
<qform> Корневой тег DSL Qform 749
Структура: список 1 · включений здесь: 11
<list> Можно использовать <list> не только как embedded во вкладке, но и как полную замену списка модуля… 11
SQL/обработка 1 · включений здесь: 7
<scripts> Контейнер JS-блоков 7
Оформление (HTML) 1 · включений здесь: 0
<div> не везде HTML div-контейнер (для встраивания произвольной разметки, обычно в дашбордах)
Структура: фильтры 1 · включений здесь: 0
<filters> не везде Контейнер фильтров списка

Атрибуты 24

АтрибутОписаниеЗначения
Поведение интерфейса 6 · включений: 602
hideaddmore
×227

Скрыть кнопку «Сохранить и создать новую запись» (если !== 0)

Используется достаточно часто, когда мы делаем форму, которая вызывается по кастомной кнопке из списка. Например форма «Провести инструктаж» из контроля сроков. По умолчанию — 0.

1_qscript_0
hideapply
×192

Скрыть "Применить"

1_qscript_0
hideedit
×148

Если !== 0 Скрывает кнопку «Изменить», которая доступна когда мы открываем форму на просмотр (оранжевая слева внизу)

По умолчанию — 0

1_qscript_0
multiedit
×17 · пример

Разрешить групповое редактирование выбранных строк списка (1=да; форма открывается для нескольких записей сразу)

10
cookieprefix
×13 · пример

Префикс cookie, в котором сохраняются настройки формы (свёрнутые блоки, размеры). Поддерживает {{выражения}}

_qscript_
hidedbl
×5

Скрыть кнопку «Сохранить и дублировать» (если !== 0)

По умолчанию — 0. Кнопка отображается только если нажать и удерживать клавишу SHIFT.

1
Размеры 2 · включений: 551
width
×550

Ширина в пикселях (def. 640)

_int_850640800700900
height не везде
×1

Высота (0 = авто)

450
(без группы) 15 · включений: 288
warn-unsaved
×65

Если !== 0, предупреждать пользователя, если он намеревается закрыть форму с несохраненными изменениями.

По умолчанию — 1 (т.е. предупреждать)

01
hidesave
×47

Если !== 0, то скрывает все кнопки для сохранения информации разом, если не задано иное поведени.

Аналог hidedone="1" hideapply="1" hidedbl="1" hideaddmore="1" По умолчанию — 0.

1_qscript_0
hidedone
×40

Скрывает кнопку «Создать»/«Готово», если !== 0

По умолчанию — 0

10_qscript_
null не везде
×34
0
flexible-width
×26

Гибкая ширина

1
dubplicate-update не везде
×18

Указывает на то, как поступать, если форма создает запись, повторяющую по уникальному ключу существующую. Если !== 0, то будет произведено обновление полей существующей записи.

При этом лучше добавлять ещё check, который предупредит пользователя.

1
autofocus не везде
×16
0
delete-value-id не везде
×11
1
duplicate-update не везде
×7
1
allowduplicate не везде
×6
1
tabs-menu-level не везде
×6
1
method не везде
×5

Не уверен, зачем это нам надо было, но атрибут позволяет изменить то, каким методом будут передаваться данные контроллеру сохранения.

По умолчанию — POST. Можно указать GET.

GETPOST
viewonly
×4

Только чтение (0/1)

_qscript_
multiple
×3

Можно указать имя checkboxgroup поле, тогда при сохранении для каждой выбранной в checkboxgroup записи будет создана отдельная строчка в базе.

Подробнее см. ниже.

_qscript_object_id
dubplicate-ignore
×0

Указывает на то, как поступать, если форма создаёт запись, повторяющую по уникальному ключу существующую. Если !== 0, то дублирование будет просто проигнорировано.

При этом лучше добавлять ещё check, который предупредит пользователя. Если не стоит dubplicate-ignore или dubplicate-update, то при повторяющихся идентификаторах выдаст ошибку

Поведение/валидация 1 · включений: 133
nostore
×133

Форма не сохраняет в БД (для дашбордов/отчётов)

1_qscript_0

Примеры из реального кода 2

@multiedit packages/audit_control_groups/achievements.xml:75
<form width="780" multiedit="1" hideaddmore="1">
    <text></text>
    <elements width="530"></elements>
    <javascript type="onsuccess"></javascript>
</form>
@cookieprefix packages/edu4/courses_instruction.xml:256
<form width="850" cookieprefix="{{sys.file}}_1.21">
    <text></text>

    <sources></sources>
    <tab name="tab1" caption="Основные данные"></tab>

    <!-- if({{conf.modules.all.special_conditions.show}}) { -->
    <tab name="kind_of_work_all" caption="Виды работ и {{conf.modules.all.field.special_conditions.name}}"></tab>
    <!-- } -->

    <tab name="additional" caption="Дополнительно"></tab>

    <tab name="persons" caption="Список людей"></tab>

    <include src="includes/tab_files.inc" />

    <check critical="1"></check>

    <finishsql></finishsql>

    <finishsql on="delete" ></finishsql>

</form>