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>

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

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

Форматирование значений
<fields>
<alert id="success" text="Привет, {name}!" color="success"/>
<input-text id="name" default-value="Мир"/>
</fields>

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

Некоторые вложенные метаданные можно переключать в зависимости от данных с помощью элемента 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
info

Параметры не могут содержать зарезервированные символы 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
@Service
public 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"/>