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

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

2012年8月29日水曜日

XPagesのアクセスログを作ってみよう(応用編)

累積アクセス数が28万を超えました。たくさんの方に見ていただいていて、感謝しています。

でも・・・コメントが少ないんですよね。あまりにも一方通行のような気がしてなりません。
コメントするのが恥ずかしいとかいうのであれば、メールでも構いませんので、意見をください。

閑話休題。

さて、そう言いつつも今日も話題を提供します。その前に恒例のクリックをお願いします。
にほんブログ村 IT技術ブログへ


今回は、前回の続きというか応用です。
前回は、1つのXPageにアクセスログを記録するためのコードを埋め込むだけでした。
アクセスログを記録するためのノーツDBは、別に作ってあって共有できるような作りなのに、これでは寂しいです。


ということで、アクセスログを記録するコードを部品化することにチャレンジしてみましょう。

まずは、スクリプトライブラリにJavaScriptライブラリを作成します。
データベースナビゲータビューで、「コード」「スクリプトライブラリ」を開いて、[新規スクリプトライブラリ]ボタンをクリックします(下図参照)。
スクリプトライブラリ一覧画面

新規スクリプトライブラリのダイアログが表示されるので、名前とタイプに適切な値を入力して、[OK]をクリックします。
ここでは「名前」は、 "LibAccessLog"とします。タイプは、"サーバー JavaScript"にします。
新規スクリプトライブラリのダイアログ

すると、JavaScriptのエディタ画面になります。
あまりにも貧相なので、どう記述して良いのか悩んでしまいますが・・・
次のように記述します。
function openDocumentLog( document1:NotesXSPDocument ) {
    var logdb:NotesDatabase = session.getDatabase( @Subset(@DbName(),1), "XPages/acsLog.nsf", false );
  
    if ( logdb == null ) {
    } else {
        var accessDateTime = session.createDateTime( @Now() );
        var accessDoc = database.getDocumentByID( document1.getNoteID() );
      
        var logdoc:NotesDocument = logdb.createDocument();
      
        logdoc.replaceItemValue( "Form", "AccessLog" );
        logdoc.replaceItemValue( "AccessDatabase", database.getFilePath() );
        logdoc.replaceItemValue( "AccessDatabaseTitle", database.getTitle() );
        logdoc.replaceItemValue( "AccessDateTime", accessDateTime );
        logdoc.replaceItemValue( "AccessUser", @UserName() );
        logdoc.replaceItemValue( "AccessDocUNID", accessDoc.getUniversalID() );
        logdoc.replaceItemValue( "AccessDocID", document1.getNoteID() );
      
        logdoc.save();
    }
}
openDocumentLogというのが関数名になります。その引数はdocument1です。
関数の中身は、前回と同じですね。

記述できたら、保存して閉じます。
次に、このコードをXPageから呼び出せるようにします。

フォームのデータリソースが定義してあるXPage を開きます(ここでのサンプルは前回と同じノーツアプリケーションを利用します)。
設計画面の何もないところをクリックした状態で、プロパティビューを開きます。
そこの「リソース」タブを開いて、[追加▼]というボタンをクリックします。
追加できるリソースの一覧が選択肢として表示されるので、「JavaScript...」を選択します(下図参照)。
JavaScriptライブラリを追加

「JavaScriptライブラリをページへ追加」というダイアログが表示されるので、さきほど作成した「LibAccessLog」を選択して、[OK]をクリックします。
JavaScriptライブラリをページに追加

画面に戻ると、JavaScriptライブラリがページに追加されています。
JavaScriptライブラリがページに追加された

今度は、そのまま「イベント」ビューを開きます。
「データ」「document1」のpostOpenDocumentイベントにコードが追加されているので、思い切ってそれを削除します(アクションを選択して、[削除]ボタンをクリックします)。

