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

问题描述 投票:0回答:2
aem
2个回答
3
投票

这可能是因为您使用的是复合多字段(查看针对多字段的属性

composite="{Boolean}true"
),它通常将表单内容处理为复合内容,并在当前组件下创建子节点来保存属性值。

引用自文档

true 将表单内容值处理为复合值。

复合多字段支持嵌套另一个多字段(复合或 不是)。但非复合不支持嵌套。

例如,给定字段的名称属性是地址,并且 后代字段具有以下名称属性值:

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

它将在存储库中保存以下结构:

 + 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}
将为 null,因此它不会显示任何内容。

创建 Sling 模型或 Java / Javascript 使用 API 类获取列表然后在 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的实例,仅返回当前资源的属性。由于多字段值存储为子资源,因此您需要先访问子资源,然后再访问其属性。


0
投票

返回复合多字段项目列表的动态吊索模型是理想的选择,因为它接受节点名称参数。

package com.myproject.core.models;

import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.models.annotations.Model;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import java.util.Collections;
import java.util.Iterator;

@Model(adaptables = SlingHttpServletRequest.class, adapters = MultiField.class)
public class MultiField {

    private Iterator<Resource> nodesItemList;

    @Inject
    private String multifieldNodeName;

    @Inject
    private Resource resource;

    @PostConstruct
    public void activate() {
        nodesItemList = Collections.emptyIterator();

        Resource multiFieldNode = resource.getChild(multifieldNodeName);
        if (multiFieldNode != null) {
            nodesItemList = multiFieldNode.listChildren();
        }
    }

    public Iterator<Resource> getItemsList() {
        return nodesItemList;
    }

}

有关更多信息和示例,请参阅我的 Multifield Component 博客文章。

© www.soinside.com 2019 - 2024. All rights reserved.