在CQ5中,可以设置组件是否由属性呈现

时间:2014-06-13 20:05:45

标签: cq5 aem

我有一个我们正在处理的组件,它是可以通过对话框配置的特定业务组的一系列预设表单字段组件,以便他们可以设置特定表单中所需的字段。

我可以通过多种方式实现这一点,最粗糙的是包含cq:include的一系列if语句。我试图确定的是,如果不进行此条件检查,我可以直接更新字段组件的属性,以便在不从节点结构中删除对象的情况下进行渲染。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可以创建一个范围为INCLUDE的servlet过滤器,该过滤器会跳过处理hiddenProperty设置为true的所有组件:

@SlingFilter(scope = SlingFilterScope.INCLUDE, order = Integer.MIN_VALUE)
public class HiddenResourceFilter implements Filter {

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    if (request instanceof SlingHttpServletRequest) {
      SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
      ValueMap map = slingRequest.getResource().adaptTo(ValueMap.class);
      if (Boolean.parseBoolean(map.get("hiddenComponent", "false"))) {
        // we want to hide this component
        // so we don't call the doChain() method here
        return;
      }
    }
    chain.doFilter(request, response);
}

答案 1 :(得分:1)

组件的渲染是表示层的一部分,因此您可以使用CSS!

您可以在名为" shouldRender"的字段组件上使用任意属性,该属性可通过组件对话框进行编辑。在组件的JSP中,您可以执行以下操作:

<div id="field" <c:if test="${not shouldRender}">style="display: none;"</c:if>>
...
</div>

CSS属性&#34; display:none;&#34;隐藏一个元素,它不会占用任何空间。元素将被隐藏,页面将显示为元素不在那里。但是,该组件仍将出现在您的节点结构中,这正是您想要的!