Динамика
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¶m2=value2
Параметры не могут содержать зарезервированные символы URI, такие как &?/#; и другие. Либо такие символы должны быть закодированы (UriEncode).
Параметры могут быть константными:
<fields>
<select label="Организация" query-id="refbook?table=organization"/>
<select label="Подразделение" query-id="refbook?table=department"/>
</fields>
Чтобы использовать параметр необходимо вставить его код в знак $
и фигурные скобки ${param}
, аналогично настройкам:
<query>
<list>
<sql>select * from ${table}</sql>
</list>
...
</query>
Генерация метаданных
В N2O метаданные можно сгенерировать в момент их первой загрузки с помощью провайдеров на языке java.
Для этого необходимо создать реализацию интерфейса DynamicMetadataProvider
, и зарегистрировать её в качестве Spring Bean.
@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"/>