0

我正在尝试在 Magnolia CMS 中创建自定义字段。出于测试目的,我尝试了最简单的示例,并以与 TextField 相同的方式进行操作。

这是我的定义:

package info.magnolia.blossom.sample.module.ui.form.field.definition;

import info.magnolia.i18nsystem.I18nText;
import info.magnolia.ui.field.ConfiguredFieldDefinition;
import info.magnolia.ui.field.FieldType;

@FieldType("customTextField")
public class CustomTextFieldDefinition extends ConfiguredFieldDefinition<String>  {
    private int rows;
    private int maxLength = -1;
    private String placeholder;

    @Inject
    public CustomTextFieldDefinition() {
        this.setType(String.class);
        this.setFactoryClass(CustomTextFieldFactory.class);
    }


    @Override
    public String getLabel() {
        return super.getLabel() + "33";
    }

    @I18nText(
            fallback = ""
    )
    public String getPlaceholder() {
        return this.placeholder;
    }

    public int getRows() {
        return this.rows;
    }

    public int getMaxLength() {
        return this.maxLength;
    }

    public void setRows(int rows) {
        this.rows = rows;
    }

    public void setMaxLength(int maxLength) {
        this.maxLength = maxLength;
    }

    public void setPlaceholder(String placeholder) {
        this.placeholder = placeholder;
    }
}

这是我的工厂课程:

package info.magnolia.blossom.sample.module.ui.form.field.factory;

import com.vaadin.data.HasValue;
import com.vaadin.ui.AbstractTextField;
import com.vaadin.ui.Component;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.TextField;
import info.magnolia.blossom.sample.module.ui.form.field.definition.CustomTextFieldDefinition;
import info.magnolia.objectfactory.ComponentProvider;
import info.magnolia.ui.field.factory.AbstractFieldFactory;

import javax.inject.Inject;

public class CustomTextFieldFactory  extends AbstractFieldFactory<String, CustomTextFieldDefinition> {

    @Inject
    public CustomTextFieldFactory(CustomTextFieldDefinition definition, ComponentProvider componentProvider) {
        super(definition, componentProvider);
    }

    @Override
    public HasValue<String> createField() {
        return super.createField();
    }

    @Override
    public Component createFieldComponent() {
        Object field;
        if (this.getDefinition().getRows() > 1) {
            TextArea textArea = new TextArea();
            textArea.setRows(this.getDefinition().getRows() + 10);
            field = textArea;
        } else {
            field = new TextField();
        }

        if (this.getDefinition().getMaxLength() != -1) {
            ((AbstractTextField)field).setMaxLength(this.getDefinition().getMaxLength());
        }

        ((AbstractTextField)field).setPlaceholder(this.getDefinition().getPlaceholder());
        return (Component)field;
    }
}

这是我的注册表: 在此处输入图像描述

这是我的对话框:

form:
  tabs:
    - name: tabMain
      fields:
        - name: title
          class: info.magnolia.ui.form.field.definition.TextFieldDefinition
        - name: resultPage
          i18n: true
          class: info.magnolia.blossom.sample.module.ui.form.field.CustomTextFieldDefinition
          label: Test Field
actions:
  commit:
    class: info.magnolia.ui.admincentral.dialog.action.SaveDialogActionDefinition
  cancel:
    class: info.magnolia.ui.admincentral.dialog.action.CancelDialogActionDefinition

这就是我看到的结果: 在此处输入图像描述 如您所见,第二个字段未显示。

我在控制台中没有错误。我在定义应用程序中唯一的“次要”错误是这个:

Element [info.magnolia.blossom.sample.module.ui.form.field.definition.CustomTextFieldDefinition@7e441530] 
of type [info.magnolia.blossom.sample.module.ui.form.field.definition.CustomTextFieldDefinition] 
may not be added to the collection of type 
[interface info.magnolia.ui.form.field.definition.FieldDefinition]

Title: Source data processing problem
Path: /form/tabs/tabMain/fields/resultPage

我正在使用 Magnolia 6.2.3。

知道我错过了什么吗?

谢谢!

4

1 回答 1

1

你的例子都是正确的。但是,您尝试将该对话框添加到“兼容性应用程序”。这就是为什么您收到错误消息“我无法添加此类型”,它表明它尝试使用不同的字段定义(定义包中的那个)

此页面很好地解释了兼容性应用程序和新应用程序背后的逻辑。

https://documentation.magnolia-cms.com/display/DOCS62/Changes+in+Magnolia+6+UI

于 2020-10-16T07:23:11.380 回答