タイトルがすごくわかりづらいですが…。久々にPrimeFacesのネタです。
現在構築中のシステムでは、以下のように一覧内にリンクが存在する画面があります。
明細を編集したり、削除したり、コピーしたり、っていうよくあるパターンです。
で、業務的な要件として以下があります。
・ユーザの権限や画面のモードによってはリンクを使えなくする必要がある
・単純にリンクを無効にするのは駄目。なぜ押せないかユーザがわからないので。
従って、リンクを押したタイミングでダイアログを出して理由を表示して欲しい
という、これまたわりとよくあるパターンです。
PrimeFacesではConfirmDialogやDialogといったコンポーネントがあるので、素直に作るとxhtmlの中にダイアログの記述が入ります。
具体的には、PrimeFacesのガイドマニュアル例にある以下のようなxhtmlです。
<h:form>
<p:commandButton type="button" onclick="cd.show()" />
<p:confirmDialog message="Are you sure about destroying the world?"
header="Initiating destroy process" severity="alert"
widgetVar="cd">
<p:commandButton value="Yes Sure" actionListener="#{buttonBean.destroyWorld}"
update="messages" oncomplete="confirmation.hide()"/>
<p:commandButton value="Not Yet" onclick="confirmation.hide();" type="button" />
</p:confirmDialog>
</h:form>
この例ではボタンをクリックするとダイアログがでる、という単純な動きのみです。
最初に書いた要件を満たすには、Managed Bean(私の場合はCDI管理対象Bean)で何らかのロジック(権限チェックなど)を走らせて、その結果に基づいて「ダイアログを出す」「出さない」を制御しなければなりません。onclickはそもそも駄目だろなぁ…とか色々考え出して。
うーん(-_-; 本日1度目
さてどうやるべきか…とりあえずググった所、やっぱり同じ質問がありました(^^;
なんかJava EEやPrimeFacesで抱く疑問の全てがStackoverflowにはある気がします…。
Validation before Confirmation in jsf
まさにドンピシャの内容です。
ただ、回答にある「args.validationFailed」のくだりがイマイチ理解できず。
うーん(-_-; 本日2度目
で、一緒に調べてくれた人が「PrimeFacesのサンプルにありますよ、これと似たの」と教えてくれました。
PrimeFacesのデモ Dialog Login Demo
おー確かに。
このサンプルみると
- actionListenerでManaged Beanを紐づけ
- ManagedBeanでPrimeFacesのRequestContextのaddCallbackParamメソッドでパラメータを設定
- イベントはonclickではなくoncompleteを利用(イベント順によるものかと)
- oncompleteがJavaScriptの関数を呼び出し、何らか制御
してます。
この最後の「何らか制御」で私の場合は以下のようにダイアログを出す、出さない、を書きました。
<script type="text/javascript">
function handleError(args) {
if(args.isError) {
delDlg.show();
}
}
</script>
で、とりあえずactionLisnerで以下のようなメソッドに紐づけ、とりあえず手でフラグを変えて挙動の違いを確認しました。
ダイアログをでないようになるパターン。
isErrorにfalseをセットします。
public void checkError() {
RequestContext context = RequestContext.getCurrentInstance();
context.addCallbackParam("isError", false);
}
画像だとわかりにくいですが、押しても何もでてきません。
ダイアログがでるようになるパターン
isErrorにtrueをセットします。
public void checkError() {
RequestContext context = RequestContext.getCurrentInstance();
context.addCallbackParam("isError", true);
}
フラグ変えたらちゃんとダイアログでた!
上記の例では、ベタに手でtrue/falseの切換えをしましたが、何らかの判定ロジックに基づいてフラグを塗り替えるようなことをすれば、ダイアログの表示制御もできそうです。
ふぅー、良かった。