そして、[アクションの追加...]をクリックして、「スクリプトの実行」を選択して、スクリプトエディタを開きます。
あとは、ここにさきほど作成した関数名を入力します。引数として、NotesXSPDocument オブジェクト名を入力するのを忘れないようにしましょう。
共通化した関数を入力します

そうしたら、[OK]を押して完了します。
画面に戻ったら、XPage を保存します。

これで完了です。簡単ですね。
ちなみに、他のXPagesアプリケーションに実装して、アクセスログを取得した結果が次の画面です。
複数のXpagesアプリケーションにアクセスログを設定した結果

確かに複数DBのアクセスログが記録されていますね。
ちなみに、「図書管理 for XPages」は、以前に連載していた「おじさんSE」シリーズで作成したXPagesアプリケーションで、フォームのデータリソースは、「BookResource」というカスタムコントロールにあります。
この場合、カスタムコントロールのイベントに関数を設定すれば、アクセスログが取得できます。


ということで、色々なXPagesアプリケーションにアクセスログを設定してみましょう。






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

2012年8月28日火曜日

XPagesのアクセスログを作ってみよう

こんにちは。
皆さん、今日もヘルプを読んでますか!分からないことがあったら、ヘルプをまず読みましょう!
隅から隅まで読むときっと次へのステップの手がかりが見つかります!



それでも、ヘルプなんか読みたくないんだよ!という方は、このボタンを押してから、記事を読みましょう。より理解が深まることでしょう。
にほんブログ村 IT技術ブログへ



さて、今日はXPagesでのアクセスログを作ってみましょう。
通常のノーツアプリケーションの場合であれば、フォームのQureyopenイベントにアクセスログを記録するコードを書けばよいでしょう。Webアプリケーションの場合であれば、フォームのWebQueryOpenで実行するエージェントにコードを追記すればよいでしょう。
では、XPages の場合はどうすれば良いのか?というところを検証します。

今回は、そんなに深くまで検証していないので、フォームが設定されたXPageをターゲットとします。
他のパターン(カスタムコントロールや1つのXPage内に複数のフォームが設定されている場合等)については、別の機会に検証しましょう。

まず、アクセスログは、別のDBに記録するものとします。同一DB内でも良いのですが、DBの文書が増えてしまうのと、他のDBからも利用できるようにするためということが理由です。汎用性を持たせると言うことですね。

データベースパス名は、「XPages/acsLog.nsf」とします。(XPagesというフォルダの下に作成します)。
フォーム名は何でも良いですが、ここでは「AccessLog」としておきます。
フィールドは以下の6つを作成します。
No.項目名フィールド名
1アクセスDBパスAccessDatabase
2アクセスDBタイトルAccessDatabaseTitle
3アクセス日時AccessDateTime
4アクセスユーザーAccessUser
5アクセス文書UNIDAccessDocUNID
6アクセス文書IDAccessDocID


次に、このアクセスログに記録するXPageですが、XPagesで添付ファイルの処理をする(アップロード) で作成したDBを使います。

このDBの文書を開いたときに、ログを記録するようにします。ということで使用するXPageは、「MainTopic」です。

このXPageの設計画面の何もないところをクリックして、イベントビューを表示します。
イベントビューに「データ」「document1」と表示してある箇所があるので、「document1」をクリックします。
すると、付随するイベントの一覧が展開して表示されます(下図)。
document1のイベント一覧

察しの良い方はこれだけで分かったのではないでしょうか?
そうです。ここのイベントにコードを記述すればよいのです。では、どこのイベントが良いでしょうか?
今回は、既存の文書が開かれたときに、アクセスログを取ることにしたいので、「postOpenDocument」イベントを選択します。

そうしたら、[アクションの追加]というボタンをクリックします。「シンプルアクションの追加」ダイアログが表示されるので、「アクション」を"スクリプトの実行"に変更します(下図参照)。
すると、画面下部がスクリプトのエディタ画面に変わります。しかし、これでは入力しづらいので、エディタの右側にあるボタンをクリックします。
「スクリプトの実行」アクションを追加

