Содержание
Декларативное описание экранной формы
Введение
Декларативное описание экранной формы - XML описание, по которому строится экранная форма
Работа экранного интерфейса LSS визуализатор грубо выглядит так:
- LSS визуализатор посылает запрос на сервер
- В ответ получает описание экранной формы
- По описанию экранная форма отображается и начинает работать
Описание экранной формы декларативно и статично. Оно не меняется в процессе работы формы. Оно практически не содержит программного кода (за исключением динамически вычисляемых выражений), все нестандартное поведение обеспечивается обращением к серверным скриптам.
Формат описания экранной формы
Описание экранной формы состоит из следующих крупных разделов:
<form name="имя формы"> <rowsets> <!-- секция описания наборов строк экранной формы --> </rowsets> <requests> <!-- секция описания запросов экранной формы --> </requests> <scripts> <!-- секция описания скриптов JavaScript экранной формы --> </scripts> <!-- секция data --> <data name1="value1" name2="value2" ... nameN="valueN"/> <panels> <!-- секция описания визуальных элементов (панелей) экранной формы --> </panels> </form>
Заголовок описания экранной формы
<form name="имя формы" controller="имя контроллера формы на сервере, по умолчанию берется из имени формы" caption="текст заголовка" tabindex="0|Nпп" js_caption="JavaScript выражение для вычисления заголовка" modal="0|1" width="" height="" onshow="имя запроса" js_onshow="JavaScript обработчик" closable="1|0" onclose="имя запроса" js_onclose="JavaScript обработчик" clearhistory="0|1" js_onrequest="JavaScript обработчик запросов, например: onFormRequest(param)" >
Секция описания наборов строк
<rowsets> <rowset name="rowset" datasource="имя источника" readonly="0|1" > Изменения в описании источника данных по сравнению с контекстно независимым описанием <rowsets> Список дочерних наборов строк </rowsets> </rowset> ... <rowset/> </rowsets>
Секция описания запросов уровня формы
<requests> <request name="имя запроса" mode="подрежим" rowset="#form|#focus|имя набора строк" icon="иконка" caption="заголовок" description="подробное описание" enabled="1|0" confirm="текст запроса на подтверждение" message="текст сообщения" event="onclose|onshow" js_enabled="JavaScript выражение" js_visible="JavaScript выражение" js_caption="JavaScript выражение" js_icon="JavaScript выражение" js_confirm="JavaScript выражение" js_message="JavaScript выражение" save="0|1" key="ctrl+shift+alt+code" /> <params> <param name="имя параметра" value="значение" js_value="JavaScript выражение" skipempty="0|1" type="тип данных" enabled="1|0" js_enabled="JavaScript выражение" priority="0|1" /> ... </param> </params> <requests> <request sync="1|0"/> ... <request/> </requests> </request> </requests>
Секция описания скриптов JavaScript
<scripts> <script event|script|name="onshow"> </script> <script event|script|name="onclose"> </script> <script event|script|name="onrequest"> </script> <script event|script|name="имя скрипта"> <![CDATA[ function(p1,p2,p3) { тело JavaScript функции, обязательно должно начинаться на function( return result; } ]]> </script> <script event|script|name="имя скрипта"> <![CDATA[ Произвольное выражение на JavaScript ]]> </script> </scripts>
Секция описания начальных значений данных формы
<data name1="value1" ... nameN="valueN"/>
Секция описания панелей
<panels> <panel type="тип панели" rowset="имя набора строк" caption="заголовок" color="цвет" align="middle|top|bottom|left|right|center" splitter="0|1" js_visible="выражение JavaScript" row.type="тип подходящего узла набора строк" width="ширина" height="|высота|auto" minwidth="минимальная ширина (в px), совместно со splitter=1" minheight="минимальная высота (в px), совместно со splitter=1" focus="0|1" border="0|1" padding="отступ сверху и снизу" fontsize="normal|s|l|xl|xxl" color.readonly="gray|white" id="id панели" onaction="имя запроса" onshow="имя запроса" js_onaction="выражение JavaScript" js_onshow="выражение JavaScript" > <events> <request name="" event="onaction|onshow"/> </events> <fields> Список полей источника данных </fields> <toolbar default="0|1" menu="0|1"> <request name|request="имя запроса" mode="подрежим запроса" rowset="имя набора строк|#this|#parent|#focus|#form" caption="текст" description="подробное описание" confirm="текст" lock="0|1" icon="иконка" enabled="1|0" js_enabled="выражение" js_visible="выражение" js_confirm="выражение" js_caption="выражение" js_description="выражение" js_icon="выражение" style="icon|text|icontext" action="1|0" save="0|1" close="0|1" iphoneclick="1" form="имя формы для запроса form" modal="0|1" - для запроса form модальность запускаемой формы closable="1|0" width="ширина" height="высота" > <params> <param name="имя параметра" js_value="значение параметра JavaScript" value="значение параметра" js_enabled="JavaScript выражение" enabled="1|0" skipempty="0|1" /> </params> <results> <result name="имя в #data" value="имя в #result"/> ... <result name="имя в #data" value="имя в #result"/> </results> <requests> <request/> ... <request/> </requests> </request> <separator/> ... <request/> </toolbar> <menu default="0|1"> <request> <requests> <request/> ... <request/> </requests> </request> <separator/> ... <request/> </menu> <buttons> <request align="left|right|top" style="default|success|info|warning|danger"/> <separator/> ... <request/> </buttons> <panel/> ... <panel/> </panel> </panels> </form>
Секция <panels>
Содержит описания панелей, из которых собирается экранный интерфейс формы.
Полезные атрибуты <panel>
- type - тип панели, в настоящий момент реализованы типы: panel, tab, accordion, grid
- align - выравнивание: center, left, right, top, bottom
- rowset - имя набора строк
Дочерние узлы <panel>
- panels, panel - внутри панели могут содержаться дочерние панели, их описание может группироваться внутри узла <panels>, а может лежать непосредственно внутри родительского узла <panel>
Виды панелей
panel
Панель - контейнер, дочерние панели могут размещаться как:
- align=«top» - должна быть понятна высота панели
- align=«bottom» - должна быть понятна высота панели
- align=«left» - должна быть понятна ширина панели
- align=«right» - должна быть понятна ширина панели
- align=«center» - должны быть понятны ширина и высота панели
- align=«»
scroll
Панель - контейнер, все дочерние панели размещаются как при align=«top». Если суммарная высота дочерних панелей превышает высоту родительской панели, появляется прокрутка
tab
Контейнер дочерних панелей, в виде TabFrame
- атрибут bestchild=1 - отображать только одну (первую подходящую) дочернюю панель. Анализируется row.type и js_visible
- возможность динамически определять текущую панель при смене строки
- привязать к панели rowset, смена строки в котором вызывает смену текущей панели
- у дочерних панелей атрибуты best, js_best - если у текущей панели признак best, то она остается текущей, иначе первая с признаком best
accordion
Контейнер дочерних панелей в виде аккордеона
- атрибут bestchild=1 - отображать только одну (первую подходящую) дочернюю панель. Анализируется row.type и js_visible
grid
дополнительные признаки панели
- style=grid|list|report
- waitanimate=0|1 - отображать ожидание загрузки анимированным gif
- noheader=0|1 - не показывать заголовки
- noselect=0|1 - не показывать текущую строку
- sort=asc|desc - порядок сортировки при отображении
- mark.icon=mark|check
дополнительные признаки полей
- noscroll - включить поле в непрокручиваемую область слева 0|1
- clipboard - возможность выделения текста для переноса в буфер обмена 0|1
- align - left|right|center
- lightclick - 0|1 обработка легкого нажатия мышки (как для пометки mark), имеет смысл для check и icons
вариант задания высоты панели по содержимому
<panel type="grid" align="top" height="auto" minheight="100px" maxheight="35%"> <field name="fieldName1"/> <field name="fieldName2"/> ... <field name="fieldNameN"/> </panel>
Для этого варианта важно:
- выравнивание align=«top» или align=«bottom»
- высота не задана или height=«auto»
- можно задать minheight и maxheight, значения можно задавать в px или %
- если высота определяется содержимым, то
splitter=«1»задавать нельзя
tree
Панель дерева. Источник данных древовидный. Особым образом обрабатываются атрибуты row:
- row.type - тип узла, если дерево состоит из разнородных узлов
- row.icon - иконка, если поля нет, то из id.treetype, иначе стандартная
- row.final - не может быть дочерних элементов
- row.empty - нет дочерних элементов (но могут быть)
Следующие данные берутся из полей, в качестве имен можно использовать стандартные имена, или переопределять их в секции fields набора строк. Если набор строк разнородный, и содержит разные описатели fields для разных типов узлов, то для разных типов узлов можно задать разные имена полей
- name - поле, из которого брать текст метки, можно переопределить в fields как name=«имя поля»
- description - поле, из которого брать всплывающую подсказку, можно переопределить в fields как description=«имя поля»
дополнительные признаки панели
- mark.icon=mark|check
treemenu
Реализует древовидное меню, умеющее по DblClick запускать экранные формы. Панель аналогична панели tree, но использует дополнительный параметр collapse, означающий необходимость свернуть панель при запуске экранной формы, и развернуть при получении фокуса ввода на панель:
<panel type="treemenu" rowset="имя набора строк" collapse="0|1"/>
Особым образом интерпретируются следующие поля набора строк:
- form - поле, содержащие имя запускаемой формы, может быть переопределено в секции fields treemenu.form=«имя поля»
- params - поле, содержащие параметры запускаемой формы, может быть переопределено в секции fields treemenu.params=«имя поля»
- имена параметров, начинающиеся на «attr.» интерпретируются как атрибуты запуска экранной формы, например: attr.modal=1 или attr.clearhistory=1
fields
Панель позволяет совместно разместить несколько полей набора строк
<panel type="fields" rowset="имя набора строк" captionup="0|1"> <field name="имя поля" line="имя строки" column="имя колонки"/> ... <field/> </panel>
Дополнительные параметры полей:
- line - разные поля, имеющие одинаковые значения этого параметра размещаются вместе в одной строке. Поля, для которых параметр не задан, размещаются с новой строки.
- column - поля, размещенные в разных строках, с одинаковым значением параметра column, совместно выравниваются по левому краю. По умолчанию, первые в колонке поля имеют одинаковое значение этого параметра, и соответственно, совместно выравниваются.
- len - длина содержимого поля в символах
- stretch - расширять
attribute
Панель атрибутов построена на базе панели fields, однако описания и значения полей берутся из таблицы, каждая строка - поле панели attribute. При перечитке таблицы панель перерисовывается, и отображает другие поля.
Для корректной работы, у источника данных панели должны быть следующие поля:
- caption - название атрибута
- type - тип атрибута: string|num|date|list|radio|memo|ref|caption
- len - длина, обычно если не задана, то stretch=1
- dec - имеет смысл для атрибутов типа num, знаков после запятой
- list - имеет смысл для атрибутов list и radio, значения через ;
- action - имя запроса, который надо выполнить по клику
- line - имя строки, элементы с одинаковым значениям этого поля размещаются в одной строке
- value - значение атрибута
- Значение row.readonly строки интерпретируется как readonly поля
Работа справочника type=ref реализована кривовато, но работает. На все атрибуты используется один и тот-же справочник. Это может быть специально сделанный на сервере источник данных справочника, который по полученным параметрам понимает, что надо возвращать для текущего атрибута. У источника данных панели должно быть 2 поля:
- valueid - поле type=«ref», с прописанным вызовом общего для всех атрибутов справочника
- valuename - поле refid=«valueid» - корректно описанное поле refname, может называться как угодно, лишь бы ссылалось на valueid. Имеет смысл организовать источник данных на сервере так, что бы это поле было виртуальным, а значение его было привязано к полю value.
html
Панель может отображать:
- содержимое поля как текст или HTML, в зависимости от типа поля
- произвольный HTML текст по шаблону с макроподстановками
Вариант описания для отображения содержимого поля
<panel type="html" style="|card|caption|title" field="имя поля" > <field name="имя поля"/> </panel>
Вариант описания для отображения произвольного HTML по шаблону
<panel type="html" style="|card" js_tp="JavaScript, возвращающий html содержимое шаблона" js_tpname="JavaScript, возвращающий имя шаблона" js_tpvalue="JavaScript, для нестандартных макроподстановок в шаблоне" > <templates> <template name="имя шаблона" js_enabled="JavaScript пригодности шаблона"> <![CDATA[ html текст ]]> </template> <template name="имя шаблона" js_enabled="JavaScript пригодности шаблона"> <![CDATA[ html текст ]]> </template> </templates> </panel>
вариант задания высоты панели по содержимому
<panel type="html" align="top" height="auto" minheight="100px" maxheight="35%"> <field name="fieldName1"/> </panel>
Для этого варианта важно:
- выравнивание align=«top» или align=«bottom»
- высота не задана или height=«auto»
- можно задать minheight и maxheight, значения можно задавать в px или %
- если высота определяется содержимым, то
splitter=«1»задавать нельзя
Макроподстановки:
%%выражение%% - вычисляется как значение функции get()
Стили
- card - контейнер карточки
- caption, title - стили заголовка панели
list
Панель для отображения вертикального списка
Вариант описания для отображения содержимого поля
<panel type="list" rowset="набор строк" style="list|linklist|card|blank" noselect="0|1" focusable="1|0" sort="asc|desc" field="имя поля" > <field name="имя поля"/> </panel>
Вариант описания для отображения произвольного HTML по шаблону
<panel type="list" rowset="набор строк" style="list|linklist" noselect="0|1" focusable="1|0" sort="asc|desc" js_tp="JavaScript, возвращающий html содержимое шаблона" js_tpname="JavaScript, возвращающий имя шаблона" js_tpvalue="JavaScript, для нестандартных макроподстановок в шаблоне" > <templates> <template name="имя шаблона" js_enabled="JavaScript пригодности шаблона"> <![CDATA[ html текст ]]> </template> <template name="имя шаблона" js_enabled="JavaScript пригодности шаблона"> <![CDATA[ html текст ]]> </template> </templates> </panel>
вариант задания высоты панели по содержимому
<panel type="list" align="top" height="auto" minheight="100px" maxheight="35%"> <field name="fieldName1"/> </panel>
Для этого варианта важно:
- выравнивание align=«top» или align=«bottom»
- высота не задана или height=«auto»
- можно задать minheight и maxheight, значения можно задавать в px или %
- если высота определяется содержимым, то
splitter=«1»задавать нельзя
Макроподстановки:
%%выражение%% - вычисляется как значение функции get()
Стили
- card - контейнер карточки
- list - обычный список
- linklist - список, стилизованный под html ссылки
tablist
<panel type="tablist" rowset="набор строк" noselect="0|1" focusable="1|0" sort="asc|desc" field="имя поля" > <field name="имя поля"/> </panel>
multi
Панель для списка множественного выбора
Простое описание, поле должно быть refid
<panel type="multi" style="list|check" dlgstyle="auto|list|check" dlgcheckmax="для режима dlgstyle=auto максимальное кол-во строк, отображаемых как check, по умолчанию 25" rowset="набор строк, содержащий выбранные строки" onaction="вызов формы выбора" > <field name="имя refid поля"/> </panel>
Сложное описание, актуально для style=check с изменяющимся составом доступных галочек
<panel type="multi" style="list|check" dlgstyle="auto|list|check" rowset="набор строк, содержащий выбранные строки" ref="набор строк справочника, содержащий все возможные значения" onaction="вызов формы выбора" > <field name="имя поля, содержащее ссылку" mode="fieldid|rowsetid"/> <field name="имя поля, содержащее наименование" mode="fieldname|rowsetname"/> <field name="имя поля справочника, содержащее наименование" mode="refname|reftext"/> </panel>
webbrowser
Эта панель в IFRAME отображает содержимое адреса
<panel type="webbrowser" rowset="набор строк" url="url адрес" js_url="JavaScript, вычисляющий адрес" field="имя поля" default="url адрес" noscript="0|1" repaint="auto|manual" progress="0|1" > <params> <param name="http.url" value="url адрес"> <param name="имя параметра" value="значение параметра"> ... <param/> </params> </panel>
- атрибут url задает адрес отображаемой в панели страницы
- атрибут field задает имя поля, содержащего адрес отображаемой в панели страницы
- атрибут noscript запрещает выполнение javascript в отображаемой в панели страницы
- атрибут repaint
- auto по умолчанию, перечитка при любом изменении url, вызывается изменениями в связанном источнике данных
- manual имеет смысл только для фильтра, перечитка при вызове запросов refresh или refreshrow, если задан параметр default, то перед первой перечиткой отображается его содержимое
- атрибут progress включает отображение индикатора прогресса загрузки содержимого iframe
- параметры param пополняют адрес передаваемыми через url параметрами
- параметр http.url позволяет задать url через параметры, как в запросах httpget или httpput
Особая обработка запроса panel:
- panel.print - распечатать содержимое
- panel.refresh - принудительно перечитать
<panel type="webbrowser" id="web-browser-id" url="/reports.php?name=test"/> <request name="panel" mode="print"> <param name="id" value="web-browser-id"/> </request> <request name="panel" mode="refresh"> <param name="id" value="web-browser-id"/> </request>
extcontrol
Панель позволяет подключить к экранной форме внешний HTML документ, с привязкой к среде разработки. В HTML документе, отображаемом внутри панели должна быть объявлена функция doLssRepaint(params), которая будет автоматически вызываться при перерисовке источника данных. В params передаются: источник данных, значения параметров, режим перерисовки (все, одна строка)
<panel type="extcontrol" url="url адрес"> <params> <param name="имя параметра" value="значение параметра"> ... <param/> </params> </panel>
img
Эта панель отображает картинку, size=«» - исходный размер
<panel type="img" url="url адрес" field="имя поля" size="contain|cover" onaction="action"> <params> <param name="http.url" value="url адрес"> <param name="имя параметра" value="значение параметра"> ... <param/> </params> </panel>
memo
Эта панель отображает текстовое memo поле с возможностью редактирования
<panel type="memo" field="имя поля" enter="0|1" readonly="0|1|manual"> <field name="имя поля"/> </panel>
- readonly=«manual» - в самом поле править нельзя, но в диалоге просмотра можно
expander
Эта панель прижимается к левому/правому или верхнему/нижнему краю и может быть свернута или развернута
вертикальное размещение панели
<panel type="expander" align="left|right" width="ширина свернутая" maxwidth="ширина развернутая" expand="0|1" expand.hover="0|1" > </panel>
горизонтальное размещение панели
<panel type="expander" align="top|bottom" height="высота свернутая" maxheight="высота развернутая" expand="0|1" expand.hover="0|1" > </panel>
- expand - свернутое или развернутое состояние по умолчанию
- expand.hover - разворачивать ли при наведении мышки
expfilter
Вариант панели expander, оптимизированный для размещения фильтров для десктопной версии приложения. Фильтры размещаются справа, автоматически задается ширина в свернутом виде, рисуется иконка отбора.
<panel type="expfilter" width="ширина развернутая" expand="0|1" > </panel>
allicons
Эта панель отображает все зарегистрированные в проекте иконки
<panel type="allicons"/>
chart
Эта панель отображает графики и диаграммы
<panel type="chart" chart="bar|line|radar|pie|polarArea|bubble"> <field name="имя поля" mode="label"/> <field name="имя поля" mode="value"/> ... <field name="имя поля" mode="label"/> </panel>
separator
Это панель разделитель. Отображается как разделительная линия. Например, можно с помощью ее отделять друг от друга панели fields
<panel type="fields" align="top"> </panel> <panel type="separator" align="top"/> <panel type="fields" align="top"> </panel>
form
Эта панель используется в главной экранной форме приложения. В ней размещаются (сменяя друг друга) динамически формируемые в процессе работы приложения экранные формы. Такая панель должна быть одна, иначе все запутается.
<panel type="form" form="имя формы по умолчанию" tab="0|1" tab.background.url="url картинки фона" tab.background.color="цвет фона заголовка" tab.background.opacity="прозрачность фона" background="url картинки фона" bgopacity="прозрачность фона" bgsize="contain|cover" login="имя текущего пользователя" rowset="имя набора строк главного меню системы" menu.align="left|right|top|bottom" menu.width="ширина меню" menu.maxwidth="максимальная ширина меню" menu.height="высота меню" menu.maxheight="максимальная высота меню" menu.caption="заголовок меню" menu.size="small|medium|large" menu.showonempty="0|1" > <templates> <template name="logo"> <![CDATA[ html текст для логотипа ]]> </template> </templates> <requests> <request name="Имя кнопочки справа вверху"/> ... <request name="Имя кнопочки справа вверху"/> </requests> </panel>
