Adobe CQ Components限制子组件

时间:2013-05-21 17:28:01

标签: adobe cq5 day-cq aem

我正在尝试为一个简单的手风琴创建一个组件,其中内容块保存在标题下,并且一次只能看到一个标题。我首选的实现使用两个组件,一个用于表示整个手风琴,另一个用于单个条目。

这个想法是内容作者可以从伙伴手中拉出手风琴,然后将一个或多个手风琴项放入手风琴中,但不允许任何其他组件掉到这里。手风琴项目只能放入手风琴组件而不能放入任何其他分析中。

我的问题是,目前可以将其他内容添加到手风琴中,并在手风琴之外添加手风琴项目。

解决这个问题的第一个尝试是:

foobar/components/accordion
foobar/components/accordion/accordion.jsp
foobar/components/accordion/cq:editConfig
foobar/components/accordion/dialog
foobar/components/accordion/accordionitem
foobar/components/accordion/accordionitem/accordionitem.jsp
foobar/components/accordion/accordionitem/cq:editConfig
foobar/components/accordion/accordionitem/dialog

这些配置文件是:

手风琴/ .content.xml

<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"
    cq:isContainer="{Boolean}true"
    jcr:primaryType="cq:Component"
    jcr:title="Accordion"
    sling:resourceSuperType="foundation/components/parbase"
    allowedChildren="[*/accordion/accordionitem]"
    allowedParents="[*/parsys]"
    componentGroup="General"/>

手风琴/ _cq_editConfig.xml

<jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0"
    xmlns:jcr="http://www.jcp.org/jcr/1.0"
    cq:actions="[-,edit,-,delete]"
    cq:layout="editbar"
    jcr:primaryType="cq:EditConfig">
    <cq:listeners
        jcr:primaryType="cq:EditListenersConfig"
        aftercopy="REFRESH_PAGE"
        afterdelete="REFRESH_PAGE"
        afterinsert="REFRESH_PAGE"/>
</jcr:root>

该对话框为空白且仅存在,以便该组件将出现在搭档中。

accordion.jsp只包含基础分析。

手风琴/ accordionitem / .content.xml

<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"
    jcr:primaryType="cq:Component"
    jcr:title="Accordion Item"
    sling:resourceSuperType="foundation/components/parbase"
    allowedParents="[*/accordion]"
    componentGroup="General"/>

手风琴项目对话框包含标题。 editConfig只是添加工具栏,但没有监听器。

accordionitem.jsp输出从对话框中获取的标题,并有一个解析。

我的问题似乎是,parsys没有使用手风琴和accordionitem组件的规则。相反,他们似乎继承了下一个解析,除非被覆盖。

我可以通过在页面上使用编辑模式并选择适当的组件来正确设置组件,但是这会根据模板设置信息,这意味着我需要为每个页面模板执行相同的配置。我想要的是在组件定义中定义它,以便它存在一次。

在第一次编写组件后,我发现了这个博客,它描述了完全相同的场景:http://jenikya.com/blog/2012/03/cq5-accordion-component.html

使用它作为我的参考,我尝试添加一个parsys的扩展,以便在accordion.jsp中使用。这对代码没有任何影响,因此即使我的自定义分析也允许添加除手风琴项目之外的其他组件。

任何有关错误或其他方法的指导都将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

这里的解决方案是使用一个解析器并构建一个复合组件,将accordion内容仅限制为一组组件(如博客条目中所述)。

查看http://localhost:4502/content/geometrixx/en/company/press/asseteditor.html,它也会将此技术用于dam/components/asseteditor/thumbnail组件。

答案 1 :(得分:0)

这是AEM中非常通用的问题陈述。有几种方法可以处理它,具体取决于您的业务需求以及您的设计将如何映射。我可以为此建议两个解决方案: 1.为您的手风琴组件应用模板级设计限制。这意味着,您放弃手风琴组件然后进入页面的设计模式并在手风琴中选择手风琴项目组件。这只是一次性活动。

虽然我会推荐选项#2: 2.在手风琴组件对话框中,要求作者使用多列表添加手风琴项目。 - 要添加新项目,只需打开手风琴对话框并在多列表中添加项目并在其中输入accordion id。 - 要删除项目,请打开对话框并从多列表中删除项目 - 要更改位置,请重新排列多列表中的项目。 基于“手风琴”对话框中作者输入的多列表项目,静态包含手风琴项目组件,并在多列表中提供作者输入的组件ID。

使用这种方法,你会的 - 轻松限制手风琴中的组件。 - 减少sidekick中的一个组件(手风琴项目) - 减少页面上的一个parsys(这么多的parsys会占用创作性能)