Динамическая панель Menu в richfaces

Я пытаюсь создать panelMenu динамически используя список предметов, которые у меня уже есть. Но, похоже, это не работает, так как я ничего не получаю в результате. Итак, вот мой код:

<rich:panelMenu id="filterListFuncPost" style="width:180px"
    itemMode="ajax" groupMode="ajax"
    groupExpandedLeftIcon="triangleUp"
    groupCollapsedLeftIcon="triangleDown"
    topGroupExpandedRightIcon="chevronUp"
    topGroupCollapsedRightIcon="chevronDown" itemLeftIcon="disc">
        <rich:panelMenuGroup label="Functional Positions">
            <c:forEach xmlns:c="http://java.sun.com/jstl/core" var="item"
                items="#{reportsBacking.selectedFunctPosIndex}">
                    <rich:panelMenuItem label="#{item}" />
            </c:forEach>
        </rich:panelMenuGroup>

</rich:panelMenu>

2 ответа

ОБНОВЛЕНИЕ: работает для RichFaces panelMenu, но только если вы используете правильный итератор. Я вернулся к этой проблеме свежим взглядом и нашел довольно очевидное решение, но его пока нет в интернетах, так что вот оно:

xmlns:c="http://java.sun.com/jstl/core"
xmlns:rich="http://richfaces.org/rich"

<rich:panelMenu id="menuRoot">
    <rich:panelMenuGroup id="lev1menu">
        <c:forEach var="fancyGroup" items="#{myBean.myFancyGroupEntity}">
            <rich:panelMenuGroup label="#{fancyGroup.name}" id="lev2menu_#{fancyGroup.id}">
                <c:forEach var="fancyItem" items="#{fancyGroup.items}">
                    <rich:panelMenuItem label="#{fancyItem.name}" action="#{myBean.viewItem}">
                        <a4j:actionParam name="itemId" value="#{fancyItem.id}"/>
                    </rich:panelMenuItem>
                </c:forEach>
            </rich:panelMenuGroup>
        </c:forEach>
    </rich:panelMenuGroup>
</rich:panelMenu>

Почему это работает? Поскольку основные компоненты JSTL анализируются и обрабатываются до компонентов JSF (или чего-то подобного), и поэтому c:forEach отрисовывает все дочерние компоненты RichFaces (или другие JSF) до того, как JSF будет проанализирован и обработан. Следовательно, у panelMenu есть дочерние элементы правильного типа к моменту его анализа.

СТАРЫЙ: не будет работать с RichFaces panelMenu (org.richfaces.component.UIPanelMenu) составная часть.

Я попробовал аналогичный подход, используя элементы базы данных для динамической генерации иерархии меню, но когда он пытается проанализировать его на стороне сервера, RichFaces пытается преобразовать любые дочерние элементы в PanelMenuGroup или panelMenuItem и падает с ClassCastException пытаясь изгнать из com.sun.facelets.component.UIRepeat, что было бы то же самое для вашего итерационного компонента JSTL forEach (который является экземпляром org.apache.taglibs.standard.tag.rt.core.ForEachTag на сервере, я думаю).

Для кого это может помочь, я нашел способ заставить его работать, который заключается в использовании rich:list вместо c:forEach и работает нормально.

Другие вопросы по тегам