在 AEM 6.5 中从 HTL 的多字段组件中检索值

Retrieving values from multifield component in HTL in AEM 6.5

我有一个遵循这种格式的多字段组件

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" 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="nt:unstructured"
    jcr:title="Awards List"
    sling:resourceType="cq/gui/components/authoring/dialog">
    <content
        jcr:primaryType="nt:unstructured"
        sling:resourceType="granite/ui/components/coral/foundation/container">
        <layout
            jcr:primaryType="nt:unstructured"
            sling:resourceType="granite/ui/components/coral/foundation/tabs"
            type="-nav"/>
        <items jcr:primaryType="nt:unstructured">
            <awards
                jcr:primaryType="nt:unstructured"
                jcr:title="Awards Properties"
                sling:resourceType="granite/ui/components/foundation/section">
                <layout
                    jcr:primaryType="nt:unstructured"
                    sling:resourceType="granite/ui/components/coral/foundation/fixedcolumns"/>
                <items jcr:primaryType="nt:unstructured">
                    <column
                        jcr:primaryType="nt:unstructured"
                        sling:resourceType="granite/ui/components/coral/foundation/container">
                        <items jcr:primaryType="nt:unstructured">
                            <description
                                jcr:primaryType="nt:unstructured"
                                sling:resourceType="granite/ui/components/coral/foundation/form/textarea"
                                fieldLabel="Description"
                                name="./description"/>
                            <awards
                                jcr:primaryType="nt:unstructured"
                                sling:resourceType="granite/ui/components/coral/foundation/form/multifield"
                                composite="{Boolean}true"
                                fieldLabel="Awards">
                                <field
                                    jcr:primaryType="nt:unstructured"
                                    sling:resourceType="granite/ui/components/coral/foundation/container"
                                    name="./awards">
                                    <items jcr:primaryType="nt:unstructured">
                                        <column
                                            jcr:primaryType="nt:unstructured"
                                            sling:resourceType="granite/ui/components/coral/foundation/container">
                                            <items jcr:primaryType="nt:unstructured">
                                                <awardtype
                                                    jcr:primaryType="nt:unstructured"
                                                    sling:resourceType="granite/ui/components/coral/foundation/form/select"
                                                    fieldDescription="Select Award Type"
                                                    fieldLabel="Award Type"
                                                    name="./type">
                                                    <items jcr:primaryType="nt:unstructured">
                                                        <gold
                                                            jcr:primaryType="nt:unstructured"
                                                            text="gold"
                                                            value="gold"/>
                                                        <silver
                                                            jcr:primaryType="nt:unstructured"
                                                            text="silver"
                                                            value="silver"/>
                                                        <bronze
                                                            jcr:primaryType="nt:unstructured"
                                                            text="bronze"
                                                            value="bronze"/>
                                                        <other
                                                            jcr:primaryType="nt:unstructured"
                                                            text="other"
                                                            value="other"/>
                                                    </items>
                                                </awardtype>
                                                <award
                                                    jcr:primaryType="nt:unstructured"
                                                    sling:resourceType="granite/ui/components/coral/foundation/form/textfield"
                                                    fieldDescription="Name of Award"
                                                    fieldLabel="Award Name"
                                                    name="./award"/>
                                            </items>
                                        </column>
                                    </items>
                                </field>
                            </awards>
                        </items>
                    </column>
                </items>
            </awards>
        </items>
    </content>
</jcr:root>

我正在尝试将多字段的内容输出到列表中。 我正在尝试使用

<ul data-sly-list="${properties.awards}">
    <li>${item.type}</li>
</ul>

但它不渲染任何东西。作为测试我做了

<ul data-sly-list="${[1,2,3,4]}">
    <li>${item}</li>
</ul>

哪个有效。在网上查找,我发现了 https://helpx.adobe.com/experience-manager/using/aem65_coral_resourcetypes.html#UseaDataSourceObjecttopopulateaSelectfield

之类的资源

但他们似乎正在使用 Java classes 来生成多字段,我希望这不是必需的。我不需要任何额外的逻辑,我要做的就是显示字段的值。

我做错了什么吗?使用多字段是否需要制作 Java class 来处理它?

编辑:我尝试使用 javascript 对象通过包含内容

的 js 文件来获取内容
"use strict";

use(function () {
    var description = granite.resource.properties["description"];
    var awards = granite.resource.properties["awards"];

    return {
        description: description,
    };
});

并使用

<div data-sly-use.awardsObject="awardslist.js">
    <p>
        ${awardsObject.description}
        ${awardsObject.awards}
    </p>
</div>

但是我什么都得不到 return 的奖励。我已经尝试将 awards 对象字符串化以查看是否获得任何数据,但我得到 none.

这可能是因为您使用的是复合多字段(查看属性 composite="{Boolean}true"对多字段),它通常将表单内容处理为复合,并在当前组件下创建子节点以保持 属性 值。

Quoting from the docs

true to handle the form content value as composite.

Composite multifield supports nesting another multifield (composite or not). However, non-composite one doesn’t support nesting.

For example, given the name property of field is addresses, and the descendant fields have following name property values:

street1
street2  
postcode 
city/name 
city/state  
city/country/name
gps/lat 
gps/long

it would save the following structure in the repository:

 + addresses   + item0
     - street1
     - street2
     - postcode
     + city
       - name
       - state
       + country
         - name
     + gps
       - lat
       - long   + item1
     - street1
     - street2
     - postcode
     + city
       - name
       - state
       + country
         - name
     + gps
       - lat
       - long

由于 properties 对象仅包含当前资源的属性,因此 ${properties.awards} 将为空,因此不会显示任何内容。

创建 Sling 模型或 Java / Java 脚本会更容易使用 API class 获取列表,然后在 HTL 中使用它文件。

示例 JS 使用 API

"use strict";

use(function () {
    var awards = resource.getChild("awards").listChildren();

    return {
        awards: awards,
    };
});

示例 HTL 代码

<sly data-sly-use.children="children.js">
    <ul data-sly-list.award="${children.awards}">
        <li>${award.type}</li>
    </ul>
<sly>

请注意,properties 对象是 ValueMap 的实例,仅 returns 当前资源的属性。由于多字段值存储为子资源,因此您需要先访问子资源,然后再访问其属性。