Jahia从编辑模式获取实时工作区JCR数据

时间:2018-11-08 15:58:44

标签: jsp jstl jcr jackrabbit jahia

我正在使用 Jahia 数字体验管理器 7.1.2

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


详细信息:

我需要在编辑模式下的页面中显示一些数据。问题在于数据是用户提交的内容,仅存储在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中做到这一点?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

文档:

希望这对您有帮助,

关于

塞德里克