When we build a dialog in CQ5, we could need to define a custom action responding to a specific event.
Imagine for example that you need to copy the content of one field into another one or maybe you need to show/hide a specific field depending on the value of another field. These are typical examples where you need to define a listener in a CQ5 dialog in order to do something.
So let’s see how to define a custom listener in few steps. In the following example I will show how you can show/hide a field in a dialog, depending on the value of another field.
- First of all, we need add an id (itemId) to the element that we need show/hide, in order to being able to select it by JS. In our example, I set this id as idField.
- Then we need add a listener to the the field that we need to evaluate the value:
- If the value is 0, we hide the field with the specified id and we set the field as not required
- If the value is 1, we show the field with the specified id and we set the field as required
Here you can find the complete dialog example.
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
jcr:primaryType="cq:Dialog"
height="{Long}600"
helpPath="en/cq/current/wcm/default_components.html#Text"
title="Text"
width="{Long}700"
xtype="dialog">
<items jcr:primaryType="cq:WidgetCollection">
<tabs jcr:primaryType="cq:TabPanel">
<items jcr:primaryType="cq:WidgetCollection">>
<item1
jcr:primaryType="cq:Widget"
title="Tab Title"
xtype="panel">
<items jcr:primaryType="cq:WidgetCollection">
<option1
jcr:primaryType="cq:Widget"
fieldLabel="Options"
name="./option"
type="radiogroup"
defaultValue="0"
xtype="selection">
<options jcr:primaryType="cq:WidgetCollection">
<automatic
jcr:primaryType="nt:unstructured"
text="Hide Field"
value="0"/>
<blank
jcr:primaryType="nt:unstructured"
text="Show field"
value="1"/>
</options>
<listeners jcr:primaryType="nt:unstructured" selectionchanged="function(comp, val, isChecked) {
var panel = comp.findParentByType('panel');
var link = panel.getComponent('idField');
if(val == 1){
link.show();
link.allowBlank = false;
}else{
link.hide();
link.allowBlank = true;
}
}"/>
</option1>
<link1
itemId="idField"
jcr:primaryType="cq:Widget"
fieldDescription="Insert here the path of the product"
fieldLabel="Path"
name="./link1"
xtype="pathfield">
</link1>
</items>
</item1>
</items>
</tabs>
</items>
</jcr:root>
You can check all the documentation about widgets, event and more at https://docs.adobe.com/docs/en/cq/5-5/widgets-api/index.html (in this case for CQ5.5)