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

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

2012年5月20日日曜日

自動リンクを作ってみよう

昨日、今日と、晴れて良い天気ですね。久しぶりに穏やかな週末を過ごしています。

5月18日に行われたXPagesDay&テクてくロータス技術者夜会。
XPages漬けな1日!いかがでしたでしょうか?筆者は、セッションを担当していたため、他の方のセッションを聞く事が出来ませんでした。楽しみにしてたのにぃ~。ちなみに、筆者はあのような場で話をするのは、初めての経験でしたので、かなり緊張しました。
せっかく資料も作ったのに、なんか全部無視していたような・・・
資料は、まだダウンロードできるようですので(5/20 11:00現在)、ご来場できなかった方で興味のある方はダウンロードしてみてください。
URLは、こちら(ダウンロード


本当は、実際のコード部分を見せて、「こうやって組むんですよ」という実例を見せたかったのですが、プレゼン力が低かったので、そこまで出来ませんでした。

ということで、しばらくは、XPagesDayの復習ということで、ブログの記事を構成していきます。


本題に入る前に、恒例のボタンクリックをお願いします。いや、ホント押してください。それだけで筆者のテンションあがって、色んな事書いちゃいますよ。だから、ねっ!
にほんブログ村 IT技術ブログへ



ここまで念押しすればクリックしてくれた事でしょう・・・

では、本題です。
まずは、「用語集 for XPages」の設計要素の構成についてです。
設計要素の一覧


カスタムコントロールはたくさんありますが、XPageは"home"の1つだけです。
ですので、画面遷移は発生しないのです。

カスタムコントロールの中に「ccContents」という設計要素があります。
これはFormの内容をXPagesの画面に表示するための設計要素です。
設計の中身はこんな感じです。
ccContentsの中身

さらに、この中に「関連用語2」「関連用語3」と書かれたセルがあります。
※「関連用語2」の上の行も関連用語の行です。1つしかなかった場合と複数あった場合で ラベルの内容を変更しているので、ラベルの値は式で記述してあります。

これらの右隣のセルに「RelatedTerm1」「RelatedTerm2」「RelatedTerm3」という編集ボックスと「linkRelatedTerm1」「linkRelatedTerm2」「linkRelatedTerm3」というリンクがあります。
これらのコントロールを使って、自動リンクを実現しています。

実際にコードを見てみましょう。
RelatedTerm1、2、3はフォーム上のフィールドにバインド(関連づけ)してあります。
ですので、XPages アプリケーション上で入力した値は、そのまま文書として登録されます。
これらの編集ボックスは「可視」で編集時のみ表示するようにしてあります。

一方、linkRelatedTerm1、2、3は、プロパティの「ラベル」の式に
glossaryDocument.getItemValueString( "RelatedTerm1" )
と記述しています。
linkRelatedTerm1のラベル式

これで表示している文書の関連用語フィールドの内容が表示されるようになります。
こちらは「可視」で読込時のみ表示するようにしてあります。
(※セッション中にも話しましたが、なんで「可視」なんでしょうね?ノーツアプリケーションの場合は「非表示式」なのに・・・とっても分かりにくいんですよね)。

次に、この読込時のみ表示するリンクにイベントを設定して、関連用語が自動的に表示されるようにします。
編集ボックスでもなく、ラベルでもなく、計算結果フィールドでもなく、リンクにしたのは、イベントを設定する事で、ブラウザ上でリンクのように動作してくれるからです。(具体的には、文字に下線が付いたり、青文字になったり、マウスカーソルを合わせると、指の形になったりなどですね)

では、イベントを設定しましょう。
リンクを選択して、イベントビューを開きます。
次に、onClickイベントを選択した状態で、「アクションの追加」をクリックします。
アクションは、「スクリプトの実行」、言語は「JavaScript(サーバーサイド)」を選択します。
関連用語1のonClickイベントのプログラムコード

// 検索用ビューで、関連用語をキーとして検索
var searchView = database.getView( "bySubject" );
var linkKey = glossaryDocument.getItemValueString( "RelatedTerm1" );
var linkDoc:NotesDocument = searchView.getDocumentByKey( linkKey );
if ( linkDoc != null ) {
 sessionScope.linkDocId = linkDoc.getUniversalID();
} else {
 // 存在していない場合は、エラーメッセージを設定してエラーページへと誘導する
 var varSubject = glossaryDocument.getItemValueString( "Subject" );
 sessionScope.errMsg = "見出し語【" + varSubject + "】に、関連用語1【" + linkKey + "】は登録されていません。";
 //context.redirectToPage( "errorPage" );
 sessionScope.errorVisible = 1;
 return ( false );
}
このイベントは、表示されている関連用語をビューで検索して、その文書の文書UNIDを取得して、linkDocIdというセッションスコープ変数に格納するというものです。
なお、8~13行目はエラー処理なので、今回は説明は割愛します。

2行目は、"bySubject"というビューを取得しています。
databaseというのは自DBのことですが、グローバルオブジェクトとして定義されているので、こちらで定義することなく利用できます。

3行目はglossaryDocumentの"RelatedTerm1"アイテムの値を文字列として取得して、linkKeyという変数に代入しています。
glossaryDocumentは、このカスタムコントロール内で、データソースとして定義しているもので、フォームをバインドしてあります。

4行目は、3行目で取得したlinkKeyをキーとして、ビューを検索しています。
getDocumentByKeyはLotusScriptのGetDocumentByKeyメソッドと同じ動作をします。
"bySubject"ビューについては説明していませんが、このメソッドを使用しているという事でご想像いただけたのではないでしょうか。はい。そうですね。Subjectフィールドを昇順で並べてあるビューになっています。

5、6行目で文書が見つかれば、その文書の文書UNIDをlinkDocIdというセッションスコープ変数に格納しています。

これだけで、なぜ選択した文書の内容が表示されるの?ということになりますが、
その秘密は2つあります。
1つ目は、同イベントの中にある「サーバーオプション」の「部分更新」にあります。
ここに更新したいコントロール名を設定するとイベントが実行されたときに、そのコントロールの内容が更新されます。
関連用語クリックイベントのオプション

 2つ目は、 glossaryDocumentデータソースです。
データソースを定義するときに、デフォルトアクションを「文書を開く」に設定すると、開く文書の文書UNIDを設定できるようになります。
ここに式を記述する事によって、開く文書の文書UNIDを動的に変更する事が出来るようになります。
ということで、イベントで取得したsessionScope.linkDocIdを文書UNIDとして設定します。
glossaryDocumentの文書ID

これで文書を開くときは、sessionScope.linkDocIdに格納された文書UNIDの文書ということになります。
この値を変えたら、glossaryDocumentが配置されているコントロールを部分更新で更新すればよいという事です。
部分更新の対象になっている"contentBody"というのは、glossaryDocument全体を覆っているパネルコントロールの名称になります。
(ここでやっと出ましたね、パネル。出てこなかったらどうしようかと思いますね^^;)


断片的ではありますが、これで関連用語を登録する際、何もしなくても自動リンクになる秘密が分かっていただけたのではないでしょうか。
従来のノーツアプリケーションでも、同様の事は出来るのですが、普通に文書リンクを使った方が簡単ですし、その方がノーツっぽいです。

でも、XPagesはWebアプリケーションとしての顔も持ちますので、こちらの方が自然な動きではないかと思います。


次回は、セッションスコープ変数をどう使っていたのかについて解説します。






Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

0 件のコメント: