4D v164D 変換タグ |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v16
4D 変換タグ
4D 変換タグ
4Dでは、参照を4D変数や式に挿入したり、異なる種類の処理をソーステキストに対して実行したりするための変換タグのセットを用意しています。これは別名 ”テンプレート” とも呼ばれます。これらのタグはソーステキストが実行されてアウトプットテキストが生成されたときに解釈されます。 これらの原理は特に4D Web サーバーにおいてセミダイナミックページ を生成するのに使用されます。 これらのタグは原則としてHTMLコメント(<!--#Tag Contents--> )として挿入されます。しかしながら、 <!--Beginning of list--> などの他のコメントも使用可能です。複数のタイプのタグを混用することも可能です。例えば、以下のHTML構造は、何の問題もなく実行可能です:
<HTML> ... <BODY> <!--#4DSCRIPT/PRE_PROCESS--> (メソッド呼び出し) <!--#4DIF (myvar=1)--> (If 条件) <!--#4DINCLUDE banner1.html--> (サブページ挿入) <!--#4DENDIF--> (End if) <!--#4DIF (mtvar=2)--> <!--#4DINCLUDE banner2.html--> <!--#4DENDIF--> <!--#4DLOOP [TABLE]--> (カレントセレクションでのループ) <!--#4DIF ([TABLE]ValNum>10)--> (If [TABLE]ValNum>10) <!--#4DINCLUDE subpage.html--> (サブページの挿入) <!--#4DELSE--> (Else) <B>Value: <!--#4DTEXT [TABLE]ValNum--></B><BR> (フィールド表示) <!--#4DENDIF--> <!--#4DENDLOOP--> (End for) </BODY> </HTML> "テンプレート"ページの中身のパースには、二通りのやり方があります:
以下の表は、利用可能な4D 変換タグの一覧です。詳細については、その先のタグの詳細を参照して下さい。
(*)原則としてタグはHTML コメント(<!--#Tag Content-->)としてソーステキストに挿入します。値を返すタグにおいては特定の条件下において、XMLに準拠するための代替手段として$ 記号を使用したシンタックスを使用することができます。詳細な情報については、以下の4DTEXT、4DHTML、4DEVALにおける代替シンタックス を参照して下さい。 4DTEXT、4DHTML、4DEVAL、4DSCRIPT、4DIF、4DELSEIF あるいは 4DLOOP で4D メソッドをWeb リクエスト経由で実行の可否は、メソッドのプロパティ内で定義されている"4DタグとURL(4DACTION...)"属性の値によります。メソッドにおいてその属性がチェックされていない場合、そのメソッドはWebリクエスト経由で実行することはできません。この点についての詳細な情報については、接続セキュリティ の章を参照して下さい。 4D タグは繰り返し解釈されます。4Dは常に変換の結果を解釈しようとし、新しい変換が起きた際にはそれに伴い新しく解釈が実行され、取得した結果がこれ以上変換の必要がなくなるまで繰り返されます。例えば、以下のような宣言があった場合: <!--#4DHTML [Mail]Letter_type--> もし[Mail]Letter_type テキストフィールドにタグ(例えば<!--#4DSCRIPT/m_Gender--> など)が含まれていた場合、このタグは4DHTMLタグの解釈の後、それに伴って評価されます。 この強力な原則はテキスト変換に関連するほとんどの需要を満たすことができます。しかしながら、これは場合によっては悪意のあるコードの侵入を許す可能性があるという点に注意が必要です。この点についてのより詳細な情報は、以下の章を参照ください。 4D変換タグは様々なタイプのデータを引数として受け入れます。テキスト、変数、メソッド、コマンド名、etc...。これらのデータが自分で書いたコードから提供される場合、そのインプットを自分でコントロールできるので、悪意あるコードの侵入のリスクは無いと言っていいでしょう。しかしながら、 データベースのコード扱うデータは、多くの場合外部ソース(ユーザー入力、読み込み、等)を通じて導入されたものです。 4D のバージョンや言語に関係なく、タグ経由で式の評価が正確に行われることを確実にするため、バージョン間で名前が変わりうる要素(コマンド、テーブル、フィールド、定数)については、トークンシンタックスを使用することが推奨されます。例えば、コマンドを挿入するためには、"Current time:C178"と入力します。この点の詳細については、フォーミュラ内でのトークンの使用 の章を参照して下さい。 v15 R4以降、4DTEXT、4DVAR、4DHTML、4DHTMLVAR、および4DEVAL(に加えて、旧4DVAR および 4DHTMLVAR )の4D タグを使って数値表現を評価する際には、4Dは常にピリオド文字(.)を小数点として採用します。今後、これに関するリージョン設定は無視される点に留意ください。 この機能により、4Dの言語設定とバージョンが異なっていてもメンテナンスが容易となり互換性が保たれます。 例えば、以下のコードはリージョン設定に関わらず使用可能です: value:=10/4 互換性に関する注意: 以前のバージョンから変換したご自身のコードが、4D タグによる数値表現の評価においてリージョン設定を遵守している場合、Stringコマンドを使用してそのコードを適応させる必要があります:
シンタックス: <!--#4DTEXT VarName--> または <!--#4DTEXT 4DExpression--> 代替シンタックス: $4DTEXT(VarName) または $4DTEXT(4DExpression) ( 4DTEXT、4DHTML、4DEVALにおける代替シンタックス 参照)
タグ <!--#4DTEXT VarName--> を使用して4D変数や値を返す式への参照を挿入します。例えば(HTMLページ内にて)以下のように記述すると: <P>Welcome to <!--#4DTEXT vtSiteName-->!</P> 4D変数 vtSiteName の値がHTMLページに送信時に挿入されます。値はテキストとして挿入されます。">"のようなHTMLの特殊文字は、自動的にエスケープされます。 4DTEXT タグを使用して、変数だけでなく4D式も挿入できます。フィールドの値を直接挿入できますし (例 <!--#4DTEXT [tableName]fieldName-->) 、または配列要素の値も挿入できますし (例 <!--#4DTEXT tabarr{1}-->) 、値を返すメソッドも使用できます (<!--#4DTEXT mymethod-->)。 式の変換は変数のそれと同じルールが適用されます。さらに式は4Dのシンタックスルールに適合していなければなりません。 解釈エラーの場合、“<!--#4DTEXT myvar--> : ## error # error code” のように表示されます。
注:
シンタックス: <!--#4DHTML VarName--> または <!--#4DHTML 4DExpression--> 代替シンタックス: $4DHTML(VarName) または $4DHTML(4DExpression) (4DTEXT、4DHTML、4DEVALにおける代替シンタックスを参照して下さい) 4DTEXT タグ同様、この4DHTMLタグを使用すると、変数や値を返す4D式をHTML式として挿入できます。一方4DTEXT タグとは異なり、このタグはHTML特殊文字(例: ">")をエスケープしません。 例えば4Dのテキスト変数 myvar を4Dタグを使用して処理した結果は以下の様になります:
解釈エラーの場合、“<!--#4DHTML myvar--> : ## エラー # エラーコード”のように表示されます。 注: セキュリティ上の理由から、悪意あるコードの侵入・挿入を防ぐために、アプリケーション外から導入されたデータを処理するときには4DTEXT タグを使用する事が推奨されます(後述の使用上の注意の章を参照ください)。 シンタックス: <!--#4DEVAL VarName--> または <!--#4DEVAL 4DExpression--> 4DEVAL タグを使用すると、変数や4D式を挿入できます。既存の4DHTMLタグのように、4DEVALタグはテキストを返す際にHTML特殊文字をエスケープしません。しかしながら、4DHTMLや4DTEXTと異なり、4DEVALは有効な4D宣言であればどれでも実行することができます(値を返さない割り当てや式も含まれます)。 例えば、以下の様なコードを実行することができます: $input:="<!--#4DEVAL a:=42-->" //割り当て 解釈エラーの場合、“<!--#4DEVAL expr--> : ## エラー # エラーコード”のように表示されます。 注: セキュリティ上の理由から、悪意あるコードの侵入・挿入を防ぐために、アプリケーション外から導入されたデータを処理するときには4DTEXT タグの使用が推奨されます (後述の使用上の注意の章を参照ください)。 シンタックス: <!--#4DSCRIPT/MethodName/MyParam--> 4DSCRIPT タグを使用して、スタティックなHTMLページを処理する際に4Dメソッドを実行することを可能にします。<!--#4DSCRIPT/MyMethod/MyParam--> タグがHTMLコメントとしてページに現れると、MyMethodメソッドが$1引数に Param を受け取って実行されます。 注: タグがWebプロセスのコンテキストにおいて呼び出された場合、Webページがロードされると、4Dは On Web Authenticationデータベースメソッド を (存在すれば) 呼び出します。このメソッドがTrueを返すと、4Dはメソッドを実行します。 メソッドは$0にテキストを返す必要があります。文字列がコード1から始まっていると、それは HTMLソースとして扱われます (4DHTMLのときと同じ原則)。
例えば、以下のコメントをセミダイナミックWebページに挿入したとしましょう “Today is <!--#4DSCRIPT/MYMETH/MYPARAM-->” 。ページをロードする際、4Dは On Web Authenticationデータベースメソッド を (存在すれば) 呼び出し、そして MYMETH メソッドの$1引数に文字列 “/MYPARAM” を渡して呼び出します。 メソッドは$0にテキストを返します (例えば “14/12/31”)。コメント “Today is <!--#4DSCRIPT/MYMETH/MYPARAM-->” は結果 “Today is 14/12/31” となります。 MYMETHメソッドは以下のとおりです: //MYMETH 注: 4DSCRIPTから呼び出されるメソッドはインタフェース要素 (DIALOG, ALERT...) 等を呼び出してはいけません。 4Dはメソッドを見つけた順に実行するので、ドキュメント中で離れて参照される変数の値を設定するメソッドを呼び出すことも可能です。モードは関係ありません。テンプレートには必要なだけ <!--#4DSCRIPT...--> コメントを記述できます。 シンタックス: <!--#4DINCLUDE Path--> このタグは主に、このコメントを使用して、(path引数で指定された) 他のHTMLページを、これから送信するHTMLに含めるためにデザインされました。デフォルトでHTMLのボディー部、つまり<body> と</body>タグの間の内容だけが統合されます (bodyタグは含まれません)。これによりヘッダーに含まれるメタタグ関連の衝突が回避されます。しかしpathで指定されたHTML中に<body></body>タグが含まれない場合、ページ全体が統合されます。この場合メタタグの整合性を管理するのは開発者の役割です。 <!--#4DINCLUDE --> コメントは、テスト (<!--#4DIF-->) やループ (<!--#4DLOOP-->) と使用するととても便利です。条件に基づきあるいはランダムにタグを含める便利な方法です。 <!--#4DINCLUDE --> コメントで挿入されたページはロードされ、URLで呼ばれたページやWEB SEND FILEコマンドで送信されたページと同じように、Webサーバーキャッシュに格納されます。 pathには、含めるドキュメントへのパスを記述します。 警告: 4DINCLUDE呼び出しの場合、パスは解析される親ドキュメントを起点とした相対パスです。フォルダ区切り文字にはスラッシュ (/) を使用し、レベルをさかのぼるには2つのドットを使用します (HTMLシンタックス)。 注:
ページ内で使用できる<!--#4DINCLUDE path-->数に制限はありません。しかし<!--#4DINCLUDE path-->の呼び出しは1レベルのみ有効です。つまり、例えばmydoc1.html内の<!--#4DINCLUDE mydoc2.html-->で呼ばれるmydoc2.htmlページのボディに、<!--#4DINCLUDE mydoc3.html--> を入れ子にすることはできません。 さらに、4Dはインクルードが再帰的かどうかを確認します。 エラーの場合、“<!--#4DINCLUDE path--> : ドキュメントを開けません”のように表示されます。 例題
シンタックス: <!--#4DBASE folderPath--> <!--#4DBASE --> タグは<!--#4DINCLUDE-->タグで使用されるワーキングディレクトリを指定します。 folderPath 引数には現在のページに対する相対パスを指定し、パスは"/"で終わっていなければなりません。指定するフォルダーはWebフォルダー内になければなりません。 4D v12では以下のように各呼び出しごとに相対パスをしていなければなりませんでした: <!--#4DINCLUDE subpage.html--> <!--#4DINCLUDE folder/subpage1.html--> <!--#4DINCLUDE folder/subpage2.html--> <!--#4DINCLUDE folder/subpage3.html--> <!--#4DINCLUDE ../folder/subpage.html--> <!--#4DBASE --> タグを使用すれば以下のように記述できます: <!--#4DINCLUDE subpage.html--> <!--#4DBASE folder/--> <!--#4DINCLUDE subpage1.html--> <!--#4DINCLUDE subpage2.html--> <!--#4DINCLUDE subpage3.html--> <!--#4DBASE ../folder/--> <!--#4DINCLUDE subpage.html--> <!--#4DBASE WEBFOLDER--> <!--#4DBASE --> タグを使用してホームページのディレクトリを設定する: /* Index.html */ <!--#4DIF LangFR=True--> <!--#4DBASE FR/--> <!--#4DELSE--> <!--#4DBASE US/--> <!--#4DENDIF--> <!--#4DINCLUDE head.html--> <!--#4DINCLUDE body.html--> <!--#4DINCLUDE footer.html--> head.html ファイル内でカレントフォルダーが<!--#4DBASE -->を使用して変更されているが、index.html内では変更されない: /* Head.htm */ /* ここでのワーキングディレクトリはインクルードされるファイルに対して相対的 (FR/ または US/) */ <!--#4DBASE Styles/--> <!--#4DINCLUDE main.css--> <!--#4DINCLUDE product.css--> <!--#4DBASE Scripts/--> <!--#4DINCLUDE main.js--> <!--#4DINCLUDE product.js--> 4DCODEタグを使用すると、テンプレートに複数行の4Dコードのブロックを挿入する事ができます。 "<!--#4DCODE" シークエンスとそれに続くスペース、CRまたはLF文字が検知されると、4Dは次の"-->"シークエンスまでのコードを解釈します。コードブロック自体はキャリッジリターンもラインフィードも、あるいはその両方も含む事ができ、4Dによってシーケンシャルに解釈されます。 例えば、4DCODEタグを使用して、以下のようにテンプレート内に書く事ができます: <!--#4DCODE 注: 4DCODEタグ内では、4Dコードは必ずEnglish-US言語で書かれている必要があります。そのため、4DCODEは4Dランゲージの"リージョナルシステム設定を使用"のユーザー設定を無視します(コマンドと定数のためのランゲージを参照して下さい)。 4DCODEタグの機能は以下の通りです:
セキュリティに関する注意: 4DCODEタグがどのような4Dランゲージコマンドあるいはプロジェクトメソッドでも呼び出せると言う事実は、特にデータベースがHTTP経由で使用可能な場合等に、セキュリティ上の問題になり得ます。しかしながら、タグはサーバー側でのコードをテンプレートファイルから実行するため、タグそのものはセキュリティ上の問題にはなりません。このようなコンテキストにおいては、どのようなWebサーバーと同様、セキュリティは主にサーバーファイルへのリモートアクセスレベルにおいて管理されています。 シンタックス: <!--#4DIF expression--> {<!--#4DELSEIF expression2-->...<!--#4DELSEIF expressionN-->} {<!--#4DELSE-->} <!--#4DENDIF--> expression 引数はブール値を返す有効な4D式です。式は括弧の中に記述され、4Dのシンタックスルールに準拠していなければなりません。 <!--#4DIF expression--> ... <!--#4DENDIF--> を複数レベルでネストできます。4Dのようにそれぞれの <!--#4DIF expression--> は <!--#4DENDIF-->とマッチしなければなりません。 解釈エラーの場合、<!--#4DIF --> と <!--#4DENDIF-->“の間のコンテンツの代わりに、<!--#4DIF expression-->: ブール式が必要です”が挿入されます。 同様に、<!--#4DIF -->が同じ数の<!--#4DENDIF-->で閉じられていない場合、“<!--#4DIF expression-->: 4DENDIFが必要です” が<!--#4DIF --> と <!--#4DENDIF-->の間のコンテンツの代わりに挿入されます。 <!--#4DELSEIF--> タグを使用すると、条件テストの記述が容易になります。最初にTrueと判定されたブロック内にあるコードだけが実行されます。Trueブロックがない場合、文は実行されません (<!--#4DELSE-->がなければ)。 以下の2つのコードは同等です
スタティックなHTMLページに書かれたこの例題のコードは、vname#"" 式の結果に応じ、異なるラベルを表示します: <BODY> ... <!--#4DIF vname#""--> Names starting with <!--#4DVAR vname-->. <!--#4DELSE--> No name has been found. <!--#4DENDIF--> ... </BODY> この例題は接続したユーザーに基づき異なるページを返します: <!--#4DIF LoggedIn=False--> <!--#4DINCLUDE Login.htm --> <!--#4DELSEIF User="Admin"--> <!--#4DINCLUDE AdminPanel.htm --> <!--#4DELSEIF User="Manager"--> <!--#4DINCLUDE SalesDashboard.htm --> <!--#4DELSE--> <!--#4DINCLUDE ItemList.htm --> <!--#4DENDIF--> シンタックス: <!--#4DLOOP condition--> <!--#4DENDLOOP-->
<!--#4DLOOP condition--> ... <!--#4DENDLOOP--> ブロックはネストできます。4Dと同様、それぞれの<!--#4DLOOP condition--> は同じ数の <!--#4DENDLOOP-->で閉じられていなければなりません。 条件には5種類あります:
以下のコードは: <!--#4DLOOP my_method--> <!--#4DTEXT var--> <BR> <!--#4DENDLOOP--> 4Dランゲージで表すと以下のとおりです: FIRST RECORD([People])
注: このシンタックスで二次元配列を使用することはできません。この場合、ネストしたループでメソッドを条件に使用します。 以下のコードは: <!--#4DLOOP arr_names--> <!--#4DTEXT arr_names{arr_names}--><BR> <!--#4DENDLOOP--> 4Dランゲージで表すと以下のとおりです: For($Elem;1;Size of array(arr_names))
警告: コンパイルのため、C_BOOLEAN($0) とC_LONGINT($1) が宣言されていなければなりません。 例題以下のコードは: <!--#4DLOOP my_method--> <!--#4DTEXT var--> <BR> <!--#4DENDLOOP--> 4Dランゲージで表すと以下のとおりです: If(AuthenticationWebOK) my_method は以下のようになります: C_LONGINT($1)
<!--#4DEVAL $i:=0--> <!--#4DLOOP ($i<4)--> <!--#4DEVAL $i--> <!--#4DEVAL $i:=$i+1--> <!--#4DENDLOOP-->
0
ARRAY TEXT($array;2) 解釈エラーの場合、“<!--#4DLOOP expression-->: エラーの説明” が<!--#4DLOOP --> と <!--#4DENDLOOP-->の間のコンテンツの代わりに挿入されます。 以下のメッセージが表示されます: いくつかの既存の4D変換タグは、$-ベースのシンタックスを使用して表現する事ができます: この代替シンタックスは、処理後の値を返すタグにおいてのみ使用可能です:
(その他のタグ、例えば4DIFや4DSCRIPTなどでは、通常のシンタックスを使用して書かなければなりません)。 例えば、以下のようなコードを: <!--#4DEVAL(UserName)--> このような表記で置き換える事ができます: $4DEVAL(UserName) このシンタックスの主な利点としては、XML準拠のテンプレートを書く事ができるという点です。一部の4Dデベロッパーは、XML準拠のテンプレートを標準のXMLパーサーツールを使用して評価する必要があります。"<"文字はXML属性値としては無効なため、ドキュメントのシンタックスを破らずに4Dタグの"<!-- -->"シンタックスを使用する事はできませんでした。その一方で、"<"文字をエスケープしてしまうと、4Dがタグを正常に解釈できなくなってしまいます。 例えば、以下のコードは属性値の最初の"<"文字のためにXMLパースエラーを引き起こします: <line x1="<!--#4DEVAL $x-->" y1="<!--#4DEVAL $graphY1-->"/> $シンタックスを使用すると、パーサーによって以下のコードが評価されます: <line x1="" y1=""/> ここで、$4dtag と <--#4dtag --> は厳密には同じではないという点に注意して下さい。<--#4dtag -->とは異なり、$4dtagは4Dタグを繰り返し解釈する事はしません。$タグは常に一度だけ解釈され、その結果は標準テキストとして読まれます。 注: 繰り返し処理については、再起的処理の段落を参照して下さい。 この違いの理由は、悪意あるコードの侵入を防ぐためにあります。以下に説明されているように、ユーザーテキストを使用していてタグの不要な繰り返し処理を避けるためには、4DHTMLタグではなく4DTEXTタグの使用が強く推奨されます。4DTEXTを使用した場合、"<"などの特殊記号はエスケープされてしまうため、<!--#4dtag expression --> シンタックスを使用している4Dタグは全て元の意味を失ってしまいます。しかしながら4DTEXTは$記号はエスケープしないので、悪意あるコードの侵入を防ぐために$4dtag (expression) シンタックスにおける繰り返し解釈のサポートを取りやめる事にしました。 以下の例では、使用されるシンタックスとタグによる処理の結果の違いを表しています: // 例 1 // 例 2 // 例 3 シンタックスでは合致した引用符や括弧を閉じる事をサポートしているという点に注意して下さい。例えば、以下の(非現実的な)文字列を評価しなければならない場合: String(1) + "\"(hello)\"" 以下のように書く事ができます: input:="$4DEVAL( String(1)+\"\\\"(hello)\\\"\")"
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||