如何为现有属性覆盖@AdminPresentation [Broadleaf Commerce] [英] How to override the @AdminPresentation for existing attributes [Broadleaf Commerce]
问题描述
我试图覆盖 ProductImpl
中定义的以下属性的 @AdminPresentation
:
I am trying to override the @AdminPresentation
of the following attribute defined in ProductImpl
:
@Column(name = "DISPLAY_TEMPLATE")
@AdminPresentation(friendlyName = "ProductImpl_Product_Display_Template",
group = GroupName.Advanced)
protected String displayTemplate;
当前,默认情况下它显示为文本字段,因为没有提供了fieldType
属性。但是我想显示一个带有预定义值的下拉选择菜单,例如 Product
和 Plan
。到目前为止,这是我尝试过的操作:
Currently, it is displayed as a text field by default as there is no fieldType
attribute provided. But I want to display a dropdown select menu with predefined values such as Product
and Plan
. Here is what I've tried so far:
我创建了一个实现<$ c的类 DisplayTemplateType
$ c> BroadleafEnumerationType 并定义了 PLAN
和 PRODUCT
枚举。这是该类的代码:
I've created a class DisplayTemplateType
that implements BroadleafEnumerationType
and defined PLAN
and PRODUCT
enums. Here is the code of that class:
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
文件中,我添加了以下覆盖属性:
Then in applicationContext-admin.xml
file, I have added the following override properties:
<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>
但它没有任何改变。我在这里遗漏了什么吗?
But it didn't change anything. Am I missing something here?
推荐答案
最后,尝试了很多事情之后,我想出了一种解决方法。不必使用基于XML的方法,我不得不扩展 ProductImpl
类以覆盖其属性的 @AdminPresentation
。但是对于扩展,我需要定义一个 @Entity
,因此,我需要创建一个无用的表来绑定到该实体。我知道这不是完美的方法,但是我找不到更好的解决方案。这是我的代码,以便将来有人可以从中获得帮助:
Finally, after trying many things, I came up with a workaround. Instead of going with the XML based approach, I had to extend the ProductImpl
class to override @AdminPresentation
of its attributes. But for extending I needed to define an @Entity
and as a result, I needed to create a useless table to bind to that entity. I know this is not the perfect approach but I couldn't find any better solution for this. Here is my code, so that someone might get help from it in the future:
@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;
}
现在是这样显示的:
这篇关于如何为现有属性覆盖@AdminPresentation [Broadleaf Commerce]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!