Инструменты пользователя

Инструменты сайта


form-definition

Декларативное описание экранной формы

lss

Введение

Декларативное описание экранной формы - 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>
form-definition.txt · Последнее изменение: 2026/07/24 17:57 — madmin

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki