这似乎是一个非常基本的问题,但我仍然找不到一个好的解决方案。 我创建了一个使用对话框属性的组件。
如果在模板中也使用此组件,我怎么能避免为每个页面设置此属性?
我已经尝试过:
name
属性设置为绝对路径 - 组件停止独立工作(放入parsys
)。design_dialog.xml
- 首先,它在概念上是内容,所以我不喜欢这样的举动,而且它对于独立版本也没有多大意义。将资源路径更改为绝对,同时包含在模板中:
<cq:include path="/content/site/somepage" resourceType="/apps/portal/components/myComponent" />
初看起来几乎就是这样。通过parsys
包含的实例有自己的路径,而模板的内容是从单一资源获取的...... 但在哪里存储它,使模板代码独立于页面树结构?
还有其他好办法吗?或至少改善3的方式。?
答案 0 :(得分:3)
对于原始海报,ACS AEM Commons(http://adobe-consulting-services.github.io/acs-aem-commons/features/shared-component-properties.html)中的共享组件属性现在支持您正在寻找的功能
与您建议的解决方案相比:
答案 1 :(得分:2)
如果我理解正确,你有一个可以在两种模式下工作的组件:
<cq:include>
在第一个模式中,组件应该具有所有页面的一些通用配置,而在第二个模式中,它应该按实例单独配置。问题是如何创建这样的通用配置。
我认为您的第三个解决方案非常好,假设您的CQ实例中的所有站点共享组件配置。在某些时候,它可能是太强大的假设,例如。您可能在/content/site-en
,/content/site-fr
和/content/site-de
下有3个语言分支,并且您希望为每个分支进行单独配置。
我建议对第3个解决方案进行改进:您可以在某个相对路径下创建共享组件,这对于所有页面都是相同的,例如/content/.../configuration/shared-component
(其中...
可能是{{ 1}},site1
或site2
)。然后获取当前页面路径的前两部分,添加site3
后缀并使用/configuration/shared-component
来包含以这种方式创建的路径。
您也可以采用不同的方法,并创建由所有静态包含的组件引用的公共配置页面。这些组件可能会尝试自动查找其配置(通过上面的相对路径),或者它们可能有一个引用配置页的路径域。
如果您不喜欢这些选项(因为它们假设某些网站结构或者每个组件需要一些最小配置),请考虑使用HierarchyNodeInheritanceValueMap
。它允许您从当前资源获取属性,如果没有这样的属性,它将查看祖先页面上的相同资源。使用此功能,您只需在站点根页面中配置一次组件,并在整个站点上继承配置。