cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Maptype in WCMSCockpit

Former Member
0 Likes
552

Hello, I have to implement editing feature for my custom CMSComponent and everything is OK, except for one thing - it contains maptype attribute (Map&ltString, 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.

Accepted Solutions (0)

Answers (2)

Answers (2)

Former Member
0 Likes

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)

former_member437308
Active Participant
0 Likes

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