rich:dropDownMenuで動的メニューの生成

Seam RichFacesのDropDownMenuは、RichFacesのコンポーネントの中でもどうしても使いたい機能のひとつだけど、なかなかどうして一筋縄ではいかなかった。

公式サイトのサンプルにあるように、普通に静的メニューを作るならば問題無い。

しかし業務システムなので当然データベースから動的に生成したいのだけど、サンプルのようには動かなかった。

まず常套手段のコード

<rich:toolBar>

<rich:dropDownMenu event=”onclick”>

<f:facet name=”label”>

<h:outputText value=”File” />

</f:facet>

<a4j:repeat value=”#{dropDownMenuBean.items}” var=”item”>

<rich:menuItem submitMode=”ajax” value=”#{item}” />

</a4j:repeat>

</rich:dropDownMenu>

<rich:dropDownMenu>

<f:facet name=”label”>

<h:outputText value=”Edit”/>

</f:facet>

</rich:dropDownMenu>

</rich:toolBar>

a4j:repeatがui:repeatでもdataTableでも動かない。

で、以下が正解のコード

<rich:toolBarGroup>

<c:forEach var=”cates” items=”#{dropCategorys}” varStatus=”pri”>

<rich:dropDownMenu>

<f:facet name=”label”>

<h:panelGroup>

<h:outputText value=”#{cates}” />

</h:panelGroup>

</f:facet>

<c:forEach var=”menus” items=”#{dropItems[pri.index]}” varStatus=”sec”>

<rich:menuItem submitMode=”none” styleClass=”menuLink” value=”#{menus}”>

<s:link view=”#{dropUrls[pri.index][sec.index]}” />

</rich:menuItem>

</c:forEach>

</rich:dropDownMenu>

</c:forEach>

<rich:jQuery selector=”.menuLink” query=”click(function() {location.href = jQuery(this).find(‘a’).attr(‘href’) })”/>

</rich:toolBarGroup>

sessionBean部分 List<MenuCategory> tmpCategorys = entityManager.createQuery(“SELECT m FROM MenuCategory AS m WHERE m.active =¥

:active ORDER BY m.indication”)

.setParameter(“active”,true)

.getResultList();

int cateSize = tmpCategorys.size();

int menuSize = 0;

dropCategorys = new String[cateSize];

dropItems = new String[cateSize][];

dropUrls = new String[cateSize][];

for(int s = 0;s<cateSize;s++) {

dropCategorys[s] = tmpCategorys.get(s).getNameja();

List<Menu> menus = tmpCategorys.get(s).getMenu();

menuSize = menus.size();

dropItems[s] = new String[menuSize];

dropUrls[s] = new String[menuSize];

for(int q = 0;q<menuSize;q++) {

dropItems[s][q] = menus.get(q).getNameja();

dropUrls[s][q] = menus.get(q).getUrl();

}

}

RichFacesのバグ?とにかくui:repeatは捨てて、c:forEachでやる。

さらにList<>やArrayList<>ではなく、配列をわたさなきゃならないらしい。

分かればどうってことないけど、リソースも無いし結構はまりました。

コメントは受け付けていません。