对一系列 parsys-CQ 施加组件限制

Impose component restriction to a series of parsys-CQ

我的页面页脚中有一系列 parsys。同时,我想通过etc/designs/projectname/content.xml对所有这些进行组件限制。事情是这样的:

JSP:

    <c:forEach var="i" begin="0" end="${properties.numberOfFooterLinks-1}">
      <div class="small-6 medium-4 large-2 columns">
          <cq:include path="./footerPar${i}"            
                   resourceType="foundation/components/parsys" />
      </div>
    </c:forEach>

XML:

<footer jcr:primaryType="nt:unstructured">
 <footerPar0 jcr:primaryType="nt:unstructured"
            sling:resourceType="foundation/components/parsys"
                 components="[group:footerComp]">
  <section jcr:primaryType="nt:unstructured"/>
  </footerPar0>
</footer>

这仅适用于 parsys footerPar0,但不适用于其余部分(footerPar1、footerPar2 等)。我坚持要实现这一目标。有没有一种方法可以在不重复 parsys 的名称直到循环计数结束的情况下实现它?谢谢

我也没有找到一种优雅的方法来做到这一点。一种解决方案是使用 JavaScript 侦听器动态删除允许的组件,然后添加回您想要允许的组件。

例如在 /apps/foundation/components/parsys 下覆盖 parsys 本身,添加一个 _cq_editConfig.xml,例如:

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" 
          xmlns:jcr="http://www.jcp.org/jcr/1.0"
          cq:actions="[_clear]"
          jcr:primaryType="cq:EditConfig">

    <cq:listeners
        jcr:primaryType="cq:EditListenersConfig"
        updatecomponentlist="function(cell, allowed, componentList){
            var firstSearchPath = cell.searchPaths[0];
            var isFooterParsys = firstSearchPath.indexOf('footer/footerPar') > -1;
            if (isFooterParsys && allowed instanceof Array) {
                while(allowed.length > 0) {
                    allowed.pop(); //Remove all currently allowed components from the parsys
                }
                allowed.push('project/components/content/your-component'); //add allowed components
            }
        };"/>
</jcr:root>

显然这是影响深远的,因为侦听器正在影响 parsys 的所有实例(尽管在函数中按名称定位您的 footerPar。)

如果您在这些字段中还没有实时内容,您可以创建自己的资源类型,使用 parsys 作为超类型,以获得更好的控制级别。