CQ5/AEM:使用1个cq:component+创建sidekick组件;多数据节点

CQ5/AEM:使用1个cq:component+创建sidekick组件;多数据节点,aem,Aem,我正在开发一个基本上是建筑工具的组件。我不能详细说明它是什么,但是我能得出的最大的相似之处是产品列表生成器。其概念是作者想要创建定制的产品列表。这些列表将位于一个单独的位置,并从我们内容中的许多不同页面引用 工作流程: 创建并生成/content/myproductList content/mySite/myPage/jcr:content/specialListView#属性列表指向/content/myproductList 目前一切都很好,运行良好。作者希望列表的构建是拖放式的,就像站点的

我正在开发一个基本上是建筑工具的组件。我不能详细说明它是什么,但是我能得出的最大的相似之处是产品列表生成器。其概念是作者想要创建定制的产品列表。这些列表将位于一个单独的位置,并从我们内容中的许多不同页面引用

工作流程:

  • 创建并生成/content/myproductList
  • content/mySite/myPage/jcr:content/specialListView#属性列表指向/content/myproductList
  • 目前一切都很好,运行良好。作者希望列表的构建是拖放式的,就像站点的其他部分一样。因此,我创建了表示列表项的组件,它们可以打开一个新的构建器,并根据需要对列表进行拖放/重新排序,然后在“specialListView”中刷新列表

    我的设计有一个巨大的缺陷,我想看看我是否能克服它。该缺陷是在我创建列表项组件的方式中蚀刻的。本质上,所有项目在结构上都是相同的(在标记方面),只是内容不同而已。因此,我创建了一个基本组件来控制标记和基本工作流(对话框等)。然后,我为每个列表项创建了一个新组件,这些组件只有保存其信息的cq:template节点

    前结构:

    components/lists
       | defaultItem
           | defaultItem.jsp
           | dialog.xml
       | customeItem1
           | .content.xml (resourceSuperType = components/lists/defaultItem)
           | _cq_template.xml (has custom information)
       | customeItem2
           | .content.xml (resourceSuperType = components/lists/defaultItem)
           | _cq_template.xml (has custom information)
       ...etc for 25+ items
    
    通过这样设置,我们现在有了一个工作流,作者可以将组件直接拖放到页面上,而不需要配置它们或打开对话框并选择正确的数据集/等等。然而,这似乎非常冗长和庞大。可伸缩性也是一个问题(如果他们明天想创建100个新项目怎么办——遗憾的是,这是我的现实)

    我的建议是找到一种方法来规范化它,这样我就有一组数据(列表项)和一个组件作为我的结构

    比如:

    /etc/data/lists/items
                item 1
                   - nt:unstructured
                   - label=foo
                   - type=defaultItem
                   ...etc
                ... etc, etc for all 25+ items
    
    /apps/myapp/components/lists
                defaultItem
                 | defaultItem.jsp
                 | dialog.xml
    
    这就是我被卡住的地方。如果我有一个这样的结构,那就很难让item1、item2、item3……等作为拖放元素出现在sidekick中。我猜我需要进入JS中生成sidekick项的部分,但我不确定如何从那里开始(还没有搞乱sidekick的定制)。如果有人曾经处理过类似的事情,我只是想寻求指导

    [旁注]
    如果你想知道为什么我想把它移到第二个设计中,那是因为最终作者想要一个控制面板,允许他们自己创建项目。如果有一个系统可以改变单个节点及其属性,而不是一个必须管理创建/更改完整组件结构的系统,那么会更容易、更轻量级。它还将作者制作的“项目组件”与开发人员创建的实际组件分离。这一点很重要,因为我们创建的组件代码是版本控制的/etc,而这些人造组件将被取消检查,我们需要另一种方法来管理它们。

    正如您已经描述的,为每个产品创建一个新组件将导致巨大的开销。除此之外,您将创建组件,这些组件仅链接到一个资源,因此不再可重用

    首先,您需要看到内容和组件之间的差异。在这种情况下,defaultItem是组件,产品是内容。在AEM中,contentfinder用于显示、搜索、将内容拖放到页面中。组件的伙伴

    解决方案如下:

  • 创建一个自定义contentfinder选项卡,用于加载所有产品; 加载产品可以通过创建一个servlet来完成,该servlet返回 json格式的所有相关产品
  • 创建一个通用组件(例如defaultItem),它可以显示您的 通过设置产品的参考链接,将产品导入页面
  • 配置contentfindertab以创建defaultitem组件 将产品拖动到页面中时 注意CQ.wcm.ContentfinderTab.getResultsBoxConfig。At项SDDNewParagraph 您可以配置新组件类型(defaultItem)和 属性将组件链接到产品
  • 如何创建contentfinder选项卡:


    注意:将产品从ContentFinder选项卡放入页面时,请使用ALT按钮

    我从未想过使用ContentFinder选项卡。作为开发人员,我们不断地隐藏这个东西,因为它目前被不正确地使用,所以看起来就像是一堆随机的图像扔在页面上。但有一个问题:如果我说“defaultitem”是一个表单输入,而自定义项只是每个字段输入(即国家、名字等)的配置,您还会建议这样做吗?我在考虑创建一个自定义的侧踢,所以我很好奇,从CF的角度来看,这是否是一个类似的方法。如果我很了解你,国家、名字等都是内容类型。您可以肯定地将这些添加到列表中,因为您自己处理servlet。在contentfinder上,甚至可以配置一些过滤器。执行过滤器时,将再次调用servlet以返回过滤后的请求。