我正在使用Jahia数字体验管理器7.1.2。
如何在编辑模式中显示live
工作区中的数据(在JSP中以JSTL显示)?
详细信息:
我需要以编辑模式在页面中显示一些数据。问题在于数据是用户提交的内容,仅存储在JCR live
工作空间中(而不存储在编辑模式使用的default
工作空间中)。
通常,我显示这样的数据(非常适合在编辑模式下显示default
工作区数据,而在在线模式下显示live
数据:
<%@ taglib prefix="jcr" uri="http://www.jahia.org/tags/jcr" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--@elvariable id="currentNode" type="org.jahia.services.content.JCRNodeWrapper"--%>
<c:forEach items="${jcr:getChildrenOfType(currentNode,'unt:formResponse')}" var="resp">
${resp.name}
</c:forEach>
当然,因为我的数据仅存在于live
工作区中,所以在编辑模式下什么也不显示。
使用脚本,我可以获取实时内容:
<c:set var="currentNodeId" value="${currentNode.identifier}"/>
<c:set var="locale" value="${renderContext.mainResourceLocale}"/>
<%
JCRNodeWrapper responsesNode = JCRSessionFactory.getInstance().getCurrentUserSession("live", locale).getNodeByIdentifier(currentNodeId);
for (JCRNodeWrapper resp : responsesNode.getNodes()) {
log.info(resp.getName());
}
pageContext.setAttribute("responsesNode", responsesNode);
%>
<c:forEach items="${jcr:getChildrenOfType(responsesNode,'unt:formResponse')}" var="resp">
${resp.name}
</c:forEach>
我也可以在完整的Java scriptlet中(或者使用taglib更好)或在groovy中做到这一点,但是有没有办法在纯JSTL中做到这一点?
[是的,在Jahia中,在jsp组件视图之前没有对呈现servlet的控制。
此外,在默认的JSP标记中切换模式并不容易(因为在正常使用时,您只能从当前工作空间中呈现内容。
但是在这种情况下使用过滤器也不是一个好主意,因为过滤器可能会导致性能或刷新问题(破坏JSP Jahia视图组件中的默认缓存机制),并且将很难在您的其他上下文中重用代码。
但是,有一种可能的解决方案可以保持您的JSP代码干净:
JCRContentUtils.getChildrenOfType(responsesNode, type);
(对于您的示例,类型为'unt:formResponse'的参数)] >>getChildrenOfTypeInLive(...)
将此标签命名为myjcr
。文档:
我希望这对您有帮助,
问候,
Cédric