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

如何在AEM 6.2中继承页面属性?,aem,Aem,在我们的AEM 6.2项目中,我运行了一个场景,在这个场景中,我需要在一个页面中配置导航(让我们调用这个主页),所有其他页面都可以使用home navigation config或使用它们自己的导航配置值 我决定使用live copy,因为克隆页面可以随时取消链接属性并使用它们自己的值。但这种方法有两个问题: 用户必须通过编辑其jcr:content/sling:resourceType和jcr:content/cq:template来设置克隆页面的模板,因为导航用于所有页面,我们的网站使用大约

在我们的AEM 6.2项目中,我运行了一个场景,在这个场景中,我需要在一个页面中配置导航(让我们调用这个主页),所有其他页面都可以使用home navigation config或使用它们自己的导航配置值

我决定使用live copy,因为克隆页面可以随时取消链接属性并使用它们自己的值。但这种方法有两个问题:

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

    Home
       |_ Page 1
                |_ Page 1.1
       |_ Page 2
       |_ Page 3
    
  • Live copy可能不适合这种情况,我们改为使用HTL
    ${inheritedPageProperties}
    ,这解决了模板和结构问题,但带来了两个新问题:

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

  • 如果用户在“第1页”页面中更改属性,“第1.1页”(以及第1.1.1页等…)将使用这些值(因为
    ${inheritedPageProperties}
    搜索上层节点以获取值)

  • 我们的客户需要的是:

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

    我怎样才能达到这些要求?

    您可以通过一个简单的吊索来实现这一点

    CompositeValueMap文档状态:

    基于两个ValueMap的ValueMap实现:-一个包含属性-另一个包含属性映射不包含值时使用的默认值。如果希望避免在多个资源上重复属性,可以使用CompositeValueMap来获取属性的串联映射

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

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

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

    <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>
    
    >/sly>
    propHelper.inheritedProperties.someProp
    
    那么您要查找的继承只在子体和根(第1页)之间,而不是整个树之间?例如,如果您有
    P1->P1.1->P1.1.1
    ,您希望P1.1.1仅从P1继承,并在P1.1.1设置了它的on值时覆盖它?是的,这就是我要查找的。
    <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>