Extension API
ORBISmap позволяет изменять стандартное поведение системы не изменяя исходный код проекта. Для таких случаев применяется Extension API. Extension API реализован через плагины, которые позволяют изменять поведение любого метода всех классов системы.
С использованием плагинов возможно:
- используя предобработчик, выполнить произвольный код перед требуемым методом. Предобработчик получает те же входные данные, что и исходный метод. Его основная задача - адаптировать их и выдать основному обработчику.
Правило именования: должен иметь имя
before_<имя метода>
; - используя заменитель, выполнить произвольный код вместо требуемого метода. Должен иметь те же входные и выходные параметры (по количеству и типам), что и метод.
Правило именования: должен иметь имя
instead_<имя метода>
; - используя постобработчик, выполнить произвольный код после требуемого метода в качестве параметров получает результат метода, а также его исходные параметры. В качестве конечного результата используется именно результат постобработчика.
Правило именования: должен иметь имя
after_<имя метода>
.
Для более наглядного представления рассмотрим на примере, как использовался Extension API для генерации PDF-документа.
Задача: Формировать PDF-документ в соответствии с макетом.
Что заставило использовать расширение: Базовое поведение системы предполагает, что в генерируемый PDF-документ будут попадать все заполненные значения объекта с учетом локализации, а значения группируются в блоки информации по заголовкам, которым они принадлежат. В утвержденном макете требовалось, чтобы выводились не все поля блока, а только определенные, некоторые значения, объединенные одним заголовком должны попадать в другой блок информации, некоторые заголовки со всеми значениями не должны попадать в генерируемый файл.
Реализация: При получении запроса на информацию по объекту в формате PDF, система ORBISmap выполняет следующую последовательность действий:
- формирует экземпляр класса
Object
; - выполняет выборку этого объекта из СУБД
(Object.SelectByID(<int: object_id>))
; - выполняет сериализацию объекта
(Object.FormatPdfApi())
:- создается экземпляр объекта класса Pdf;
- выполняется подготовка данных объекта (значений полей объекта) посредством вызова
Object._prepareColumnsToPdf()
;
- выполняется добавление контента в объект Pdf
(Pdf.AddContent())
; - Сформированный PDF возвращается в виде ответа клиенту, который запросил информацию.
Очевидно, что для изменения фильтрации (какие значения должны попасть в итоговый документ) и группировки (какому заголовку должно принадлежать какое значение) необходимо изменить базовое поведение метода _prepareColumnsToPdf().
Для этого:
Был создан файл plugins/v_2_0/Object.py
В созданном файле определен метод instead__prepareColumnsToPdf()
– данный метод выполняется вместо метода _prepareColumnsToPdf()
. В методе выполняется код, который выбирает только те значения, которые необходимы для формирования PDF файла.
В созданном файле определен метод after__prepareColumnsToPdf()
, который выполнится после instead__prepareColumnsToPdf()
и перегруппирует уже полученные значения в соответствии с утвержденным макетом.