【问题标题】:CQ access deep child node's property from current node (current component)CQ从当前节点(当前组件)访问深层子节点的属性
【发布时间】:2014-06-18 09:55:25
【问题描述】:

我正在开发一个名为“tabbedcarousel”的轮播组件,我需要遍历它的子节点以访问图像属性。见下图:

“tabbedimagecarouselunselectedimage”->“fileReference”是我需要得到的。

假设我目前正在处理“tabbedcarousel.jsp”,我可以访问我的 currentNode,所以我假设获取深层子 img 属性的方式是这样的:

<%


        NodeIterator tabbedCarouselChildNodes = currentNode.getNodes();
        while(tabbedCarouselChildNodes.hasNext()){
            Node parNode = tabbedCarouselChildNodes.nextNode();

            NodeIterator parChildNodes = parNode.getNodes();
            while(parChildNodes.hasNext()){
                Node tabbedCarouselItemNode = parChildNodes.nextNode();

                NodeIterator tabbedCarouselItemChildNodes = tabbedCarouselItemNode.getNodes();
                while(tabbedCarouselItemChildNodes.hasNext()){
                    Node tabImgNode = tabbedCarouselItemChildNodes.nextNode();
                    %>
                    test here s the img property : <%= tabImgNode.getProperties("fileReference").toString()%> !!!
                    <% 
            }
        }

%>

但它不起作用。希望有人能给我一些建议。谢谢

【问题讨论】:

    标签: jsp components aem jcr sling


    【解决方案1】:

    我在末尾添加了一个大括号并将tabImgNode.getProperties() 替换为hasProperty()/getProperty() 组合。在我的 CQ 上运行良好:

    <%
    NodeIterator tabbedCarouselChildNodes = currentNode.getNodes();
    while(tabbedCarouselChildNodes.hasNext()) {
        Node parNode = tabbedCarouselChildNodes.nextNode();
        NodeIterator parChildNodes = parNode.getNodes();
        while(parChildNodes.hasNext()){
            Node tabbedCarouselItemNode = parChildNodes.nextNode();
            NodeIterator tabbedCarouselItemChildNodes = tabbedCarouselItemNode.getNodes();
            while(tabbedCarouselItemChildNodes.hasNext()){
                Node tabImgNode = tabbedCarouselItemChildNodes.nextNode();
                if (!tabImgNode.hasProperty("fileReference")) {
                    continue;
                }
    %>
    test: <%= tabImgNode.getProperty("fileReference").getString()%>
    <% 
            }
        }
    }
    %>
    

    顺便说一句,它可以使用 Sling API 重构:

    <%
    Iterator<Resource> items = resource.getChild("par").listChildren();
    while (items.hasNext()) {
        Resource property = items.next().getChild("tabimageunselectedimage/fileReference");
        if (property == null) {
            continue;
        }
    %>
    fileReference: <%= property.adaptTo(String.class) %>
    <% } %>
    

    第三种选择是使用名为SlingQuery 的第三方库:

    <% for (Resource r : SlingQuery.$(resource).find("#tabimageunselectedimage")) { %>
      path: <%= r.adaptTo(ValueMap.class).get("fileReference") %>
    <% } %>
    

    【讨论】:

      【解决方案2】:

      遇到这个是因为我正在寻找一种必须有效的方法来检索 jcr 节点到给定起始节点的任何深度。在您的情况下,我将使用递归来获得期望的结果。

      在 OSGI 服务中

      public class WriteImageNode{
          private SlingHttpServletRequest slingRequest;
          private SlingScriptHelper sling;
          private ArrayList<String, String> tabImageList = new ArrayList<String, String>();
          public WriteImageNode( SlingHttpServletRequest slingRequest, SlingScriptHelper sling){
              this.slingRequest = slingRequest;
              this.sling = sling;
      
          }
          public ArrayList<String> getTabImageNode(String path){
              Session currentSession = null;
              SlingRepository repo ;
              if(!path.equals("")){
                        Node startNode = slingRequest.getResourceResolver().getResource(path).adaptTo(Node.class);
                     try {
                         repo = sling.getService(SlingRepository.class);
      
                         currentSession = repo.loginAdministrative(null);
      
                         NodeIterator iterator = startNode.getNodes();
                         while(iterator.hasNext()){
                              Node childNode = iterator.nextNode();
                              if(childNode.hasProperty("fileReference")){
                                  tabImageList.add(childNode.getProperty("fileReference").getString());
                                }
                                else{
                                       getTabImageNode(childNode.getPath());
                                    }
                         }
      
                  } catch (RepositoryException e) {
                         //do something clever with the exception
      
                     } finally {
                         if (currentSession != null) {
                             currentSession.logout();
                         }
                  } 
             }
          }
          return tabImageList;
      }
      

      在你的jsp中做这样的事情:

          <%
             request.setAttribute("tabImageList",  new WriteImageNode(slingRequest, sling).getTabImageNode(path));
          %>
      <c:forEach var="imagelist" items="${tabImageList}">
         <c:out value="${imagelist}/>
      </c:forEach>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-17
        • 1970-01-01
        相关资源
        最近更新 更多