Ответ - XML документ, который серверный скрипт должен отправить в ответ на поступивший запрос. Мы тут разбираем в каком виде серверные скрипты должны формировать ответы.
Так как серверные скрипты - зона ответственности прикладного программиста, то важно соблюсти баланс: синтаксис ответов должен быть простым, наглядным, но в то же время гибким.
Ответ представляет собой XML документ
<root type="lss" session="<идентификатор сессии>" csrftoken="<токен защиты CSRF уязвимости>"> <response .../> <response .../> ... <response .../> </root>
Узел <root> с запросами приходит в обработчик. Запросы обрабатываются последовательно, вместе в контексте общей транзакции. Если не получилась - то не проходит все.
Каждый запрос формирует ответы, они накапливаются и потом посылаются клиенту, вместе, общей порцией.
Каждый запрос проходит обработку уровнем источника данных, формы и приложения. Каждый уровень может дать по поводу запроса свои ответы.
Уровень источника данных ничего не знает о специфике использования запроса в конкретной форме. Тут расположен максимально абстрагированный от контекста использования код, поддерживающий работу источника данных.
Уровень формы обеспечивает взаимодействие источников данных между собой в контексте конкретной экранной формы. Отсюда, затронутым обработкой источникам данных, посылаются задания на перечитку.
Уровень приложения отвечает за авторизацию и запуск на клиенте экранных форм. Тут обрабатываются запросы, требующие деклоративных описаний для запрашиваемой формы или главного меню системы.
Набор строк, отправляя запрос, ожидает ответ. Ответ обычно приходит в тот набор строк, который отправил запрос. В зависимости от ответа содержимое может различаться, но обычно имеет примерно такой вид:
<response name="ok|error|disconnected|exec" message="<текст сообщения>" rowset="<имя набора строк>" exec="<строковое описание запроса>" paginator.from="<для пагинатора, с какой строки начиная>" paginator.count="<для пагинатора, сколько строк всего>" > <row id="<id>" id.change="<newid>" row.readonly="0|1" row.color="0|1" row.destmode="after|before|first|last|append" row.destid="<id>" row.focus="0|1" row.delete="0|1" row.new="0|1" row.change="0|1" row.info="0|1" row.type="<type>" row.icon="<icon>" row.empty="0|1" row.final="0|1" fieldname="<значение поля>" fieldname.readonly="0|1" fieldname.visible="1|0" fieldname.color="<color>" ... fieldname="<значение поля>" > <field name="<имя поля>" readonly="0|1" color="<color>" visible="1|0">значение поля</field> </row> ... <row/> <delete id="<id>"/> <append id="<id>" row.destmode="after|before|first|last|append" row.destid="<id>" row.focus="0|1" fieldname="<значение поля>" ... fieldname="<значение поля>" > <field name="<имя поля>" readonly="0|1" color="<color>">значение поля</field> </append> <shift id="<id>" row.destmode="after|before|first|last|append" row.destid="<id>"/> <change id="<id>" fieldname="<значение поля>" ... fieldname="<значение поля>"> <field name="<имя поля>" readonly="0|1" color="<color>">значение поля</field> </change> <info row.focus.path="<value1>" name2="<value2>" ... nameN="<valueN>"></info> <marked row.type="" mode="list|mark|unmark|markall|unmarkall">id1, id2, id3, ... idN</marked> <data name1="<value1>" name2="<value2>" ... nameN="<valueN>"></data> </response>
Обычно ответ содержит внутри себя строки, которые должен принять на клиенте набор строк. Структура элемента row универсальна, ей можно описать любое допустимое со строкой действие. Обычно это - добавить новую строку или подменить содержимое существующей строки в наборе строк на клиенте.
Атрибуты строки
Атрибуты строки, специфичные для работы дерева
Атрибуты поля
Более наглядный способ сообщить о необходимости удалить строку. Эквивалентен элементу row с атрибутом row.delete=1
Более наглядный способ сообщить о необходимости добавить строку. Эквивалентен элементу row с атрибутом row.new=1
Более наглядный способ передать строке новые значения полей, рассчитанные на сервере, но еще не отписанные в базу - результат запроса change. Эти значения будут отпишутся в базу при сохранении строки. Эквивалентно элементу row с атрибутами fieldname.change=«новое значение поля»
Позволяет задать значения данным экранной формы. Данные в последствии доступны для чтения посредством вызова get('#data.name').
Самый распространенный ответ, означает что запрос обработан успешно. Если не содержит дочерних элементов row, то обрабатывается в зависимости от от запроса так, как должно быть при его успешном выполнении.
<response name="ok" message="<текст сообщения>" exec="<строковое описание запроса>"> <row/> ... <row/> <response>
Ответ, требующий выполнения запросов
<response name="exec" message="<текст сообщения>" exec="<строковое описание запроса>" sync="1|0"> <param name="<имя параметра>" value="<значение>">значение</param> <param name="<имя параметра>" value="<значение>">значение</param> ... <param name="<имя параметра>" value="<значение>">значение</param> <response>
Ошибка при выполнении запроса. Ошибка отменяет выполнение действия, соответствующего запросу.
<response name="error" message="<текст сообщения об ошибке>"/>
Если атрибут message опущен, то сообщение не выводится, но запрашиваемое действие запрещается
Ответ содержит декларативное описание источника данных.
<response name="definition"> Описание источника данных </response> или <response name="ok"> Описание источника данных </response> или упрощенно <response> Описание источника данных </response>
Возвращает описание экранной формы, которую надо отобразить