是否可以在不使用自定义小部件的情况下将单个对话框字段映射到多个JCR属性?

ton*_*edz 6 extjs sling aem

我在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 2Field 3的值应该从Field的值推断出来(在这种情况下,所有3个字段应该具有相同的值)

我不想引入单独的Sling Model或任何其他Adaptable,我希望保持内容结构的一致性,以便在后端更容易使用.

- myComponent
  - field1
  - field2
  - field3
Run Code Online (Sandbox Code Playgroud)

是否可以将Classic UI对话框中的一个字段映射到内容存储库中的多个属性,而无需创建自定义Ext JS小部件以单独发布它们?我可以写一个但我想尽可能避免它.

ton*_*edz 4

是的,这是可能的。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)

由于某种原因,只有当 和valuedefaultValue设置时,这才有效。仅设置defaultValue使得此功能适用于新创建的组件,但每次打开对话框时,它都会从存储库中读取数据并清除预期值。同时,仅设置value属性将阻止对话框在第一次打开对话框时初始化该元素。