[ホーム] > [ノーツドキュメントセンター] > [Louts Notes Webアプリケーションテクニック集]
Copyright(C) TOOLJP.COM
このページではロータスノーツで Web アプリケーションを作成する際のテクニックに関して説明します。
1.JAVASCRIPTからノーツのフィールドを参照する
2.保存後に更新された文書を表示する
3.Input Validation をカスタマイズする
4.全文検索をフィールドを指定して行う
5.現在の文書を削除する
6.文書をフレームを指定して表示する
7.メッセージをカスタマイズする
8.一度保存した文書を二度保存させない
9.匿名アクセスを許可する
10.自動生成される <Body> </Body>を無効にする
11.ページカウンタを作成する
12.@URLOpenにより JAVASCRIPTを直接呼び出す
13.ドミノからアクセス可能なCGI変数
14.ビューの列にHTMLを使用する
15.フィールドにイベントを追加する
16.文書削除時に警告を出す
17 認証ダイアログを表示する
18 ページ生成時にJavaスクリプトを使用
19 ドミノでクッキー(cookie)を使用する
20 すべてのフィールドでHTMLを生成する(R5)
JAVASCRIPTからは、ノーツのフィールドは FORM上のフィールドとして認識されます。
例えば
document.forms[0].Field1.value = "test"
はノーツの Field1フィールドに値 "test"を入れます。
チェックボックスやラジオボタンは配列として扱われます。
フォームの保存後にブラウザの「戻る」ボタンで前のページに移動しても、保存前の文書が表示されてしまいます。よって保存時に計算されたフィールドの値などが反映されていません。この場合$$Returnフィールドを作成し、以下の値を入れます。保存後に「最新文書の表示」ハイパーリンクをクリックすれば保存後の計算済みの文書が表示されます。
Path := @LeftBack(@ReplaceSubstring(@Subset(@DbName; -1);"\\";"/");"/");
"<html> <body> <p>保存されました。</p> <p><a
href=\"/"+Path+"/test.nsf/$defaultview/"+ @Text(@DocumentUniqueID)+"\">最新文書の表示</a></p>
<p> </p> </body> </html>"
デフォルトでは、Input Validationで@Failureを使用してエラーを返した場合、ブラウザにはどのフィールドがエラーなのかはクライアントには表示されません。以下のようにフィールドごとにInput Validationをカスタマイズすれば、どのフィールドにエラーが発生したかブラウザに送信されます。
@If(field1="";@Failure("フィールド1が未入力です。<P><A HREF = \"JavaScript:window.history.go(-1)\">戻る</A>");@Success)
全文検索を行う場合には、以下のように contains を使用してクエリーを構築すれば、フィールドを指定して検索を行うことができます。containsはノーツクライアントの全文検索でも使用することができます。contains は and を使用すれば複数のフィールドを指定して検索できます。ただしR4.6では、ブラウザを使用する場合にはフィールド名が日本語だと正常に動作しないようです。
以下の例では 検索対象フィールドにfield1を指定し、form上の searchstr テキストボックスの値を使用して検索します。
document.forms[0].Query.value=\'[field1]+contains+\' + document.forms[0].searchstr.value}
ちなみにデフォルトの全文検索フォームを変更するには 新規に$$SearchFormを作成します。
アクションを作成し、式に
@Command([EditClear])
と書きます。ブラウザからアクションをクリックすると、現在の文書が削除されます。
以下のように @urlopen内で targetを使用すれば任意のフレームを対象に文書を起動します。以下の例では文書を別のブラウザを新たに起動して表示します。
@urlopen("http://www.test.co.jp\" target=_blank)
これは
<A HREF="http://www.test.co.jp" target="_blank">
と変換されます。
以下のフォームを新規に作成すれば、自動的にメッセージが適用されます
$$ReturnDocumentDeleted | 文書が削除された場合 |
$$ReturnAuthenticationFailure | ユーザ名、あるいはパスワードに誤りがある場合 |
$$ReturnAuthorizationFailure | ユーザがアクセス権をもっていない場合 |
$$ReturnGeneralError | 一般的なエラーが発生した場合 |
保存時のメッセージを変更するには、それぞれのフォームに$$Returnフィールドを作成し、その中に HTML形式でメッセージを書きます。
文書(フォーム)を保存後(送信後)、ブラウザの戻るボタンなどで戻った後に再び保存(送信)を行うと、2重に保存されてしまいます。以下のタグを $$HTMLHead
フィールドに記述すれば、保存時にフォーム内のフィールドの値が消去されます。
"<META HTTP-EQUIV=\"expires\" content=\"Wednesday,
27-Oct-98 12:00:00 GMT\"><META HTTP-EQUIV=\"Pragma\"
CONTENT=\"no_cache\">"
ACLにユーザ"Anonymous"を作成し権限を与えると、ブラウザから公開アドレス帳に登録されていないユーザーでもアクセスが可能となります。この設定を行わずにブラウザからアクセスを行うと、ユーザはユーザ名とパスワードの入力を求められます。
(関連事項: 17.認証ダイアログを表示する)
10.自動生成される <Body> </Body>を無効にする
ドミノでは、フォームの背景の色などをもとに、Body タグを自動生成します。これを無効にするには以下の2点を行います。
・$$HTMLField フィールドを作成し、先頭に "<!--"を記述します。
・$$HTMLField フィールドのすぐ後に "--> </Head>" を記述します。
これで ドミノが生成した Body タグを<!-- -->で囲うことになり、Bodyタグが無効になります。
ページカウンタを作成するには、適当なフィールドを作成し(計算結果)以下の式を記述します。
profilename := "AccessCounter";
docid := @Text(@DocumentUniqueID);
count := @GetProfileField(profilename; "count"+docid);
@If(count="";@Set("count";1);@Set("count";
count+1));
@SetProfileField(profilename; "count"+docid; count);
"このページは" + @Text(count)+"回アクセスされました。"
カウント数が表示されるページはいつも同じなので、文書IDを利用してプロファイルへ一意のカウンタ数を書き込んでいるのがポイントです。
12.@URLOpenにより JAVASCRIPTを直接呼び出す
@URLOpenの引数として以下のようにJAVASCRIPTを記述すれば、JAVASCRIPTを呼び出すことが可能です。以下の例では $$HTMLField フィールド内で定義された関数 Updateを@URLOpenにより呼び出しています。
(1)アクションボタンに以下を記述
@URLOpen("JavaScript:Update()")
(2)フォーム内の$$HTMLFieldに以下を記述
"<script language=\"JavaScript\"> function Update()
{ location.reload() ;} </script>"
以下のCGI変数は、ドミノからフィールドやスクリプトエージェントを通してアクセスすることができます。
CGI 変数 | 説明 |
Auth_Type | 認証のタイプ |
Content_Length | クライアントから送信されたデータの長さ |
Content_Type | データのタイプ (POST PUT など) |
Gateway_Interface | CGIのバージョン |
HTTP_Accept | クライアントで使用可能なMIME タイプ |
HTTP_Referer | クライアントがページにアクセスするのに使用したページのURL |
HTTPS | サーバがSSLモードかどうかを表す値 |
HTTP_User_Agent | クライアントのブラウザの種類 |
Path_Info | サーバによって追加された、ルートからファイルへのパス |
Path_Translated | サーバによって変換されたPath_Info |
Query_String | スクリプトを参照するURLの ? 以下の内容 |
Remote_Addr | クライアントの IP アドレス |
Remote_Host | クライアントのホスト名 |
Remote_Ident | サーバから送信されたユーザ名 |
Remote_User | 認証に使用されたユーザ名 |
Request_Method | リクエストに利用された方法で、 GET,HEAD,POST など |
Script_Name | 実行されたスクリプトの仮想パス |
Server_Name | URL内のサーバ名 |
Server_Protocol | 使用されたプロトコル |
Server_Port | 使用されたポート |
Server_Software | サーバのソフト名 |
Server_URL_Gateway_Interface | CGIのバージョン |
HTTP_COOKIE | ブラウザからサーバへ送られたCOOKIE |
ビューの列にHTMLを使用することができます。以下の例では date が 一週間以内の文書に対して new.gifを表示します。
@If( @Today<@Adjust(date;0;0;8;0;0;0) ; "[<IMG SRC = /gifs/new.gif BORDER=0>]";"")
ノーツのフィールドに "OnClick"などのイベントを追加することができます。フィールドの属性である "HTML Attributes"にイベントを追加すればHTMLに変換されるさいにフィールドに対してイベントが追加されます。例えば以下のようにチェックボックスフィールドの "HTML Attributes"に記述すると、ブラウザからチェックボックスをクリックするたびに、JavaScriptで別途定義された関数 "AlertUser"が呼びだされます。
"onClick=\"AlertUser()\""
文書を削除する機能を追加するには、アクションを追加しその式として @command([editclear])を記述すればよいのですが、これではユーザに警告なしに文書が削除されてしまいます。警告付きの削除アクションを作成するには以下の方法で行います。
まずパススルーHTMLを使用して、関数 "deldoc"を定義します。
delconfirm フィールドの式は以下のとおりに記述します。
Path := @LeftBack(@ReplaceSubstring(@Subset(@DbName; -1);"\\";"/");"/");
path+"/test.nsf/$defaultview/"+@Text(@DocumentUniqueID)+"?DeleteDocument"
この例では、データベース名が test.nsfになっていますので、使用中のデータベースに変更する必要があります。また削除する文書がデフォルトのビューに表示されている必要があります。(逆にいうと、文書を削除する目的で、デフォルトのビューを設定してください)
次に、文書削除用のアクションを作成します。式には以下のとおり記述します。
@URLOpen("JAVASCRIPT:deldoc()")
以上でブラウザより文書削除用のアクションをクリックすれば、現在の文書が削除されます。
17 認証ダイアログを表示する
ACLの設定で -default-のアクセス権を"なし"に設定すると、ブラウザからアクセスするたびに、ブラウザに対してユーザ名、パスワードの入力をもとめるダイアログが表示されます。ダイアログが表示されない、あるいは認証されない場合には、以下の事項を確認してください。
(1)-default- のパブリック文書(読者),パブリック文書(作成者) チェックがそれぞれオフになっていること。
(2)ログインするユーザに関して、公開アドレス帳でインターネットパスワードの設定が行われていること。
18 ページ生成時にJavaスクリプトを使用
データベースのプロパティの「基本」タグにある「ページ生成時にJavaスクリプトを使用」チェックボックスをオンにすると、フォーム上のすべてのボタンがHTMLに変換されます。(R4.6以降のみ。
このチェックボックスは以前のバージョンと互換をとるために、デフォルトではオフになっています。)
このボタンがオンにすることにより、式内の関数が実行されます。例えば、
FIELD test:="test";
test
と指定しておけば、わざわざ JavaScriptを使用することなく、フィールド値を変更することが可能です。
なおボタン内の@関数はサーバ上で実行されますが、 Webに対応していない@関数(@promptなど)は変換されません。また以前のバージョンでサポートされていなかった以下の@関数がサポートされるようになります。
@Command([ViewRefreshFields])
@Command([FileSave])
@Command([FileCloseWindow]) (ビューに戻ります。)
ただしこのチェックボックスをオンにした場合には、「送信」ボタンが自動生成されないため、あらたに追加する必要があります。
<削除>
計算結果フィールドや非表示フィールド等はブラウザ上で見るとテキストボックスとして生成されない場合があります。よってJavaScript等でこれらの値を使用して計算する場合、正常に動作しない場合があります。R5から「すべてのフィールドでHTMLを生成する」のオプションをオンにすると、すべてフィールドがHTMLとして生成されます。