2014-06-18 91 views
3

我正在研究名爲「tabbedcarousel」的輪播組件,我需要遍歷它的子節點才能訪問圖像屬性。看到下面的圖片:CQ從當前節點(當前組件)訪問深層子節點的屬性

enter image description here

說, 「tabbedimagecarouselunselectedimage」 - > 「的FileReference」 是什麼,我需要得到。

說,目前正在對「tabbedcarousel.jsp」 IM,我有機會到我的currentNode,所以IM的方式承擔,以獲得深的孩子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()%> !!! 
        <% 
      } 
     } 

%> 

,但它不工作。希望有人能給我一些建議。謝謝

回答

8

我在最後加了一個括號,並用hasProperty()/getProperty()組合替換了tabImgNode.getProperties()。作品對我的CQ罰款:

<% 
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") %> 
<% } %> 
0

來到

<% 
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()%> 
<% 
     } 
    } 
} 
%> 

BTW,它可以使用吊帶API進行重構因爲我一直在尋找必要的有效方法來將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> 
相關問題