Jahia получает данные JCR рабочей области в режиме редактирования
Я использую Jahia Digital Experience Manager 7.1.2.
Как я могу отображать данные из live
рабочее пространство в режиме редактирования (в JSTL из JSP)?
Подробности:
Мне нужно отобразить некоторые данные на странице в режиме редактирования. Проблема в том, что данные представляют собой пользовательский контент, хранящийся только в 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 скриптлете (или лучше с taglib) или в groovy, но есть ли способ сделать это в чистом JSTL?
0 ответов
Вы правы, в Jahia у вас нет управления сервлетом рендеринга перед представлением компонента jsp.
Более того, нелегко переключить режим в тегах JSP по умолчанию (потому что при нормальном использовании вы визуализируете контент только из текущего рабочего пространства).
Но использование фильтра в этом случае также не является хорошей идеей, поскольку фильтр может вызвать проблемы с производительностью или обновлением (нарушить механизм кеширования по умолчанию в компоненте представления JSP Jahia), и его будет сложно повторно использовать в другом контексте в вашем коде.
Однако есть возможное решение сохранить ваш код JSP чистым:
- Создайте свой собственный тег JSP с кодом вашего скриптлета внутри, затем вызовите внутри него метод
JCRContentUtils.getChildrenOfType(responsesNode, type);
(с параметром type = 'unt:formResponse' в вашем примере) - Вы можете назвать этот тег
getChildrenOfTypeInLive(...)
например, с тегом lib prefix =myjcr
.
Документация:
- для создания общей библиотеки тегов JSP:https://www.javatpoint.com/example-of-jsp-custom-tag
- пример реализации библиотеки тегов Jahia JCR: https://github.com/Jahia/jahia/blob/master/taglib/src/main/java/org/jahia/taglibs/jcr/node/JCRTagUtils.java и https://github.com/Jahia/jahia/blob/master/taglib/src/main/resources/META-INF/jcr.tld
Я надеюсь, что это поможет вам,
С Уважением,
Седрик