如何在AEM 6.2中继承页面属性?

时间:2018-03-27 05:58:50

标签: aem

在我们的AEM 6.2项目中,我遇到了需要在一个页面中配置导航的场景(让我们调用此主页),所有其他页面都可以使用家庭导航配置或使用他们自己的导航配置值。 / p>

我决定使用实时副本,因为克隆页面可以随时取消链接的属性并使用自己的值。但这种方法存在两个问题:

  1. 用户必须通过编辑jcr:content / sling:resourceType和jcr:content / cq:template来设置克隆页面的模板,因为导航用于所有页面,而我们的网站使用大约5个以上的模板。
  2. 实时复制不允许克隆页面是源页面的子项。但我被要求制作这样的网络结构:

    Home
       |_ Page 1
                |_ Page 1.1
       |_ Page 2
       |_ Page 3
    
  3. 实时拷贝可能不适合这种情况,我们改为使用HTL ${inheritedPageProperties},这解决了模板和结构问题,但它产生了两个新问题:

    1. 子页面的属性配置对话框中的继承属性将为空(因为它们未设置并通过${inheritedPageProperties}调用)

    2. 如果用户更改" Page 1"页面,"页面1.1" (以及第1.1.1页等)将使用这些值(因为${inheritedPageProperties}搜索上层节点以获取值)。

    3. 我们的客户想要的是:

      • 所有页面只能使用主页或自己的页面导航设置(默认情况下使用主页)。
      • 如果使用主页属性,则必须在其配置对话框中显示这些值。
      • 尽量避免使用CRXDE Lite中的配置模板
      • 网站必须具有父子结构

      我如何达到这些要求?

1 个答案:

答案 0 :(得分:2)

您可以使用简单的Sling Model和Sling CompositeValueMap

来实现此目的

CompositeValueMap docs状态:

  

基于两个ValueMaps的ValueMap实现: - 一个包含属性 - 另一个包含在属性映射不包含值时使用的默认值。如果您想避免在多个资源上复制属性,可以使用CompositeValueMap获取属性的连接映射。

我们可以通过提供后代的值映射(当前页面)然后找到正确的祖先并将其属性valuemap作为默认值来使用它。

  

出于这个问题的目的,我总是假设来自root的第2个后代始终是祖先(你可以根据你的要求找到你的祖先)

package com.sample.helpers;
import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageManager;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.wrappers.CompositeValueMap;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.injectorspecific.OSGiService;
import org.apache.sling.models.annotations.injectorspecific.Self;

import javax.annotation.PostConstruct;

@Model(adaptables = Resource.class)
public class CustomInheritedPageProperties
{

    ValueMap inheritedProperties;

    @Self
    Resource currentResource;

    @OSGiService
    PageManager pageManager;

    @PostConstruct
    protected void init() {
        // get the current page, or the "descendant"
        Page descendant = pageManager.getContainingPage(currentResource);

        /* You have to add your custom logic to get the ancestor page.
         * for this question's purposes, I'm always assuming it's the 3rd decendant of root
         * more here: https://helpx.adobe.com/experience-manager/6-2/sites/developing/using/reference-materials/javadoc/com/day/cq/wcm/api/Page.html#getParent(int)
         */
        Page ancestor = descendant.getParent(2);

        // create a CompositeValueMap where the properties are descendant's and the defaults are ancestor's
        inheritedProperties = new CompositeValueMap(descendant.getProperties(), ancestor.getProperties());
    }

    public ValueMap getInheritedProperties()
    {
        return inheritedProperties;
    }
}

现在您可以按如下方式使用

<sly data-sly-use.propHelper="com.sample.helpers.CustomInheritedPageProperties">>/sly>
<!--/* someProp here refers to the property you wish to get (inherited, of course)*/-->
<h1>propHelper.inheritedProperties.someProp</h1>