Урок 5. Работа с JSON
Если вы прошли расширенные уроки, то можете смело переходить к разделу...
Работу с JSON будем рассматривать на примере карточки заказа, так как заказ имеет вложенные сущности и потенциально может иметь больше уровней вложенности. Теперь будет интересно увидеть, как изменится форма с использованием JSON-объекта.
Построение объекта
С формы заказа на сервер должен уходить JSON-объект подобного вида:
Так как JSON-объект представляет собой набор пар "ключ-значение", то нам необходимо создать структуру <Structure>
типа Dictionary, которую присвоим в объект Variable:
Обратите внимание, что у тэга <MyObject>
стоит атрибут ChangeForm
со значением False - этот объект вспомогательный, форма не должна его учитывать при проверке наличия изменений.
Добавим необходимые ключи в структуру и укажем источники данных:
Для поля client_id из OrderPrimaryGetDataConnection необходимо получить одно единственное значение - для этого используем атрибут GetScalar
со значением True.
Для поля order_position, содержащего массив объектов, используем конструкцию <Array>
с преобразованием массива строк из ConvertDataConnection в массив словарей.
У тэгов <Parameter>
и <DataConnection>
появился атрибут Refresh
, который определяет, будет ли обновляться значение у тэгов <Key>
и <Array>
, если изменится значение источника. Таким образом, значение объекта OrderDictionaryVariable не будет пересчитываться каждый раз, когда измениться какой-либо источник.
Для ручного пересчета OrderDictionaryVariable нужно использовать команду ValueSetCommand для вызова set-проперти Refresh
у объекта Variable:
Чтобы словарь преобразовать к JSON-объекту, создадим команду типа SerializeToJsonCommand:
Команда SerializeToJsonCommand при формировании JSON-объекта преобразует все даты со временем к UTC относительно пользовательских настроек временной зоны.
Сохранение изменений
Добавьте кнопку сохранить, как делали на экране со списком ТМЦ.
Создадим SetDataConnection, который в параметре Model будет передавать на сервер сериализованный JSON-объект:
Где запрос будет иметь вид:
Создадим последовательность команд SaveSequentialCommand, в которую добавим команды на построение JSON_объекта и команду передачи данных на сервер:
Не забывайте про паттерн Updated.
Сохранение в базу
Реализуйте функцию template.order_save(json). Функция должна возвращать order_id, который необходимо отлавливать на форме TemplateOrderEdit.xml и писать в параметр OrderId.
Не забывайте про работу с датой со временем и временные зоны. В JSON-строке на сервер даты со временем придут в UTC. Для приведения времени во временную зону сервера используйте функцию public.convert_date_json(timestamp without time zone).
Last updated