我有一个我们正在处理的组件,它是可以通过对话框配置的特定业务组的一系列预设表单字段组件,以便他们可以设置特定表单中所需的字段。
我可以通过多种方式实现这一点,最粗糙的是包含cq:include的一系列if语句。我试图确定的是,如果不进行此条件检查,我可以直接更新字段组件的属性,以便在不从节点结构中删除对象的情况下进行渲染。
有什么想法吗?
答案 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;隐藏一个元素,它不会占用任何空间。元素将被隐藏,页面将显示为元素不在那里。但是,该组件仍将出现在您的节点结构中,这正是您想要的!