当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。
記事そのもののリンクについてはご自由に行っていただいてよいです。

テクてく Lotus 技術者 Slack に参加しよう!

2015年9月4日金曜日

繰り返しコントロールのページ制御をやってみよう。

こんにちは。最近、やる気が感じられないと言われてますが、みなさんはどうでしょうか? 私の場合、今年は夏休みを取っていないので、やる気の持続力が低下しているのでしょう。


私にやる気を出させたいなら、はっきりとした餌をぶら下げる必要があります。
ということで、このボタンをクリックしましょう。これが餌です。
 にほんブログ村 IT技術ブログへ


餌をくれた人はこの先を読んでいいです(笑)。


さて、今日もXPagesネタです。

先日、qa for ICS(Lotus) Developersというサイトに質問を投稿しました。
こちらですね。
繰り返しコントロール内でどれが選択されたのかを取得したい
データソースとして、ビューではなく、文書内の複数値アイテムを設定したので、ビューコントロールではなく、繰り返しコントロールを使って表現することにしたのですが、繰り返しコントロール内の値を全選択/全選択解除ができない!
どうすれば???
という質問でした。

この問題そのものは、おかげさまでなんとか解決できたのですが、新たな問題が発生しました。
今日はその問題の内容と解決策(回避策?)を記事にします。


問題はページ切り替えにあった

繰り返しコントロール内の値を選択できるようにしたのは良いのですが、この繰り返しコントロールのデータソースである複数値。
数が多いと、1ページに収まらないことがあります(デフォルトで1ページ30ですが、画面の都合上、15にしてあります)。
そのため、ページ遷移が必要になりました。
そこで、繰り返しコントロールをページ遷移できるように「ページャ」コントロールを配置しました。
添付先(プロパティでいうと、「for」)は繰り返しコントロールのIDを設定しました。
これで、ページ遷移ができるようになりました。

しかし!チェックボックスにチェックしたまま、ページを切り替えてもチェックが外れてくれません!

ビューコントロール内に含まれるページャは、ページが切り替わったらチェックを外してくれるのに!
なんでだよー。


まぁ、繰り返しコントロール内にチェックボックスを配置した時点で(しかも、sessionScope変数とか使ってるし)、ページ遷移に対応してなくても当たり前かな。
とは思っていたので、
「イベント時のコードを書けば軽く解決だよ」なんて考えてました。
それが後に 悲劇を引き起こすとも知らずに・・・


ページャをカスタマイズしてみた


さて、じゃぁ、ページャのイベントでもチェックしようかな。と思って、イベントビューやプロパティを見てみました。
・・・が、「この要素にはイベントが指定されていません。」という冷たい表記が。
え!?
ページャには標準ではイベントは設定されていない

○▼※△☆▲※◎★●・・・・・・・・・・・・・!?
そんな馬鹿な!ということで困ったときのヘルプを見ました。
そこには、ちゃんと「onclick」のイベントがあるよ。という記述が。
よーくヘルプを読むと(<- p="">なぁんだ、納得。危ない危ない。
早速、カスタムにしてみました。設定は、とりあえず"サンプル1"と同じになるように「前へ、ページセレクター、次へ」としました。
ページスタイルをカスタムにしてみた
すると、「ページャ」コントロール配下に「ページャコントロール」が作成されます。
このコントロールを選択した状態でイベントビューを見てみると・・・
やった!普通にイベントが設定されています 。ここまでくれば終わったも同然ジャン(^_^)



イベント時のコードが動かない

ということで、「onclick」イベントにコードを記述してみました。
とりあえず、チェックボックスは全部外すようにしておけばいいかな?
念のため、動きをチェックしたいから「次へ」の「ページャコントロール」のonclickイベントに書いてみよう。
と、
getComponent( "checkBox1" ).setValue( "0" );

というコードを書きました。

が・・・動きません。
なんで???
SSJSだけでなく、CSJSすら動いてくれません。
夢でも見ているのでしょうか・・・

みんな苦労してるよ

いくらコードを書いても動かないものは動きません。
仕方がないので、google先生に聞いてみました(キーワードは「xpages pager onclick」)。
すると、やはり同じ悩みで苦しんでいる人はいました。
Stack Overflowに同じような質問がありました。
おまけに回答もついています。これは嬉しい予感!

しかし、その回答に出ている事を適用してみましたが、結果は変わりません。
惜しい・・・

さらに調べていくと、別のQAも見つけました。
回答もついていて、その回答も先ほど見つけたのとは別物。
これは期待できる!?

回答内容は、Dojo のonclick イベントをハンドリングしてしまえばいいんだよ。というものでした。
dojo.connect()を使って、指定したオブジェクトのonclickイベントを発生させればよい。
という感じでしょうか。

これはさすがにコードが動きました!
やったね!
ただ、残念だったのが、CSJSしか動かないということです。
チェックボックスの制御にはsessionScope変数も使っているので、SSJが動かないと話にならないのです。
隠しでボタンを配置して、CSJSからそのボタンをクリックすることで強引にコードを動かそうという事も試みましたが、なぜか動いてくれません。

なんか、悪いことした?プライベートでも嫌なことあったし・・・
ホント、ついてないなぁ。

もう、自作しちゃえ!

と、ここまで来たら、色々考えるのが嫌になってしまいました。
しかし、ここでさらに、ページャ及びページャコントロールについて調べていくうちに、ページャの説明が書いてあるjavadocにもたどり着いていました。
関連クラスの説明を読んでいると、上位クラスである「com.ibm.xsp.component.UIPager」にgotoNext()とかgotoPrevious()というメソッドがある事が分かりました。

あれ?これはもしかして、自分でページ遷移のコードを書けるのでは???
と思っていろいろ試してみると、ボタンでもリンクでもラベルでも、onclickイベントにSSJSで書くとページ遷移をできることが分かりました。

うん、もうこれでいいじゃん。ということで、
ページャコントロールの下の行に"次へ"というラベルのラベルコントロールを 作成して、そのonclickイベントに

getComponent( "pager1" ).gotoNext();
getComponent( "checkBox1" ).setValue("0");
for( var n=0;sessionScope.selectedIds.length>n;n++ ) {
 sessionScope.selectedIds.set( n, "0" );
}

というコードを記述してみました。

早速動かしてみたところ、
うまくいきました!

スタイルは設定していないので、単なるラベルという状態ですが、クリックするとチェックボックスが消えているのがわかると思います。


ページャも表示してありますが、非表示にしておけば(表示のチェックボックスを外す)、それで問題ありません(ページャコントロールは配置していないと動作しません)。


この解決策(回避策)が正しいかどうかはわかりません。 他にもっとスマートな解決策があったかもしれません。
ですが、このようにページ遷移も自作することで好きなことをさせられます。
まぁ実際には、表示されているページだけをチェックしなくてはいけないとか、改善点はたくさんありますが、それはご自分で考えてみてください。


それでは今日はこの辺で・・・








 【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします!
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