Skip to main content

Динамика

N2O разделяет шаблон и данные. Это хорошо сказывается на производительности, но может вызвать проблемы с реализацией интерфейсов, у которых шаблон зависит от данных. Для реализации таких динамических интерфейсов в N2O существует ряд приёмов.

Динамические свойства#

Вычисляемые значения атрибутов#

Некоторые атрибуты в компонентах можно задавать через javaScript выражения:

Доступность чекбокса по условию
<column label="Активность">  <checkbox enabled="{status == 'open'}"/>  <!-- "{status == 'open'}" выражение над строкой таблицы --></column>
Иконка в таблице по данным строки
<column label="Тип">  <icon class="{iconClass}"/>  <!-- "{iconClass}" ссылка на поле выборки --></column>

Форматирование значений#

Ссылки на значения можно объединять с текстом:

Форматирование значения столбца таблицы
<column label="ФИО">  <text format="{firstName} {lastName} ({positionName})"/></column>

Переключатели вложенных метаданных#

Некоторые вложенные метаданные можно переключать в зависимости от данных с помощью элемента switch:

Переключаемая ячейка таблицы

<column>  <switch value-field-id="type">    <case value="type1">        <badge.../>        <!-- Значок, если type == type1 -->    </case>    <case value="type2">        <icon.../>        <!-- Иконка, если type == type2 -->    </case>    ...    <default>        <text/>        <!-- Текст, в остальных случаях -->    </default>  </switch></column>
Переключаемый виджет
<simple-page>  <switch value-field-id="code">    <case value="org">      <table ref-id="organizations"/>      <!-- Таблица организаций, если code == 'org' -->    </case>    <case value="dep">      <table ref-id="departments"/>      <!-- Таблица отделов, если code == 'dep' -->    </case>  </switch></simple-page>

Динамические ссылки на метаданные#

В некоторых местах можно ссылаться на разные метаданные в зависимости от данных:

Динамическая ссылка на страницу
<action>  <open-page page-id="{tableName}" model="resolve"/>  <!-- {tableName} ссылка на поле в выделенной записи таблицы --></action>
Динамическая ссылка на виджет
<simple-page>  <form ref-id="{type}"/>  <!-- {type} ссылка на поле в модели фильтров --></simple-page>
warning

Виджеты, которые открываются параметризованной ссылкой, должны иметь некоторые общие черты. Например, если задана Master Detail фильтрация, то все виджеты должны иметь одно и то же поле detail-field-id.

Параметризованные метаданные#

В динамических интерфейсах часто шаблон интерфейса генерируется по данным. Например, генерируется имя виджета или страницы, генерируется столько столбцов таблицы, сколько их пришло в данных.

В N2O можно загружать разные метаданные по одному и тому же источнику (например, xml файлу), используя параметры. Параметры задаются в идентификаторе метаданной после знака "вопрос":

id?params
important

Параметры не могут содержать зарезервированные символы URI, такие как &?/#; и другие. Либо такие символы должны быть закодированы (UriEncode).

Параметры могут быть константами или динамическими.

Пример параметризации с константными значениями
<form>    <input-select label="Организация" query-id="refbook?table=organization">...    <input-select label="Подразделение" query-id="refbook?table=department">  ...</form>
<!-- refbook.query.xml --><query>  <list>    <sql>select * from refbook r where r.table=${table}</sql>  </list></query>

Параметры можно задавать динамически используя ссылку на данные:

Динамически параметризованная выборка
<table query-id="refbook?table={table_name}">  <!-- {table_name} ссылка на поле в модели фильтров таблицы --></table>

Генерация метаданных#

В N2O метаданные можно сгенерировать в момент их первой загрузки с помощью провайдеров на языке java. Для этого необходимо создать реализацию интерфейса DynamicMetadataProvider, и зарегистрировать её в качестве Spring Bean.

Реализация провайдера метаданных на Java
@Servicepublic class MyTableProvider implements DynamicMetadataProvider {    /**     * @return Код провайдера     */    @Override    public String getCode() {        return "myTableProvider";    }
    /**     * @param params Параметры провайдера     * @return Список сгенерированных метаданных     */    @Override    public List<? extends N2oMetadata> provide(String params) {        ...    }    /**      * @return Типы генерируемых метаданных      */    public Collection<Class<? extends N2oMetadata>> getMetadataClasses() {        return Arrays.asList(N2oTable.class);    }
}

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

Ссылка на провайдер таблицы с динамическим параметром
<table ref-id="myTableProvider?{table_name}"/><!-- {table_name} ссылка на поле в модели фильтров -->