Как создать выпадающий список выбора года

#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