0

我正在使用Jahia Digital Experience Manager 7.1.2

如何在编辑模式下live显示工作区中的数据(在来自JSP的JSTL中)?


细节 :

我需要在编辑模式下在页面中显示一些数据。问题是数据是用户提交的内容,仅存储在 JCRlive工作空间中(不存储在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工作区中,因此在编辑模式下不会显示任何内容。

使用 scriptlet 我可以获得实时内容:

<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 中做到这一点?

4

1 回答 1

1

没错,在 Jahia 中,您在 jsp 组件视图之前没有对呈现 servlet 的控制。

此外,在默认 JSP 标记中切换模式并不容易(因为在正常使用时,您只能从当前工作空间呈现内容)。

但是在这种情况下使用过滤器也不是一个好主意,因为过滤器可能会导致性能或刷新问题(破坏 JSP Jahia 视图组件中的默认缓存机制),并且很难在代码的不同上下文中重用。

但是,有一个可能的解决方案可以让您的 JSP 代码保持干净:

  • 创建您自己的 JSP 标记,其中包含您的 scriptlet 代码,然后在其中调用方法JCRContentUtils.getChildrenOfType(responsesNode, type);(在您的示例中使用 type = 'unt:formResponse' 参数)
  • getChildrenOfTypeInLive(...)例如,您可以使用标签库前缀 = 来命名此标签myjcr

文档:

我希望这能帮到您,

问候,

塞德里克

于 2020-01-26T12:13:48.933 回答