version 2004.2 (Modified)
4D Webサーバは、SEND HTML FILE や SEND HTML BLOBコマンドを使用するなどしてWebサーバから送信されるスタティックなHTMLページに、4D変数や式、あるいは様々なタイプの処理への参照を挿入することを可能にする、4D専用のHTMLタグを提供しています。このようなページはセミダイナミックページと呼ばれます。
これらのタグはHTMLコメントとして挿入されます (<!--#Tag Contents-->)。多くのHTMLエディタがコメントの挿入機能を持っています。
以下の4D HTMLタグを使用できます:
・4DVAR, 4D変数や4D式を挿入する為に使用します。
・4DHTMLVAR, 4DVARと同様ですが、HTMLコードを挿入するために使用します。
・4DSCRIPT, 4Dメソッドを挿入します。
・4DINCLUDE, ページに他のページを挿入するために使用します。
・4DIF, 4DELSE そして 4DENDIF, HTMLコードに条件分岐を挿入するために使用します。
・4DLOOP と 4DENDLOOP, HTMLコードでループを行うために使用します。.
互換性メモ: 4Dバージョン6.0.xでは、スタティックページに4D変数を挿入する記法はブラケットを使用するものでした ([VarName])。変換されたデータベースでは、標準のHTMLシンタックス (<!--#4DVAR VarName-->) を使用するために、“ブラケットの代わりに4DVARコメントを使用する”が環境設定ダイアログでチェックされていることを確認してください(Webサーバ設定の節参照)。
4D HTMLタグについて
4Dが送信するセミダイナミックページの内容解析は、SEND HTML FILE (.htm, .html, .shtm, .shtml) または SEND HTML BLOB (text/html タイプのBLOB) コマンドが呼び出された時、およびURLを使用してページが呼び出されたときに発生します。
しかし非コンテキストモードでは、最適化の目的で、“.htm” と “.html” 拡張子を持つページは解析されません。この場合ページの解析を強制的に行うには、拡張子を “.shtm” または “.shtml” (例えば http://www.server.com/dir/page.shtm) にします。
このタイプのページの例題はWEB CACHE STATISTICS コマンドの説明にあります。
WebブラウザにHTMLページが送信される際に、4Dがタグを解析するケースを以下の表にまとめます:
| 送信条件 | 送信ページの内容解析 | |
| コンテキストモード | 非コンテキストモード | |
| ・ページの拡張子 (通常ケース): | ||
| .htm, .html, .shtm, .shtml (HTMLページ) | ○ | ○ |
| .xml, .xsl (XMLページ) | ○ | ○ |
| .wml (WMLページ) | ○ | ○ |
| ・URLで呼び出されたページ | ○ | ○, 拡張子が“.htm” |
| または “.html” のページを除く | ||
| ・SEND HTML FILE コマンド呼び出し | ○ | ○ |
| ・SEND HTML BLOB コマンド呼び出し | ○ | ○ |
| (BLOBが“text/html”型) | ||
| ・<!--4DINCLUDE --> タグによる挿入 | ○ | ○ |
| ・{mypage.htm} タグによる挿入 | ○ | - |
4Dに処理を行わせるには、HTMLコメントは <!--#4D...--> のフォーマットで記述します。HTMLエディタによっては自動で他の情報をコメントに書き込むことがあることに留意してください。これは動作しないなどの問題を引き起こすことがあります。
しかし他の <!--Beginning of list--> などのHTMLコメントは使用できます。
コメント <!--#4D... が -->で終了していない場合、メッセージ “<!--#4D... : --> が必要です” が挿入され、このレベルで解析が停止します (エラーを示すため、ページが送信される)。
複数のタイプのコメントをミックスできます。例えば以下のHTMLシンタックスが可能です:
<HTML> ... <BODY> <!--#4DSCRIPT/PRE_PROCESS--> (メソッド呼び出し) <!--#4DIF (myvar=1)--> (If 条件) <!--#4DINCLUDE banner1.html--> (サブページ挿入) <!--#4DENDIF--> (End if) <!--#4DIF (myvar=2)--> <!--#4DINCLUDE banner2.html--> <!--#4DENDIF--> <!--#4DLOOP [ーブル]--> (カレントセレクションに基づくループ) <!--#4DIF ([ーブル]ValNum>10)--> (If [ーブル]ValNum>10) <!--#4DINCLUDE subpage.html--> (サブページ挿入) <!--#4DELSE--> (Else) <B>Value: <!--#4DVAR [ーブル]ValNum--></B><BR> (フィールド表示) <!--#4DENDIF--> <!--#4DENDLOOP--> (End for) </BODY> </HTML>
4DVAR
シンタックス: <!--#4DVAR VarName--> または <!--#4DVAR 4DExpression-->
タグ <!--#4DVAR VarName--> を使用して4D変数や式への参照をHTMLページの任意の場所に挿入します。例えば以下のように記述すると:
<P>Welcome to <!--#4DVAR vtSiteName-->!</P>
4D変数 vtSiteName の値がHTMLページに挿入されます。
4Dのテキスト変数にHTMLコードが格納されているとき、その一番目の文字をコード1にすることで (例, vtHTML:=Char(1)+"...HTML code...")、HTMLコードのまま挿入できます。また 4DHTMLVARを使用することもできます。.
4DVARタグ4D HTMLコメントを使用して、変数だけでなく4D式も挿入できます。フィールドの値を直接挿入できますし (例 <!--#4DVAR [tableName]fieldName-->) 、または配列要素の値も挿入できますし (例 <!--#4DVAR arr{1}-->) 、値を返すメソッドも使用できます (<!--#4DVAR mymethod-->)。
式の変換は変数のそれと同じルールが適用されます。さらに式は4Dのシンタックスルールに適合していなければなりません。
Note: 4DVARでの4Dメソッドの実行は、メソッドプロパティの“4DACTION、4DMETHODおよび4DSCRIPTで利用可能”属性の設定に基づきます。詳細は接続セキュリティの節を参照してください。
式に4D関数への呼び出しを直接含めることができますが、これはお勧めしません。例えば <!--#4DVAR Current date--> は英語バージョンの4Dでは正しく解釈されますが、フランス語バージョンの4Dでは解釈されません。同じことが実数値にも言えます (小数点は言語により異なります)。プログラムを使用して変数値を割り当てることを強くお勧めします。
解釈エラーの場合、“<!--#4DVAR myvar--> : ## error # error code”のように表示されます。
Notes:
・プロセス変数を使用できます。
・ピクチャフィールドの内容を表示できます。さらに (コンテキストモードのみ)、ピクチャ変数の内容も表示できます。両モードで、ピクチャ配列の項目は表示できません。
・HTMLはワープロ志向のアプリケーションなので、通常テキスト変数を使用します。しかしBLOB変数を使用することもできます。この場合長さ情報なしのテキストBLOBを生成します。
・4DVARを使用する例題は、4DオブジェクトをHTMLオブジェクトにバインドするにあります。
4DHTMLVAR
シンタックス: <!--#4DHTMLVAR VarName--> または <!--#4DHTMLVAR 4DExpression-->
このタグは、変数や4D式を評価し、ページ中にHTMLソースとして挿入することを可能にします。実際このタグはVarNameがコード1で始まる <!--#4DVAR VarName--> タグと同じに動作します。
例として、4Dテキスト変数myvarを挿入した結果を見てみます:
| myvar 値 | タグ | Webページに挿入されるテキスト |
| myvar:="<B>" | <!--#4DVAR myvar--> | <B> |
| myvar:=Char(1)+"<B>" | <!--#4DVAR myvar--> | <B> |
| myvar:="<B>" | <!--#4DHTMLVAR myvar--> | <B> |
解釈エラーの場合、“<!--#4DHTMLVAR myvar--> : ## error # error code”のように表示されます。
Note: 4DHTMLVARでの4Dメソッドの実行は、メソッドプロパティの“4DACTION、4DMETHODおよび4DSCRIPTで利用可能”属性の設定に基づきます。詳細は接続セキュリティの節を参照してください。
4DSCRIPT/
シンタックス: <!--#4DSCRIPT/MethodName/MyParam-->
4DSCRIPT タグを使用して、スタティックなHTMLページを送信する際に4Dメソッドを実行することを可能にします。<!--#4DSCRIPT/MyMethod/MyParam--> タグがHTMLコメントとしてページに現れると、MyMethodメソッドが$1引数にMyParamを受け取って実行されます。Webページをロードする際、4DはOn Web Authentication データベースメソッドを (存在すれば) 呼び出します。このメソッドがTrueを返すと、4Dはメソッドを実行します。
メソッドは$0にテキストを返します。文字列がコード1から始まっていると、それは HTMLソースとして扱われます (変数のときと同じ原則)。
Note: 4DSCRIPTでの4Dメソッドの実行は、メソッドプロパティの“4DACTION、4DMETHODおよび4DSCRIPTで利用可能”属性の設定に基づきます。詳細は接続セキュリティの節を参照してください。
ページ内容の解析はSEND HTML FILE (.htm, .html, .shtm, .shtml) または SEND HTML BLOB (text/htmlタイプのBLOB) が呼び出されたときに行われます。
非コンテキストモードでは、URLが“.shtm” や “.shtml”拡張子のファイルを指しているときにも解析が行われます (例えば http://www.server.com/dir/page.shtm)。
Note: コンテキストモードでは、メソッドはコンテキスト内で実行されます。
例えば、以下のコメントをスタティックページに挿入したとしましょう “Today is <!--#4DSCRIPT/MYMETH/MYPARAM-->” 。ページをロードする際、4DはOn Web Authentication データベースメソッドを (存在すれば) 呼び出し、そしてMYMETH メソッドの$1引数に文字列 “/MYPARAM” を渡して呼び出します。
メソッドは$0にテキストを返します (例えば “12/31/03”)。コメント “Today is <!--#4DSCRIPT/MYMETH/MYPARAM-->” は結果 “Today is 12/31/03” となります。
MYMETHメソッドは以下のとおりです:
C_TEXT($0) `この引数を常に宣言する C_TEXT($1) `この引数を常に宣言する $0:=String(Current date)
警告: $0 と $1 引数を宣言しなければなりません。
Note: 4DSCRIPTから呼び出されるメソッドはインタフェース要素 (DIALOG, ALERT...) を呼び出してはいけません。
4Dはメソッドを見つけた順に実行するので、ドキュメント中で離れて参照される変数の値を設定するメソッドを呼び出すことも可能です。モードは関係ありません。
Note: スタティックページに必要なだけ <!--#4DSCRIPT...--> コメントを記述できます。
互換性メモ: 以前の4Dバージョンでは、同じタグ4DACTIONをURLとしても (例えばhttp://myserver/4DACTION/meth)、スタティックページ中のHTMLコメント (<!--#4DACTION/meth-->) としても使用できました。4Dバージョン6.7以降では、4DSCRIPTタグで4DACTIONタグが置き換えられました。これはHTMLコメントとしてのみ使用され (<!--#4DSCRIPT/meth-->)、<!--#4DACTION/meth-->と同じ意味を持ちます。4DACTIONはURLで使用されます。
4DINCLUDE
シンタックス: <!--#4DINCLUDE Path-->
このコメントを使用して、 (path 引数で指定された) 他のHTMLページのボディをHTMLページに挿入できます。HTMLページのボディは<BODY>と</BODY>タグの間です (このタグ自身は含まれません)。
<!--#4DINCLUDE --> コメントは、テスト (<!--#4DIF-->) やループ (<!--#4DLOOP-->) と使用するととても便利です。条件に基づきあるいはランダムにタグを含める便利な方法です。
含めるとき、モードや拡張子にかかわらず、4Dは呼び出されたページを解析してから、内容を4DINCLUDE呼び出し元のページに挿入します。
<!--#4DINCLUDE --> コメントで挿入されたページはロードされ、URLで呼ばれてSEND HTML FILE コマンドで送信されたファイルと同じように、Webサーバキャッシュに格納されます。
pathには、含めるドキュメントへのパスを記述します。
Note: PROCESS HTML TAGS コマンドで4DINCLUDEタグを使用する場合、デフォルトフォルダはデータベースストラクチャを含むフォルダです。
警告: 4DINCLUDE呼び出しの場合、パスは解析される親ドキュメントからの相対パスです。フォルダ区切り文字にはスラッシュ (/) を使用し、レベルをさかのぼるには2つのドットを使用します (HTMLシンタックス)。
ページ内の<!--#4DINCLUDE path-->数に制限はありません。しかし<!--#4DINCLUDE path-->の呼び出しは1レベルのみ有効です。つまり、例えばmydoc1.html内の<!--#4DINCLUDE mydoc2.html-->で呼ばれるmydoc2.htmlページのボディに、<!--#4DINCLUDE mydoc3.html--> を含めることはできません。
さらに、4Dは組み込み呼び出しが再帰的でないか確認します。
エラーの場合、“<!--#4DINCLUDE path--> : ドキュメントを開けません”のように表示されます。
Note: コンテキストモードでは、スタティックテキストエリアに記述された{mypage.html}タグでフォームにページが挿入されると、4DINCLUDE コメントがあっても無視されます
例題
<!--#4DINCLUDE subpage.html--> <!--#4DINCLUDE folder/subpage.html--> <!--#4DINCLUDE ../folder/subpage.html-->
4DIF, 4DELSE and 4DENDIF
シンタックス: <!--#4DIF expression--> <!--#4DELSE--> <!--#4DENDIF-->
<!--#4DELSE--> (オプション) と <!--#4DENDIF--> コメントと共に使用することで、<!--#4DIF expression--> コメントはHTMLコードに条件分岐を実行させることを可能にします。
expression 引数はブール値を返す有効な4D式です。式は括弧の中に記述され、4Dのシンタックスルールに準拠していなければなりません。
<!--#4DIF expression--> ... <!--#4DENDIF--> を複数レベルでネストできます。4Dのようにそれぞれの <!--#4DIF expression--> は <!--#4DENDIF-->とマッチしなければなりません。
解釈エラーの場合、<!--#4DIF --> と <!--#4DENDIF-->“の間のコンテンツの代わりに、<!--#4DIF expression-->: ブール式が必要です”が挿入されます。
同様に、<!--#4DIF -->が同じ数の<!--#4DENDIF-->で閉じられていない場合、“<!--#4DIF expression-->: 4DENDIFが必要です” が<!--#4DIF --> と <!--#4DENDIF-->の間のコンテンツの代わりに挿入されます。
例題
スタティックなHTMLページに書かれたこの例題のコードは、vname#"" 式の結果に応じ、異なるラベルを表示します:
<BODY> ... <!--#4DIF (vname#"")--> Names starting with <!--#4DVAR vname-->. <!--#4DELSE--> No name has been found. <!--#4DENDIF--> ... </BODY>
4DLOOP と 4DENDLOOP
シンタックス: <!--#4DLOOP condition--> <!--#4DENDLOOP-->
このコメントを使用して、条件を満たす間、HTMLコードの一部を繰り返すことができます。繰り返し部のコードは<!--#4DLOOP--> と <!--#4DENDLOOP-->で挟まれます。
<!--#4DLOOP condition--> ... <!--#4DENDLOOP--> ブロックはネストできます。4Dと同様、それぞれの<!--#4DLOOP condition--> は同じ数の <!--#4DENDLOOP-->で閉じられていなければなりません。
条件には3種類あります:
・<!--#4DLOOP [テーブル]-->
このシンタックスは、指定されたテーブルのカレントプロセスのカレントセレクションに基づき、レコードごとにループします。2つのコメントの間のHTMLコードはカレントセレクションレコード毎に繰り返されます。
Note: 4DLOOPタグがテーブルを条件として使用されると、レコードが読み込みのみでロードされます。
以下のHTMLコードは:
<!--#4DLOOP [People]--> <!--#4DVAR [People]Name--> <!--#4DVAR [People]Surname--><BR> <!--#4DENDLOOP-->
4Dランゲージで表すと以下のとおりです:
FIRST RECORD([People]) While(Not(End selection([People]))) ... NEXT RECORD([People]) End while
・<!--#4DLOOP 配列-->
このシンタックスは、配列項目ごとにループします。2つのコメントの間のHTMLコードが繰り返されるたびに、配列のカレント項目がインクリメントされます。
Note: このシンタックスで二次元配列を使用することはできません。この場合、ネストしたループでメソッドを条件に使用します。
以下のHTMLコードは:
<!--#4DLOOP arr_names-->
<!--#4DVAR arr_names{arr_names}--><BR>
<!--#4DENDLOOP-->
4Dランゲージで表すと以下のとおりです:
For ($Elem;1;Size of array(arr_names)) arr_names:=$Elem ... End for
・<!--#4DLOOP method-->
このシンタックスでは、メソッドがTrueを返す間ループが行われます。メソッドは倍長整数タイプの引数を受け取ります。まずメソッドは引数0を渡されます。これは (必要に応じて) 初期化ステージとして使用できます。その後、Trueが返されるまで1, 2, 3と渡される引数値がインクリメントされます。
セキュリティのため、On Web Authentication データベースメソッドが初期化ステージ (引数に0が渡されて実行される) の前に一度呼び出されます。認証されると、初期化に進みます。
警告: コンパイルのため、C_BOOLEAN($0) と C_LONGINT($1) が宣言されていなければなりません。
例題
以下のHTMLコードは:
<!--#4DLOOP my_method--> <!--#4DVAR var--> <BR> <!--#4DENDLOOP-->
4Dランゲージで表すと以下のとおりです:
If(AuthenticationWebOK) If(my_method(0)) $counter:=1 While(my_method($counter)) ... $counter:=$counter+1 End while End if End if
my_method は以下のようになります:
C_LONGINT($1) C_BOOLEAN($0) If($1=0) `Initialisation $0:=True Else If($1<50) ... var:= ... $0:=True Else $0:=False `Stops the loop End if End if
解釈エラーの場合、“<!--#4DLOOP expression-->: エラーの説明” が<!--#4DLOOP --> と <!--#4DENDLOOP-->の間のコンテンツの代わりに挿入されます。
以下のメッセージが表示されます:
- 予期しない式のタイプ (標準のエラー);
- テーブル名が正しくありません (テーブル名のエラー);
- 配列が必要です (変数が配列でないか、二次元配列が指定された);
- メソッドが存在しません;
- シンタックスエラー (メソッド実行時);
- アクセス権エラー (テーブルやメソッドにアクセスする権限がない)。
- 4DENDLOOP が必要です (<!--#4DLOOP -->が対応する<!--#4DENDLOOP-->で閉じられていない)。
参照
4DオブジェクトをHTMLオブジェクトにバインドする, URLとフォームアクション, コンテキストモードの利用.