我想知道如何在木兰中创建年份选择器下拉字段。
理想情况下,它将列出从当前年份到过去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
有人知道吗?
答案 0 :(得分:1)
如果使用最新版本的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
答案 1 :(得分:0)
您可以将数据源附加到该字段,并让该数据源使用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