大きなエディタ画面になるので、次のコードを入力します。
アクセスログを追加するコード

画像ではわからん!という人はこちらをどうぞ。
var logdb:NotesDatabase = session.getDatabase( @Subset(@DbName(),1), "XPages/acsLog.nsf", false );

if ( logdb == null ) {
} else {
    var accessDateTime = session.createDateTime( @Now() );
    var accessDoc = database.getDocumentByID( document1.getNoteID() );

    var logdoc:NotesDocument = logdb.createDocument();

    logdoc.replaceItemValue( "Form" , "AccessLog" );
    logdoc.replaceItemValue( "AccessDatabase" , database.getFilePath() );
    logdoc.replaceItemValue( "AccessDatabaseTitle", database.getTitle() );
    logdoc.replaceItemValue( "AccessDateTime" , accessDateTime );
    logdoc.replaceItemValue( "AccessUser" , @UserName() );
    logdoc.replaceItemValue( "AccessDocUNID" , accessDoc.getUniversalID() );
    logdoc.replaceItemValue( "AccessDocID" , document1.getNoteID() );

    logdoc.save();
}
以下、簡単に解説をします。
1行目は、アクセスログDBを取得しています。
@Subset(@DbName(),1)で、自身と同じサーバのサーバ名を取得しています。
ファイル名は、"XPages/acsLog.nsf"です。ノーツアプリケーションの場合、フォルダの区切りは"\"でしたが、XPagesアプリケーションの場合、"/"で区切ります。

