Skip to main content

Динамика

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

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

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

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

Иконка в таблице по данным строки
<column label="Тип">    <!-- "{iconClass}" ссылка на поле выборки -->    <icon class="{iconClass}"/></column>
Заголовок поля по значению другого поля
<radio-group id="contactType"             label="Тип контакта">    <options>        <option id="1" name="Мобильный телефон"/>        <option id="2" name="Электронная почта"/>    </options></radio-group>
<input-text id="contactValue"            label="{contactType.name}"/><!-- Заголовок поменяется при выборе типа контакта -->
Доступность чекбокса по условию
<column label="Активность">    <!-- "{status == 'open'}" выражение над строкой таблицы -->    <checkbox enabled="`status == 'open'`"/></column>

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

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

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

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

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

Переключатель ячейки столбца таблицы
<column>    <switch value-field-id="type">        <case value="type1">            <!-- Значок, если type == type1 -->            <badge.../>        </case>        <case value="type2">            <!-- Иконка, если type == type2 -->            <icon.../>        </case>        ...        <default>            <!-- Текст, в остальных случаях -->            <text/>        </default>    </switch></column>

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

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

Динамическая ссылка на страницу
<button>    <!-- {tableName} ссылка на поле в текущей модели данных -->    <open-page page-id="{tableName}"/></button>

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

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

id?param1=value1&param2=value2
important

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

Параметры могут быть константными:

Пример параметризации с константными значениями
<fields>    <select label="Организация" query-id="refbook?table=organization"/>    <select label="Подразделение" query-id="refbook?table=department"/></fields>

Чтобы использовать параметр необходимо вставить его код в знак $ и фигурные скобки ${param}, аналогично настройкам:

refbook.query.xml
<query>    <list>        <sql>select * from ${table}</sql>    </list>    ...</query>

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

В 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?param=123"/>