2015-02-06 4 views
1

Использование JavaScript Use-Api Я могу создать пользовательский объект и вернуть его в html-файл. Эта функция позволяет мне создать список пользовательских объектов, которые могут быть использованы для создания меню или другого сложного компонента списка.CQ5/AEM6/Sightly - Возвращает пользовательский тип из Java Use-Api

Давайте предположим, что я следующая структуру содержания:

/content 
    /project 
     /homepage 
      /contentpage1 
       /contentpage1.1 
       /contentpage1.2 
       /contentpage1.3 (hidden) 
      /contentpage2 
       /contentpage1.1 (hidden) 
       /contentpage1.2 (hidden) 
       /contentpage1.3 (hidden) 
      /contentpage3 
      /contentpage4 

меню должно содержать только первый уровень contentpages. Каждый элемент меню должен иметь раскрывающийся список со страницами контента второго уровня, если они существуют и не скрыты. Я могу сделать это в JavaScript с помощью следующего кода:

"use strict"; 

use(function() { 

    function getMenuItems() { 
     var currentPageDepth = currentPage.getDepth(); 
     var menuObjects = []; 
     if(currentPageDepth >= 3) { 
      var homePage = currentPage.getAbsoluteParent(2); 
      var list = homePage.listChildren(); 
      while(list.hasNext()) { 
       var tempPage = list.next() 
       var customPageObject = createMenuItemObject(tempPage); 
       menuObjects.push(customPageObject); 
      }    
     } 
     return menuObjects; 
    } 

    function createMenuItemObject(page) { 
     // ... 
     // looking for any other properties of page or its children 
     // ... 
     return {page: page, 
       visibleChildrenExists: visibleChildrenExists(page)}; 
    } 

    function visibleChildrenExists(page) { 
     var list = page.listChildren(); 
     var visibleChildrenExists = false; 
     while(list.hasNext()) { 
      var subPage = list.next(); 
      if(!subPage.isHideInNav()) { 
       visibleChildrenExists = true; 
       break; 
      } 
     } 
     return visibleChildrenExists; 
    } 

    return { 
     menuObjectsList: getMenuItems(), 
    }; 
} 

HTML:

<headerComponent data-sly-use.headerComponentJS="headerComponent.js" data-sly-unwrap /> 
<menuItems data-sly-list.menuItem="${headerComponentJS.menuObjectsList}" data-sly-unwrap > 
    <li class='${menuItem.visibleChildrenExists ? "" : "direct"}' data-sly-test="${!menuItem.page.hideInNav}"> 
     <a href="${menuItem.page.path}.html">${menuItem.page.title}</a> 
     <ul data-sly-test="${menuItem.visibleChildrenExists}" data-sly-list.submenuItem="${menuItem.page.listChildren}"> 
      <li data-sly-test="${!submenuItem.hideInNav}"> 
       <a href="${submenuItem.path}.html">${submenuItem.title}</a> 
      </li> 
     </ul> 
    </li>  
</menuItems> 

Почему я хочу использовать Java Use-Апи? Легче работать с такими интерфейсами, как Resource или Node. Похоже, что это не очень хорошо работает в JavaScript, но мне нужно иметь возможность возвращать пользовательские объекты с несколькими свойствами.

Вопрос: возможно ли что-то подобное с помощью Java-использования-Api? Что мне нужно вернуть? Я не могу вернуть карту, потому что невозможно будет получить доступ к ее элементам, так как невозможно передать параметр в метод Java Use-Api ... Любое предложение?

ответ

1

можно вернуть карты с помощью Java-использование апи см пример ниже:

метод в классе Java

//Return a map 
public Map<String, String> getTestMap() { 
    //TODO some coding 
    Map<String,String> testMap = new HasMap<String,String>(); 
    testMap.put("IDA", "test value"); 
    testMap.put("IDB", "test value 2"); 

    return testMap;  
} 

HTML код для доступа к каждому элементу карты:

<div data-sly-use.param="JavaClass">  
    <div data-sly-test.map="${param.testMap}"> 
     <div class="pos"> 
      <span class="classA">${map['IDA']}</span><br> 
      <span class="classB">${map['IDB']}</span> 
     </div> 
    </div> 
</div>