====== Ответы ====== [[start:|lss]] ===== Введение ===== [[Response|Ответ]] - **XML** документ, который серверный скрипт должен отправить в ответ на поступивший [[Request|запрос]]. Мы тут разбираем в каком виде серверные скрипты должны формировать [[Response|ответы]]. Так как серверные скрипты - зона ответственности прикладного программиста, то важно соблюсти баланс: синтаксис ответов должен быть простым, наглядным, но в то же время гибким. ===== Общая структура ответа ===== Ответ представляет собой **XML документ** ... ===== Ответы - декларативные описания ===== * [[rowset-definition]] * [[form-definition]] ===== Схема формирования ответа ===== Узел **** с запросами приходит в обработчик. Запросы обрабатываются последовательно, вместе в контексте общей транзакции. Если не получилась - то не проходит все. Каждый запрос формирует ответы, они накапливаются и потом посылаются клиенту, вместе, общей порцией. Каждый запрос проходит обработку уровнем **источника данных**, **формы** и **приложения**. Каждый уровень может дать по поводу запроса свои ответы. **Уровень источника данных** ничего не знает о специфике использования запроса в конкретной форме. Тут расположен максимально абстрагированный от контекста использования код, поддерживающий работу источника данных. **Уровень формы** обеспечивает взаимодействие источников данных между собой в контексте конкретной экранной формы. Отсюда, затронутым обработкой источникам данных, посылаются задания на перечитку. **Уровень приложения** отвечает за авторизацию и запуск на клиенте экранных форм. Тут обрабатываются запросы, требующие деклоративных описаний для запрашиваемой формы или главного меню системы. ===== Ответы, направляемые набору строк RowSet ===== **[[RowSet|Набор строк]]**, отправляя **[[Request|запрос]]**, ожидает **[[Response|ответ]]**. **[[Response|Ответ]]** обычно приходит в тот **[[RowSet|набор строк]]**, который отправил **[[Request|запрос]]**. В зависимости от **ответа** содержимое может различаться, но обычно имеет примерно такой вид: значение поля ... значение поля значение поля id1, id2, id3, ... idN ==== Значения атрибутов в ответе ==== === Атрибуты response === * **response.name** - тип **ответа**, * **ok** - запрос выполнен успешно * **error** - ошибка, все отправленные пакетом запросы не прошли * **disconnected** - принудительная авторизация * **exec** - запрос содержит внутри себя только комманду на принудительное выполнение запроса, и не содержит никаких сведеней о выполненной операции. Обычно дополнительный довесок к ответу * **response.message** - выдать сообщение * **response.exec** - после обработки ответа послать на сервер новый запрос. Формат строкового описания запроса: #this|#parent|#focus|#form|.. === элемент row === Обычно ответ содержит внутри себя строки, которые должен принять на клиенте [[Rowset|набор строк]]. Структура элемента **row** универсальна, ей можно описать любое допустимое со строкой действие. Обычно это - добавить новую строку или подменить содержимое существующей строки в [[Rowset|наборе строк]] на клиенте. Атрибуты строки * **id** - уникальный идентификатор строки * **id.change** - иногда надо у уже существующей на клиенте строки поменять id. Например это надо для присвоения id новой строке, с изначально пустым id, после сохранения в базе. * **row.focus** - необязательный параметр, попытка сделать строку текущей. Значение по умолчанию - 0 * **row.color** - необязательный параметр, имя используемой цветовой схемы отрисовки элементов строки. * **row.readonly** - необязательный параметр - запрет на редактирование. По умолчанию - 0. При конфликте значений - **приоритет запрета**: если где то запрещено, а где то разрешено, то запрещено. * **row.destmode**, **row.destid** - необязательные параметры, задают перемещение строки по источнику данных. Значение **destmode** по умолчанию - **append**. Значение **destid** по умолчанию - id текущей строки. * **row.delete** - если значение 1 то строку надо удалить * **row.new** - если значение 1 то эта новая строка, еще не сохраненная на сервере Атрибуты строки, специфичные для работы дерева * **row.icon** - иконка узла дерева, если атрибута нет, то берется из row.type, иначе по умолчанию * **row.type** - тип узла, имеет смысл, если дерево состоит из узлов разной природы (организации, сотрудники, отпуска, больничные ...) * **row.final** - лист и не может содержать дочерних узлов (по умолчанию нет) * **row.empty** - дочерних узлов нет, но могут появится, соответственно отображается как лист, но доступны операции начитки и правки дочерних узлов Атрибуты поля * **fieldname** - значение поля. Предполагается, что поле не будет содержать несохраненных изменений * **fieldname.change** - изменить значение поля. Предполагается, что поле изменено, и это изменение будет отписано на сервер при сохранении строки * **fieldname.visible** - необязательный параметр - видимость поля. По умолчанию - 1. При конфликте значений - **приоритет запрета**: если где-то не видно, а где-то видно, то не видно. * **fieldname.readonly** - необязательный параметр - недоступность правки для поля. По умолчанию - 0. При конфликте значений - **приоритет запрета**. * **fieldname.color** - необязательный параметр - цветовая схема для поля. При конфликте значений приоритет у описания цветовой схемы поля === элемент delete === Более наглядный способ сообщить о необходимости **удалить строку**. Эквивалентен элементу **row** с атрибутом **row.delete=1** === элемент append === Более наглядный способ сообщить о необходимости **добавить строку**. Эквивалентен элементу **row** с атрибутом **row.new=1** === элемент change === Более наглядный способ передать строке новые значения полей, рассчитанные на сервере, но еще не отписанные в базу - результат **[[Request|запроса]]** **change**. Эти значения будут отпишутся в базу при сохранении строки. Эквивалентно элементу **row** с атрибутами **fieldname.change="новое значение поля"** === элемент data === Позволяет задать значения данным экранной формы. Данные в последствии доступны для чтения посредством вызова get('#data.name'). ==== response name="ok" ==== Самый распространенный **ответ**, означает что **[[Request|запрос]]** обработан успешно. Если не содержит дочерних элементов **row**, то обрабатывается в зависимости от от **[[Request|запроса]]** так, как должно быть при его успешном выполнении. ... ==== response name="exec" ==== Ответ, требующий выполнения запросов значение значение ... значение ==== response name="error" ==== Ошибка при выполнении запроса. Ошибка отменяет выполнение действия, соответствующего запросу. Если атрибут **message** опущен, то сообщение не выводится, но запрашиваемое действие запрещается ==== response name="definition" ==== Ответ содержит [[rowset-definition|декларативное описание источника данных]]. Описание источника данных или Описание источника данных или упрощенно Описание источника данных ===== Ответы, направляемые приложению ===== ==== response name="form" ==== Возвращает [[form-definition|описание экранной формы]], которую надо отобразить