Содержание

Ответы

lss

Введение

Ответ - XML документ, который серверный скрипт должен отправить в ответ на поступивший запрос. Мы тут разбираем в каком виде серверные скрипты должны формировать ответы.

Так как серверные скрипты - зона ответственности прикладного программиста, то важно соблюсти баланс: синтаксис ответов должен быть простым, наглядным, но в то же время гибким.

Общая структура ответа

Ответ представляет собой XML документ

<root type="lss" session="<идентификатор сессии>" csrftoken="<токен защиты CSRF уязвимости>">
  <response .../>
  <response .../>
  ...
  <response .../>
</root>

Ответы - декларативные описания

Схема формирования ответа

Узел <root> с запросами приходит в обработчик. Запросы обрабатываются последовательно, вместе в контексте общей транзакции. Если не получилась - то не проходит все.

Каждый запрос формирует ответы, они накапливаются и потом посылаются клиенту, вместе, общей порцией.

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

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

Уровень формы обеспечивает взаимодействие источников данных между собой в контексте конкретной экранной формы. Отсюда, затронутым обработкой источникам данных, посылаются задания на перечитку.

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

Ответы, направляемые набору строк RowSet

Набор строк, отправляя запрос, ожидает ответ. Ответ обычно приходит в тот набор строк, который отправил запрос. В зависимости от ответа содержимое может различаться, но обычно имеет примерно такой вид:

<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>

Значения атрибутов в ответе

Атрибуты response

элемент row

Обычно ответ содержит внутри себя строки, которые должен принять на клиенте набор строк. Структура элемента row универсальна, ей можно описать любое допустимое со строкой действие. Обычно это - добавить новую строку или подменить содержимое существующей строки в наборе строк на клиенте.

Атрибуты строки

Атрибуты строки, специфичные для работы дерева

Атрибуты поля

элемент delete

Более наглядный способ сообщить о необходимости удалить строку. Эквивалентен элементу row с атрибутом row.delete=1

элемент append

Более наглядный способ сообщить о необходимости добавить строку. Эквивалентен элементу row с атрибутом row.new=1

элемент change

Более наглядный способ передать строке новые значения полей, рассчитанные на сервере, но еще не отписанные в базу - результат запроса change. Эти значения будут отпишутся в базу при сохранении строки. Эквивалентно элементу row с атрибутами fieldname.change=«новое значение поля»

элемент data

Позволяет задать значения данным экранной формы. Данные в последствии доступны для чтения посредством вызова get('#data.name').

response name="ok"

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

<response name="ok" message="<текст сообщения>" exec="<строковое описание запроса>">
  <row/>
  ...
  <row/>
<response>

response name="exec"

Ответ, требующий выполнения запросов

<response name="exec" message="<текст сообщения>" exec="<строковое описание запроса>" sync="1|0">
  <param name="<имя параметра>" value="<значение>">значение</param>
  <param name="<имя параметра>" value="<значение>">значение</param>
  ...
  <param name="<имя параметра>" value="<значение>">значение</param>
<response>

response name="error"

Ошибка при выполнении запроса. Ошибка отменяет выполнение действия, соответствующего запросу.

<response name="error" message="<текст сообщения об ошибке>"/>

Если атрибут message опущен, то сообщение не выводится, но запрашиваемое действие запрещается

response name="definition"

Ответ содержит декларативное описание источника данных.

<response name="definition">
  Описание источника данных
</response>

или

<response name="ok">
  Описание источника данных
</response>

или упрощенно

<response>
  Описание источника данных
</response>

Ответы, направляемые приложению

response name="form"

Возвращает описание экранной формы, которую надо отобразить