3行目のif ( logdb == null ) {は、万が一アクセスログDBにアクセスできなかった場合の事を考えています。

5行目のvar accessDateTime = session.createDateTime( @Now() ); は、今の時間をNtesDateTimeオブジェクトとして作成しています。
アクセスログDBの「AccessDateTime」というフィールドは、日時型で作成しているので、このような形にしておく必要があります。

6行目のvar accessDoc = database.getDocumentByID( document1.getNoteID() ); は、自文書のUNIDを取得するために実行しています。
XPageで定義するデータリソースはNotesXSPDocumentというオブジェクトで、プロパティにUNIDを保有していないのです。そこで仕方がないので、NoteIDを使って、文書を検索してきているのです。ここで取得している文書は、NotesDocumentオブジェクトなので、文書UNIDが取得できると言うことです。

10~16行目のlogdoc.replaceItemValue(・・・) は、アイテムに値をセットしているところです。

18行目のlogdoc.save();でアクセスログ文書を保存しています。


入力したら、[OK]をクリックします。
「シンプルアクションの追加」ダイアログに戻るので、ここでも[OK]をクリックします。

イベントビューを見ると、確かにアクションが追加されたことが分かります。
postOpenに追加されたアクション

これでXPageを保存します。

後は、実際にXPageアプリケーションをWebブラウザから開いてみてください。
画面上では文書が開くだけで何も起きませんが、アクセスログDBを見てみると、アクセスログが記録されています。
アクセスログDBのビュー画面


どうでしょうか?そんなに難しくないですよね。今までのアプリケーションでアクセスログを取っていたけど、XPages にしたら取れなくなったけど、どうすれば良いんだ?と言う場合に参考にしてみてください。




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

2012年8月24日金曜日

繰り返しコントロールを装飾してみよう

こんにちは。予告通り、3日間更新をお休みさせて頂きました。
ということで、今日は更新します(でないと、3日間の休みではなくなってしまいますしね)。

その前に、恒例のボタンクリックをお願いします。どうも、記事を更新したときだけクリックして頂いているようなのですが、読むたびにクリックして頂いて構いませんので、ご協力をお願いします!
にほんブログ村 IT技術ブログへ



さて、では今日の話題へと・・・
前回は、繰り返しコントロールを使ってビューを表現してみました。
ですが、最後に書いたように、スタイルの設定をしていないので、とてもみすぼらしい形になってしまいました。
皆さん、各自で色々試されたのではないかと思いますが、筆者も筆者流にカスタマイズしてみようかと思います。

今回の記事を読めば、ノーツプログラマーな方もXPagesアプリケーションを「それなりに」(笑)、デザインできるようになるはずです。


主にやることは次の4つでしょう。
  1. ビューのページャを作成する
  2. ビューの列タイトルを追加する
  3. ビューの書式を整える
  4. その他細かい調整を行う
 では、順に見ていきましょう。
1.ビューのページャとは、1画面に文書が表示しきれないとき(デフォルトは1画面30文書)に、次のページに移動するようにするというものです。

コントロールビューの「コアコントロール」の中に「ページャ」があるので、それを繰り返しコントロールの上にドラッグ&ドロップします。
ページャコントロールを追加

貼り付けた「ページャ」を繰り返しコントロールと連携する必要があるので、プロパティビューの「添付先」という項目をクリックして、繰り返しコントロールを選択します。
ページャコントロールのプロパティを設定

同じ画面内にある「ページャスタイル」はページャの見せ方をどのようにしますか?というものなので、後で自由に設定してください。ここでは、「サンプル1」のままとしておきます。

ページャの設定はこれだけです。簡単ですね。

次は、2.ビューの列タイトルを追加しましょう。
繰り返しコントロールは表を使って列項目を表現するようにしました。
ですので、列も同じように表を使って表現します。
「表」コントロールを「ページャ」と「繰り返しコントロール」の間にドラッグ&ドロップします。
表の大きさは「行:1、列:3」とします。
列タイトルを配置するための表を追加

表の幅は100%にしておきましょう(上の画面で設定できるのですが、いつも忘れてしまいます・・・)

列タイトルを表示させるので、「ラベル」コントロールをそれぞれのセルにドラッグ&ドロップします。
一番左のセルのラベルは、「作成日
真ん中のセルのラベルは、「件名
一番右のセルのラベルは、「添付ファイル名
とします。
列名のラベルを追加

また、それぞれのラベルは太文字に設定しておいてください。

このままだと、セルが自動配置されてしまい、表示が見にくくなります。
そこでセルの幅を固定にします。
この時、ビューの列幅も同じ設定にしておくことで、より見やすくすることが出来ます。

そう言うときにスタイルシートを使うと簡単に行う事ができます。
[表示][移動][スタイルシート]メニューをクリックして、スタイルシートの一覧画面を表示します。
スタイルシート画面に移動する

データベースナビゲータビューで、スタイルシートを選択しても良いのですが、どこにあるか分からないと言うときに、上のやり方は簡単です(実際に、スタイルシートは、[リソース]の配下にあります)。

さて、[新規スタイルシート]ボタンをクリックしてスタイルシートを作成します。
名前は任意ですが、ここでは「stylesheet」としておきます。
新規スタイルシートの作成

スタイルシートには、以下のように記述してください。
.ViewCellLeft   { border-top: solid 1px #D9D9D9; width: 10em; height: 2em }
.ViewCellCenter { border-top: solid 1px #D9D9D9; width: 40em; height: 2em }
.ViewCellRight  { border-top: solid 1px #D9D9D9; height: 2em }
記述したら、保存して閉じます。

今まで編集していたXPageに戻ります。
設計画面の何もないところをクリックして、プロパティビューの「リソース」タブを開きます。

[追加]ボタンをクリックします。 すると、追加したいリソースの一覧が表示されるので、「スタイルシート」を選択します。
追加するリソースとしてスタイルシートを選択

すると、追加するスタイルシートを選択するダイアログが表示されるので、先ほど作成した「stylesheet」を選択して、[OK]をクリックします。
スタイルシートを選択

これで、このXPageではstylesheet.cssが利用できるようになりました。

スタイルシートの内容を各コントロールに当てはめる設定を行います。
1番左の列タイトルのセルを選択したら、プロパティビューの「スタイル」タブを開きます。
スタイルシートの中の作成した項目が表示されるので、「.ViewCellLeft」を選択します。すると、その瞬間にセルにスタイルシートの内容が反映されます。

同じように真ん中のセルのスタイルは「.ViewCellCenter」を、一番右のセルのスタイルは「.ViewCellRight」を選択します。


今度は、3.ビューの書式を整えるということで、
列のタイトルと同じように設定します。
ビューデータを設定したセルのそれぞれのスタイルに、「.ViewCellLeft」「.ViewCellCenter」「.ViewCellRight」を設定します。

ここまでで一度、XPageを保存してWebブラウザで結果を確認してみましょう。
繰り返しコントロールにいくつかのスタイルを追加

最初に比べたら、随分と見栄えが良くなりました。もう少し改良してみましょう。
件名の部分は、ハイパーリンクになっているので、分かりやすくするため、太文字にしましょう。

また、列タイトルは、ビューデータと混同しないように、背景色を設定してみましょう。
列タイトルを配置してあるビュー自身の背景色にグレーを設定します。


そして、もう一つ。ちょっとしたお遊びを。
マウスカーソルが当たっている行の色を変えてみたいと思います。

さきほど作成したstylesheetに以下の行を追加して保存してください。
.ViewDataColumn { cursor: default }
.ViewDataColumn:hover{ background-color:#FFFFC8 }

その次に、ビューデータを格納している「表」コントロールを選択してプロパティビューを表示します。
「スタイル」タブを開いて、スタイルに「.ViewDataColumn」を選択してください。
表コントロールにスタイルを追加

これでXPageを保存します。
こうすると、Webブラウザで見たときに、マウスカーソルがあたっている行がハイライトされます。
.ViewDataColumn:hoverの「hover」というのが、CSS でマウスカーソルが当たっているときというのを指しています。


ちなみに・・・通常のビューコントロールでも同様の設定が行えます。
1.ビューコントロールを選択します。
2.プロパティビューの「スタイル」タブを開きます。
3.スタイルクラスで「rowClasses」を選択します。
4.スタイル一覧から「.ViewDataColumn」を選択します。
ビューコントロールにスタイルを追加


この状態で、繰り返しコントロールのXPageをWebブラウザで表示したのが次の画面です。
一行だけ反転しているのがわかるでしょうか?
選択した行が反転している


いかがでしょうか?繰り返しコントロールを使ったビューなら、色々と自分好みにカスタマイズできるのが分かって頂けたでしょうか?

スタイルシートを使うと、このようにXPagesアプリケーションの表現方法が格段に増えますので、是非覚えましょう。



では、今日はこの辺で・・・






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

2012年8月20日月曜日

繰り返しコントロールを使ってみよう

こんにちは。8月ももう下旬です。早いですね。なぜか今年は8月があっという間に過ぎていっています。
まぁ、原因は分かっているのですが・・・え?何かって?内緒です。

ちなみに、「内緒」とは元々は、「内証」だったらしいですね。音が似ていることにより変化したのでしょう。
そう考えると、今風の言葉も、数十~数百年後には違和感なく使われることになるかもしれませんね。


閑話休題。

今週も乗り切るために、ボタンをクリックしてから、心して読むようにしましょう。
にほんブログ村 IT技術ブログへ



さて、今日はXPagesでのビューの表現方法について、別の方法を学びます。

方法は・・・「繰り返し」コントロールというものを使います。
いずれにしても、ノーツアプリケーションの場合に、フォームとビューは必要なので、まずはそれらを準備します。
と言っても、毎回毎回作るのは面倒なので、前回の記事で 作成したものをそのまま流用します。

XPage は、「adv」という名前で作成します。
まずは、XPage にデータソースを設定するので、プロパティビューの「データ」タブを開きます。
[追加]というボタンがあるので、そこをクリックします。すると、文書かビューの選択肢が表示されるので、「Domino ビュー」を選択します。
データソースにDomino ビューを追加

すると、画面の右側にDomino ビューの設定項目が表示されるので、ビューに「($All)」を設定します。
ビューの選択

次に、コントロールビューにある「コンテナコントロール」から「繰り返し」コントロールをドラッグ&ドロップします。
繰り返しコントロールの追加

プロパティビューを開いて、繰り返しコントロールの設定を行います。
「使用するバインドデータ」の項目で、「JavaScript」を選択して、値にview1と入力します。
また、オプションのコレクション名に「rowData」と入力します。この名称は任意のもので結構です。
繰り返しコントロールの設定

次に、列の値を表示するための表を設定します。
表コントロールを繰り返しコントロールの中にドラッグ&ドロップします。その際、 行数:1、列数:3とします。
表コントロールの追加

また、表の幅は100パーセントにしておいてください。

今度は、ビューの列の値をセットします。
計算結果フィールドコントロールを表の一番左のセルの中にドラッグ&ドロップします。
プロパティビューの値は、JavaScriptにして、次のように入力してください。
rowData.getColumnValue("$1")

$1というのは、ビュー列のプログラム名というところの名前です。違っている場合は、実際のビューの列のプログラム名にあわせてください。
なお、この列は、作成日を表示しています。
ビュー列のプログラム名

次に2列目を表示させます。ここは、Subjectなので、クリックしたときに文書が表示されるようにします。
そこで、リンクコントロールを表の真ん中のセルにドラッグ&ドロップします。

リンクの場合、表示するデータはラベルとして設定する必要があるので、計算式を設定します。
プロパティビューの「リンク」タブにある「ラベル」の右横にある◇をクリックして、値の計算...を選択します。
値は、
rowData.getColumnValue("Subject")

とします。
リンクのラベルの値を設定

さらに、オプションのURLに「$$OpenDominoDocument.xsp」と入力します。
これは、決まり文句なのでこのまま入力してください。
この時、上のリンクタイプは「URL」としておいてください。
リンクのオプション

ただし、このままでは、リンクをクリックしたときにどの文書を開けばよいのか?という指示がされていません。
「プロパティ」ビューの「すべてのプロパティ」タブを開きます。
その中に「データ」という大項目があります。さらに、その中に「parameters」という項目があるので、そこを選択します。
すると、[+][-]という記号が表示されるので、[+]を2回クリックします。

parameter [0]とoarameter [1]が出来るので、それぞれの項目に下記のように入力します。

parameter [0]
name action
value openDocument

parameter [1]
namedocumentId
value右側の◇をクリックして、「値の計算...」をクリックして、次の式を入力します。
rowData.getUniversalID()

これでリンクが設定できました。
リンクコントロールのすべてのプロパティ

最後に3列目を設定します。
計算結果フィールドコントロールを表の一番右のセルにドラッグ&ドロップします。

プロパティビューの値は、JavaScriptにして、次のように入力してください。
rowData.getColumnValue("$2")

ここで、この3列目は、前回添付ファイルをビューから直接ダウンロードできるようにと、HTMLを記述しています。
このまま表示すると、HTMLがテキストとして認識されてしまいます。
そこで、この計算結果フィールドコントロールのプロパティビューの「計算結果フィールド」タブを開きます。
オプションの「コンテンツの種類」という項目があるので、そこをHTMLに変更します。
計算結果フィールドコントロールのコンテンツタイプを変更

これで出来ました。
早速Webブラウザで確認してみましょう。
繰り返しコントロールのプリビュー

ビューの枠線やセル幅を調整していないため、とても見苦しい結果になっていますが、確かにビューの内容が表示されているのが分かるかと思います。

そのあたりは、皆さん各自で、色々と試してみてください。


というところで今日はこれまで。





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

2012年8月17日金曜日

XPagesで添付ファイルの処理をする(ダウンロード)

おはようございます。今日は金曜日です。お盆休みもこの土日まで。という方も多いのではないでしょうか?来週からまた通常勤務と考えると、ちょっとだけへこみますね。

そんなときは、このボタンをクリックして気を紛らわせましょう。
にほんブログ村 IT技術ブログへ




さて、昨日はXPagesで添付ファイルのアップロードについて検証を行いました。
ということで、今日はダウンロードについてです。

昨日のブログで、複数の添付ファイルをファイルアップロードするには、同時にファイルのダウンロードコントロールも配置する必要があることは書きました。
また、そのオプションについても簡単ですが触れました。

この状態で、すでに既存の文書に添付されているファイルのダウンロードはできる状態なんですね。
でも、これだけじゃつまらないですね。

従来のWebアプリケーションであったように、ビュー上から直接添付ファイルを開く(もしくはダウンロードする)ようにはどうしたら良いのかを検証してみましょう。


XPagesでビューを表現するには、
1.ビューを作成する
2.ビューを表示するためのXPageを作成する

もう、この手順は皆さん覚えていただけたことでしょう。
では、詳しく見ていきましょう。
1.ビューを作成する
ビューの名称は何でも良いです。筆者はこういうときは、「($All)」とします。
ビューの列は「作成日」「Subject」「添付ファイル名(@AttachmentNames)」としておきます。

次に、
2.ビューを表示するためのXPageを作成する
名称は、「home」とします。
このXPageに($All)ビューをバインドしたビューコントロールを配置します。

下図は、そのXPageをWebブラウザでプリビューした画面です。
ビューコントロールを配置したXPageのプリビュー

文書は、前回作成したXPageを使って作成したものです。
ファイルを3つ添付しています。そのため、添付ファイル名が3つ表示されています。
が・・・リンクになっていませんね。

確かに、リンクの設定をしていませんから。
では、XPageのビューコントロールのプロパティで、「列の値をリンクとして表示する」にチェックをつければ良いのでしょうか?


答えは、ノーです。
それでは、文書を開いてしまいます。今、ここでやりたいのは、直接添付ファイルにアクセスするということですので、それではダメですね。

筆者が今のところ、解決策(回避策?)として、持っているのは、ビューの列式に添付ファイルへアクセスするためのHTMLを直接入力してしまうということです。

なんだ、従来のWebアプリと同じじゃないか!といわれるかもしれませんが、そのとおりなんです。
ただし、従来のWebアプリの場合、テキストファイルやPDFは直接Webブラウザ上で開いていたかと思いますが、今回はXPagesのようにどんなファイルもダウンロードするようにしてみましょう。

($All)ビューをLotus Domino Designerで開きます。
3列目の添付ファイル名を表示するところの式を以下のように修正します。
aFile := @AttachmentNames;

@For(i:=1;i<=@Elements(aFile);i:=i+1;ret:=ret + ""
+ aFile[i] + "
"); ret
これで、($All)ビューを保存します。

次に、「home」XPageを開いて、ビューコントロールの中の3列目の添付ファイルの箇所をクリックします。
この状態で、プロパティビューの「表示」 タブを開きます。

コンテンツの種類という項目があるので、そこを「テキスト」から「HTML」に変更します(下図参照)。
コンテンツの種類を変更する

これで「home」XPageを保存して、Webブラウザで表示してみましょう。
ビューの列式を修正したXPage

今度は添付ファイル名が改行されていて、リンクのように表示されています。
実際にクリックすると、ファイルを保存するかどうかのダイアログが表示されます。

先ほどの式は、XPagesで文書を開いたときに、添付ファイルをクリックしたときに実行されるURLを解析したものです。
「/xsp/.ibmmodres/domino/OpenAttachment/」というのが、添付ファイルを処理するエージェントのようで、その後に指定したファイル名をダウンロードするという動きになっているようです。

従来のWebアプリでは、ファイルの種類によってはダウンロードではなく、直接開いてしまうということもあったのですが、それもこれで解消できるようになります。



これで、ビューから直接添付ファイルにアクセスできるようになりましたね。
ぜひ、試してみてください。







ちなみに・・・筆者は、ようやくWindows7搭載のPCを買いました。
まだ、Windows7に慣れていないので???、画面ショット等に見苦しい点があるかもしれませんが、ご容赦ください。



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

2012年8月16日木曜日

XPagesで添付ファイルの処理をする(アップロード)

こんにちは。今日も暑いですね。
筆者は今日もお仕事です。夏休みはいつにしようかな。なんて考えていますが、そもそも取れるのかどうかが分かりません。

そんな筆者に応援のクリックをお願いします。
にほんブログ村 IT技術ブログへ



さて、今日はXPagesでの添付ファイルの取り扱い方について検証しましょう。
一度、サンプルのアプリケーションを作っていたのですが、今になって、「ん?どうやって制御しているんだっけ?」となってしまったので、筆者的には復習です。


まずは、普通に?フォームを作成します。今回は検証なので、必要最低限のフィールドということで、
フィールド名 種類
Subject テキスト
Body リッチテキスト
とします。

フォーム名は、MainTopic としておきましょう。
MainTopic フォーム

次に、MainTopicという名前でXPageを作成します。
プロパティビューの「データ」タブで、Domino文書のデータソースを作成します。フォームはもちろん、作ほど作成したMainTopicを選択します。
データソースを追加


今度は、コントロールビューの「コアコントロール」タブから、編集ボックスを選択して編集領域にドラッグ&ドロップします。
画面に表示したときに分かりやすいように、表やラベルも一緒に作成しておきましょう。
MainTopic XpageにSubject 編集ボックス、その他を追加

次に添付ファイルをアップロードするためのコントロールを追加します。
編集ボックスと同じ「コアコントロール」タブの中に、『ファイルのアップロード』があるので、それをドラッグ&ドロップします。
ファイルのアップロードをドラッグ&ドロップ

追加されたら、プロパティビューの「データ」タブを表示します。
このアップロードコントロールをMainTopicフォームのBodyフィールドにバインドするための設定を行います。
ファイルのアップロードにBodyフィールドをバインドする

このままでも良いのですが、それだと文書を保存したときにファイルが添付されることになり、複数のファイルを添付するのが面倒です(保存 -> 開く -> 編集 -> 添付 -> 保存・・・の繰り返し)。

だからといって、ファイルのアップロードコントロールを追加するのは格好良くありません。
では、どうすれば良いのでしょうか?


・・・

まずは、添付されたファイルを表示するためのコントロールを追加します。
『ファイルのダウンロード』コントロールをドラッグ&ドロップします。
ファイルのダウンロードコントロールを追加

オプションがあるので、変更しておきます。好きなようにして良いのですが、筆者のお薦めは
・添付ファイルがない場合は非表示
・削除を許可
にチェックを付けておくことです。
ファイルのダウンロードコントロールのオプション

また、ファイルのアップロードコントロールと同じように、MainTopic フォームのBody フィールドにバインドします。

今度はファイルのアップロードコントロールに戻って、そのイベントビューを開きます。
デフォルトでは、マウスのonClickにフォーカスが当たっているので「選択して変更」のonChangeをクリックしてフォーカスを当てます。
そして、画面右側にあるサーバーオプションを「すべて変更」にします。
この時、「検証を行わずにデータを処理する」にチェックを付けておきましょう。
これをしておくと、「妥当性検査」が設定されていても、問題なく更新が行えます。


これで、文書を保存するまでに複数のファイルを添付できるようになります。
実際にWebブラウザでプリビューしてみましょう。
Webブラウザでのプリビュー

どうでしょう?従来のWebアプリケーションでは、埋め込み設計要素のファイルのアップロードをいくつも設定しないと、同時に複数のファイルを添付できませんでしたが、XPagesではこんなに簡単にできるのです。

また、フィールドにバインドすることにより、ノーツクライアントで文書を開いたときに、フォームの欄外ではなく、フィールドのアイテムとして添付ファイルが設定されます。
これも従来のWebアプリケーションから進化したところではないでしょうか。


皆さんも試してみてください。



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