メニューの内容を動的に変更する

最終更新日: 2021年6月8日
R8 | R9

カスタマイズ方法

外部リンクメニュー

ここでは「http://calendar.infocharge.net/」への外部リンクを用意するものとします。

図1 外部リンクを用意する

今回のサンプルでは、上記の URL に「翌月の年月情報(yyyy/MM/)」を追加します。例えばURL「http://calendar.infocharge.net/cal/2017/02/」となります。年月の部分は動的に決定されます。

MyMenuController

メニューを拡張するためのクラス MyMenuController を作成します。

パッケージ名が「jp.jasminesoft.wagby」の場合は、次のファイルを用意します。

customize/java/jp/jasminesoft/wagby/controller/MyMenuController.java

この MyMenuController の perform_db() メソッドをオーバーライドし、menubar/menu/item/@url に年月情報を埋め込みます。具体的なコードを示します。

package jp.jasminesoft.wagby.controller;
import static jp.jasminesoft.util.ExcelFunction.*;
import java.io.IOException;
import javax.servlet.ServletException;
import jp.jasminesoft.jfc.ActionParameter;
import jp.jasminesoft.jfc.controller.BaseController;
import jp.jasminesoft.jfc.controller.MenuController;
import jp.jasminesoft.jfc.menu.IMenuChoice;
import jp.jasminesoft.jfc.menu.Item;
import jp.jasminesoft.jfc.menu.Menu;
import jp.jasminesoft.jfc.menu.Menubar;
import org.springframework.stereotype.Controller;
/**
 * MenuController の拡張クラスです。
 *
 * @author JasmineSoft
 * @version $Revision$ $Date$
 */
@Controller
public class MyMenuController extends MenuController {
    /** {@inheritDoc} **/
    @Override
    public String perform_db(ActionParameter p)
            throws IOException, ServletException {
        String forward = super.perform_db(p);
        // メニュー情報を取得する。
        Menubar menubar = (Menubar) p.request.getAttribute(
                BaseController.MenubarRequestName);
        for (Menu menu : menubar.getMenu()) {
            // メニュー大項目毎の処理。
            for (IMenuChoice imc : menu.getContent()) {
                if (!(imc instanceof Item)) {
                    continue;
                }
                // メニュー毎の処理
                Item item = (Item) imc;
                if (!"http://calendar.infocharge.net/".equals(item.getUrl())) {
                    // 目的のメニュー以外は処理をスキップ
                    continue;
                }
                // URL に翌月の年月(yyyy/MM/)を埋め込み、
                //「http://calendar.infocharge.net/cal/2017/02/」を組み立てる。
                item.setUrl(item.getUrl()
                        + "cal/" + TEXT(MOVEMONTH(NOW(), 1), "yyyy/MM/"));
            }
        }
        return forward;
    }
}
  • サブメニュー表示時にもこの変更は反映されます。
  • menubar の構造は、wagbyapp/webapps/wagby/WEB-INF/menu.xml ファイルを参照してください。

動作確認

ビルドを行い、外部メニューが正しく動作することを確認します。

うまく動作しない場合、WEB-INF/wagby-servlet.xml にて MyMenuController クラスが参照されていることも合わせてご確認下さい。カスタマイズファイルが取り込まれると、wagby-servlet.xml に次のエントリが含まれます。

<bean id="menuController"
        class="jp.jasminesoft.wagby.controller.MyMenuController">
                <property name="menuService" ref="menuService" />
</bean>
※ ここで紹介した方式はサーバ側でパラメータを付与するため、サーバの処理を通す必要があります。具体的には画面再描画(リロード)を行う必要があります。