#magnolia
#magnolia
Вопрос:
Интересно, как создать выпадающее поле выбора года в Magnolia.
В идеале в нем будут перечислены годы с текущего года до, скажем, 10 лет назад.
Я новичок в magnolia, и я могу создать поле выбора с жестко заданными параметрами, но это не очень хороший подход, и мне трудно создавать динамические параметры. Смотрите:
name: year
fieldType: select
multiselect: false
label: Year
options:
- name: 2020
label: 2020
selected: true
value: 2020
- name: 2019
label: 2019
selected: false
value: 2019
У кого-нибудь есть идея?
Ответ №1:
Если вы используете последнюю версию Magnolia 6.2, вы можете использовать источник данных, как упоминал Ducaz035. Смотрите документацию здесь: https://documentation.magnolia-cms.com/display/DOCS62/Select field
Для предыдущей версии этот способ невозможен. Вы можете только создать свое собственное поле, зарегистрировать его и делать все, что захотите в реализации. В вашем случае просто переопределите класс GetOptions.
public class YearSelectFieldFactory<D extends YearSelectFieldDefinition> extends SelectFieldFactory<D> {
public YearSelectFieldFactory(D definition, Item relatedFieldItem, UiContext uiContext, I18NAuthoringSupport i18nAuthoringSupport) {
super(definition, relatedFieldItem, uiContext, i18nAuthoringSupport);
}
public YearSelectFieldFactory(D definition, Item relatedFieldItem) {
super(definition, relatedFieldItem);
}
@Override
public List<SelectFieldOptionDefinition> getOptions() {
List<SelectFieldOptionDefinition> res = new ArrayList<>();
int currentYear = LocalDate.now().getYear();
for (int i = currentYear - 10; i <= currentYear; i ) {
SelectFieldOptionDefinition option = new SelectFieldOptionDefinition();
option.setName(String.format("Year%s", i));
option.setLabel(String.format("Year %s", i));
option.setValue(String.valueOf(i));
res.add(option);
}
res.get(0).setSelected(true);
return res;
}
}
YearSelectFieldDefinition просто расширяет класс SelectFieldDefinition. Он нужен нам для регистрации нашего собственного типа поля.
Чтобы зарегистрировать поле, добавьте новый тип поля в свой модуль (или какой-либо другой модуль, это не имеет значения). Вот определение YAML для поля:
your-module-name:
fieldTypes:
yearSelectField:
definitionClass: com.example.fields.YearSelectFieldDefinition
factoryClass: com.example.fields.YearSelectFieldFactory
Теперь вы можете использовать это поле в определениях диалогового окна. Задайте класс для поля:
field:
name: year
class: com.example.fields.YearSelectFieldDefinition
Ответ №2:
Вы можете прикрепить источник данных к полю и позволить источнику данных предоставить вам месяцы, используя Java.
Пример из документации:
listSelect:
label: Contacts
$type: listSelectField
datasource:
$type: jcrDatasource
workspace: contacts
describeByProperty: firstName
allowedNodeTypes:
- mgnl:contact
И ссылка на документацию напрямую:
https://documentation.magnolia-cms.com/display/DOCS62/Select field