我在AEM项目中有一个配置,我想简化.
可以由两组用户更改配置.一个需要对一组参数进行精细控制,另一个只需要关注一个参数.
我没有编写自定义Ext JS插件来隐藏/显示字段并添加额外字段以在正常/简化模式之间切换,而是决定为那些对粒度配置不太感兴趣的人创建一个单独的组件.
在我dialog.xml的全功能组件中,我有以下字段:
<field1
jcr:primaryType="cq:Widget"
allowBlank="false"
fieldLabel="Field 1"
name="./field1"
xtype="selection"
type="select"
options="/bin/myapp/fancyOptions.json" />
<field2
jcr:primaryType="cq:Widget"
allowBlank="false"
fieldLabel="Field 2"
name="./field2"
xtype="selection"
type="select"
options="/bin/myapp/fancyOptions.json" />
<field3
jcr:primaryType="cq:Widget"
allowBlank="false"
fieldLabel="Field 3"
name="./field3"
xtype="selection"
type="select"
options="/bin/myapp/fancyOptions.json" />
Run Code Online (Sandbox Code Playgroud)
在简化组件的对话框中,我只需要一个字段:
而Field 1,Field 2和Field 3的值应该从Field的值推断出来(在这种情况下,所有3个字段应该具有相同的值)
我不想引入单独的Sling Model或任何其他Adaptable,我希望保持内容结构的一致性,以便在后端更容易使用.
- myComponent
- field1
- field2
- field3
Run Code Online (Sandbox Code Playgroud)
是否可以将Classic UI对话框中的一个字段映射到内容存储库中的多个属性,而无需创建自定义Ext JS小部件以单独发布它们?我可以写一个但我想尽可能避免它.
是的,这是可能的。SlingPostServlet支持一个名为 的参数,该参数允许它根据不同字段的值生成内容存储库中属性的内容。@ValueFrom
下面是一个(部分)对话框定义,在我的例子中映射到正确的 HTML 表单:
<field1
jcr:primaryType="cq:Widget"
allowBlank="false"
fieldLabel="Field 1"
name="./field1"
xtype="selection"
type="select"
options="/bin/myapp/fancyOptions.json" />
<field2
jcr:primaryType="cq:Widget"
xtype="hidden"
name="./field2@ValueFrom"
value="./field1"
defaultValue="./field1" />
<field3
jcr:primaryType="cq:Widget"
xtype="hidden"
name="./field3@ValueFrom"
value="./field1"
defaultValue="./field1" />
Run Code Online (Sandbox Code Playgroud)
由于某种原因,只有当 和value都defaultValue设置时,这才有效。仅设置defaultValue使得此功能适用于新创建的组件,但每次打开对话框时,它都会从存储库中读取数据并清除预期值。同时,仅设置value属性将阻止对话框在第一次打开对话框时初始化该元素。