on ‎2018 Jul 16 9:58 AM
Hello, I have to implement editing feature for my custom CMSComponent and everything is OK, except for one thing - it contains maptype attribute (Map<String, CarouselDisplayingConfig>).
<maptypes>
<maptype code="CarouselConfigsMap"
argumenttype="java.lang.String"
returntype="CarouselDisplayingConfig"
autocreate="true"
generate="true"/>
</maptypes>
<itemtype code="CarouselDisplayingConfig" autocreate="true" generate="true"
extends="SimpleCMSComponent"
jaloclass="cms.components.CarouselDisplayingConfig">
<deployment table="carouseldisplayingconfig" typecode="16021"/>
<attributes>
--HERE LIST OF ATTRIBUTES--
</attributes>
</itemtype>
<itemtype code="TopCategoriesComponent" extends="SimpleCMSComponent"
autocreate="true" generate="true"
jaloclass="cms.components.TopCategoriesComponent">
<deployment table="topcategoriescomponent" typecode="16049" />
<attributes>
<attribute qualifier="heading" type="localized:java.lang.String">
<modifiers read="true" write="true" optional="true"/>
<persistence type="property"/>
</attribute>
<attribute qualifier="displayingConfigs" type="CarouselConfigsMap">
<modifiers read="true" write="true" optional="true"/>
<persistence type="property"/>
</attribute>
-- ANOTHER ATTRIBUTES IS OMITTED FOR THE SAKE OF SIMPLICITY --
</attributes>
</itemtype>
I've added DefaultMapEditorRenderer to map of editors for DefaultPropertyEditorDescriptor which editor type is REFERENCE within cmscockpit-editors.xml
<bean class="de.hybris.platform.cockpit.model.meta.DefaultPropertyEditorDescriptor">
<property name="editorType" value="REFERENCE"/>
<property name="defaultMode" value="single"/>
<property name="defaultEditor" value="de.hybris.platform.cockpit.model.referenceeditor.simple.impl.DefaultSimpleReferenceUIEditor"/>
<property name="editors">
<map>
<!--
Add this editor because of CarouselConfigsMap
-->
<entry key="mapEditor" value="com.hybris.cockpitng.editor.defaultmap.DefaultMapEditorRenderer"/>
-- ANOTHER EDITORS IS OMITTED FOR THE SAKE OF SIMPLICITY --
</map>
</property>
<property name="label" value="referenceEditor"/>
</bean>
And added it to contentEditor.xml as editorCode="mapEditor"
<?xml version="1.0" encoding="UTF-8"?>
<content-editor hideEmpty="true" hideReadOnly="true"
groupCollections="true">
<template>
<![CDATA[
<table style="width: 100%; margin: 0px; padding: 0px;">
<tbody>
<tr><td><div style="height:6px"/></td></tr>
<tr><td style="text-align:left"><cockpit code="property" value="TopBrandsComponent.displayingConfigurations"/></td></tr>
</tbody>
</table>
]]>
</template>
<custom-editors>
<property qualifier="TopBrandsComponent.displayingConfigurations" editorCode="mapEditor"/>
</custom-editors>
</content-editor>
When I'm trying to edit this component within WCMSCockpit I get Error:
[Thread-62] [DefaultPropertyEditorDescriptor] Can not create editor component for type REFERENCE and mode "mapEditor".
Does someone know how to handle the editing process for Maptype within WCMSCockpit?
Hybris version: 5.7
Many thanks for any advice.
Request clarification before answering.
Hi , thank you for response! You're right! When I've changed com.hybris.cockpitng.editor.defaultmap.DefaultMapEditorRenderer to de.hybris.platform.cockpit.model.editor.impl.MapUIEditor then I get an Error:
java.lang.IllegalArgumentException: Initial value 'CarouselDisplayingConfigModel (8796322446997)' not a typed object.
at de.hybris.platform.cockpit.model.referenceeditor.simple.impl.DefaultSimpleReferenceUIEditor.createViewComponent(DefaultSimpleReferenceUIEditor.java:138) at de.hybris.platform.cockpit.model.editor.impl.MapUIEditorRowRenderer.render(MapUIEditorRowRenderer.java:116) at org.zkoss.zul.Listbox$Renderer.render(Listbox.java:2336)
So I've decided to wrap my CarouselDisplayingConfigModel (which is extends from SimpleCMSComponent) to TypedObject. By extending from MapUIEditor and override its method:
@Override
public HtmlBasedComponent createViewComponent(Object initialValue, Map<String, ?> parameters, EditorListener listener) {
Map<String, TypedObject> wrappedItems = new LinkedHashMap<>();
if (initialValue instanceof Map){
Map <String, CarouselDisplayingConfigModel> tempMap= new LinkedHashMap<>((Map)initialValue);
for (Map.Entry<String, CarouselDisplayingConfigModel> entry : tempMap.entrySet()) {
wrappedItems.put(entry.getKey(), wrapValue(entry.getValue()));
}
}
return super.createViewComponent(wrappedItems, parameters, listener);
}
private TypedObject wrapValue(CarouselDisplayingConfigModel value) {
return UISessionUtils.getCurrentSession().getTypeService().wrapItem(value);
}
And finally it became appear at cmscockpit. Hurray!
But ... To my disappointment, I can't edit Map value through this editor because of it throws NPE

java.lang.NullPointerException
at de.hybris.platform.cockpit.model.referenceeditor.simple.SimpleReferenceSelector.showReferenceSelectorModalDialog(SimpleReferenceSelector.java:754) at de.hybris.platform.cockpit.model.referenceeditor.simple.SimpleReferenceSelector.updateMode(SimpleReferenceSelector.java:185) at de.hybris.platform.cockpit.model.referenceeditor.simple.impl.DefaultSimpleReferenceSelectorModelListener.modeChanged(DefaultSimpleReferenceSelectorModelListener.java:57) at de.hybris.platform.cockpit.model.referenceeditor.simple.AbstractSimpleSelectorModel.fireModeChanged(AbstractSimpleSelectorModel.java:48) at de.hybris.platform.cockpit.model.referenceeditor.simple.impl.DefaultSimpleReferenceSelectorModel.setMode(DefaultSimpleReferenceSelectorModel.java:215) at de.hybris.platform.cockpit.model.referenceeditor.simple.impl.DefaultSimpleReferenceSelectorListener.selectorAdvancedMode(DefaultSimpleReferenceSelectorListener.java:191) at de.hybris.platform.cockpit.model.referenceeditor.simple.AbstractSimpleReferenceSelector.fireSelectorAdvancedMode(AbstractSimpleReferenceSelector.java:71) at de.hybris.platform.cockpit.model.referenceeditor.simple.SimpleReferenceSelector$7.onEvent(SimpleReferenceSelector.java:486)
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hello,
I have suspicion that you try to combine two different modules with each other.
WCMS cockpit is old solution. CokcpitNG is a new framework for backoffie application.
You've added cockpitng renderer in your old cockpit (that is not allowed)
<entry key="mapEditor" value="com.hybris.cockpitng.editor.defaultmap.DefaultMapEditorRenderer"/>
Maybe you had intention to map it to the de.hybris.platform.cockpit.model.editor.impl.MapUIEditor?
Cheers
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
| User | Count |
|---|---|
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.