如何创建年份选择器下拉菜单

问题描述

我想知道如何在木兰中创建年份选择器下拉字段。

理想情况下,它将列出从当前年份到过去10年的年份。

我是木兰的新手,我可以使用硬编码的选项创建“选择”字段,但这不是一个方法,而且我很难创建动态选项。参见:

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

有人知道吗?

解决方法

如果使用最新版本的Magnolia 6.2,则可以使用 Ducaz035 所说的数据源。在此处查看文档:{​​{3}}

对于以前的版本,这种方式是不可能的。您只能创建自己的字段,进行注册,并在实现中做任何您想做的事情。就您而言,只需覆盖 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 类。我们需要它来注册我们自己的字段类型。

要注册该字段,请向您的模块添加新的fieldType(或其他模块,没关系)。这是该字段的YAML定义:

your-module-name:
  fieldTypes:
    yearSelectField: 
      definitionClass: com.example.fields.YearSelectFieldDefinition
      factoryClass: com.example.fields.YearSelectFieldFactory

现在,您可以在对话框定义中使用此字段。设置字段的类:

field:
  name: year
  class: com.example.fields.YearSelectFieldDefinition
,

您可以将数据源附加到该字段,并让该数据源使用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