Как переопределить @AdminPresentation для существующих атрибутов [Broadleaf Commerce] - PullRequest
1 голос
/ 20 июня 2019

Я пытаюсь переопределить @AdminPresentation следующего атрибута, определенного в ProductImpl:

@Column(name = "DISPLAY_TEMPLATE")
@AdminPresentation(friendlyName = "ProductImpl_Product_Display_Template",
        group = GroupName.Advanced)
protected String displayTemplate;

В настоящее время он отображается в виде текстового поля по умолчанию, так как отсутствует атрибут fieldTypeпредоставлена.Но я хочу отобразить выпадающее меню выбора с предопределенными значениями, такими как Product и Plan.Вот что я попробовал до сих пор:

Я создал класс DisplayTemplateType, который реализует BroadleafEnumerationType и определил перечисления PLAN и PRODUCT.Вот код этого класса:

public class DisplayTemplateType implements Serializable, BroadleafEnumerationType {

    private static final long serialVersionUID = 7761108654549553693L;

    private static final Map<String, DisplayTemplateType> TYPES = new LinkedHashMap<String, DisplayTemplateType>();

    public static final DisplayTemplateType PLAN = new DisplayTemplateType("PLAN", "PLAN");
    public static final DisplayTemplateType PRODUCT = new DisplayTemplateType("PRODUCT", "PRODUCT");

    public static DisplayTemplateType getInstance(final String type) {
        return TYPES.get(type);
    }

    private String type;
    private String friendlyType;

    public DisplayTemplateType() {
        //do nothing
    }

    public DisplayTemplateType(final String type, final String friendlyType) {
        this.friendlyType = friendlyType;
        setType(type);
    }

    @Override
    public String getType() {
        return type;
    }

    @Override
    public String getFriendlyType() {
        return friendlyType;
    }

    private void setType(final String type) {
        this.type = type;
        if (!TYPES.containsKey(type)) {
            TYPES.put(type, this);
        } else {
            throw new RuntimeException("Cannot add the type: (" + type + "). It already exists as a type via " + getInstance(type).getClass().getName());
        }
    }
    // equals() and hashCode() implementation is removed for readability
}

Затем в файл applicationContext-admin.xml я добавил следующие свойства переопределения:

<mo:override id="blMetadataOverrides">
        <mo:overrideItem ceilingEntity="org.broadleafcommerce.core.catalog.domain.Product">
        <mo:field name="displayTemplate">
                <mo:property name="explicitFieldType" value="BROADLEAF_ENUMERATION"/>
                <mo:property name="broadleafEnumeration" value="com.community.core.domain.DisplayTemplateType"/> 
            </mo:field>
        </mo:overrideItem>
</mo:override>

Но это ничего не изменило.Я что-то здесь упускаю?

1 Ответ

0 голосов
/ 20 июня 2019

Наконец, после многих попыток, я нашел обходной путь. Вместо того чтобы использовать подход, основанный на XML, мне пришлось расширить класс ProductImpl, чтобы переопределить @AdminPresentation его атрибутов. Но для расширения мне нужно было определить @Entity, и в результате мне нужно было создать бесполезную таблицу для привязки к этой сущности. Я знаю, что это не идеальный подход, но я не мог найти лучшего решения для этого. Вот мой код, чтобы кто-то мог получить от него помощь в будущем:

@Entity
@Immutable
@AdminPresentationMergeOverrides({
        @AdminPresentationMergeOverride(name = "displayTemplate", mergeEntries = {
                @AdminPresentationMergeEntry(propertyType = PropertyType.AdminPresentation.FIELDTYPE, overrideValue = "BROADLEAF_ENUMERATION"),
                @AdminPresentationMergeEntry(propertyType = PropertyType.AdminPresentation.BROADLEAFENUMERATION, overrideValue = "com.community.core.domain.DisplayTemplateType"),
                @AdminPresentationMergeEntry(propertyType = PropertyType.AdminPresentation.REQUIREDOVERRIDE, overrideValue = "REQUIRED"),
                @AdminPresentationMergeEntry(propertyType = PropertyType.AdminPresentation.DEFAULTVALUE, overrideValue = "PLAN")
        })
})
public class CustomProduct extends ProductImpl {

    private static final long serialVersionUID = -5745207984235258075L;
}

Вот как это отображается сейчас:

This is how it is displayed now

...