4D v15.44D 変換タグ |
|||||||||||
|
4D v15.4
4D 変換タグ
|
myvar 値 | タグ | Webページに挿入されるテキスト |
myvar:="<B>" | <!--#4DTEXT myvar--> | <B> |
myvar:="<B>" | <!--#4DHTML myvar--> | <B> |
使用する4Dランゲージやバージョンに関係なく式が正常に評価される事を保証するためには、異なるバージョン間で名前が変化する可能性のある要素(コマンド、テーブル、フィールド、定数)に対してトークンシンタックスを使用することが推奨されます。例えば、[#cmd id="178"/]コマンドを挿入するためには、'Current time:C178' と入力します。この点の詳細な情報に付いては、フォーミュラ内でのトークンの使用を参照して下さい。
解釈エラーの場合、“<!--#4DHTML myvar--> : ## エラー # エラーコード”のように表示されます。
注:
シンタックス: <!--#4DEVAL VarName--> または <!--#4DEVAL 4DExpression-->
4DEVALタグを使用すると、変数や4D式を挿入できます。既存の4DHTMLタグのように、4DEVALタグはテキストを返す際にHTML特殊文字をエスケープしません。しかしながら、4DHTMLや4DTEXTと異なり、4DEVALは有効な4D宣言であればどれでも実行することができます(値を返さない割り当てや式も含まれます)。
例えば、以下の様なコードを実行することができます:
$input:="<!--#4DEVAL a:=42-->" //割り当て
$input:=$input+"<!--#4DEVAL a+1-->" //計算
PROCESS 4D TAGS($input;$output)
//$output = "43"
使用する4Dランゲージやバージョンに関係なく式が正常に評価される事を保証するためには、異なるバージョン間で名前が変化する可能性のある要素(コマンド、テーブル、フィールド、定数)に対してトークンシンタックスを使用することが推奨されます。例えば、[#cmd id="178"/]コマンドを挿入するためには、'Current time:C178' と入力します。この点の詳細な情報に付いては、フォーミュラ内でのトークンの使用を参照して下さい。
解釈エラーの場合、“<!--#4DEVAL expr--> : ## エラー # エラーコード”のように表示されます。
注:
シンタックス: <!--#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メソッドは以下のとおりです:
C_TEXT($0)\\This parameter must always be declared
C_TEXT($1)\\This parameter must always be declared
$0:=String(Current date)
警告: $0 と $1 引数を宣言しなければなりません。
注: 4DSCRIPTから呼び出されるメソッドはインタフェース要素 (DIALOG, ALERT...) を呼び出してはいけません。
4Dはメソッドを見つけた順に実行するので、ドキュメント中で離れて参照される変数の値を設定するメソッドを呼び出すことも可能です。モードは関係ありません。テンプレートには必要なだけ <!--#4DSCRIPT...--> コメントを記述できます。
シンタックス: <!--#4DINCLUDE Path-->
このタグは主に、このコメントを使用して、(path引数で指定された) 他のHTMLページを、これから送信するHTMLに含めるためにデザインされました。デフォルトでHTMLのボディー部、つまり<body> と</body>タグの間の内容だけが統合されます (bodyタグは含められません)。これによりヘッダーに含まれるメタタグ関連の衝突が回避されます。しかしpathで指定されたHTML中に<body></body>タグが含まれない場合、ページ全体が統合されます。この場合メタタグの整合性を管理するのは開発者の役割です。<!--#4DINCLUDE --> コメントは、テスト (<!--#4DIF-->) やループ (<!--#4DLOOP-->) と使用するととても便利です。条件に基づきあるいはランダムにタグを含める便利な方法です。
このタグを使用してページをインクルードするとき、拡張子にかかわらず、4Dは呼び出されたページを解析してから、内容を4DINCLUDE呼び出し元のページに挿入します。
<!--#4DINCLUDE --> コメントで挿入されたページはロードされ、URLで呼ばれてWEB SEND FILEコマンドで送信されたファイルと同じように、Webサーバーキャッシュに格納されます。
pathには、含めるドキュメントへのパスを記述します。
警告: 4DINCLUDE呼び出しの場合、パスは解析される親ドキュメントからの相対パスです。フォルダ区切り文字にはスラッシュ (/) を使用し、レベルをさかのぼるには2つのドットを使用します (HTMLシンタックス)。
注:さらに、4Dは組み込み呼び出しが再帰的でないか確認します。
エラーの場合、“<!--#4DINCLUDE path--> : ドキュメントを開けません”のように表示されます。
例題
<!--#4DINCLUDE subpage.html--> <!--#4DINCLUDE folder/subpage.html--> <!--#4DINCLUDE ../folder/subpage.html-->
シンタックス: <!--#4DBASE folderPath-->
<!--#4DBASE --> タグは<!--#4DINCLUDE-->タグで使用されるワーキングディレクトリを指定します。
Webページ内でこのタグが使用されると、<!--#4DBASE --> タグはこのページ内でそのあとに続くすべての<!--#4DINCLUDE--> 呼び出しのディレクトリを変更します。組み込まれたファイル内で<!--#4DBASE -->フォルダーが変更されると、親のファイルから元となる値を取得します。
folderPath 引数には現在のページに対する相対パスを指定し、パスは"/"で終わっていなければなりません。指定するフォルダーはWebフォルダー内になければなりません。
WEBFOLDER キーワードを渡すと、デフォルトパスに戻されます (そのページに対して相対)。
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-->
シンタックス: <!--#4DIF expression--> {<!--#4DELSEIF expression2-->...<!--#4DELSEIF expressionN-->} {<!--#4DELSE-->} <!--#4DENDIF-->
<!--#4DELSEIF--> (オプション), <!--#4DELSE--> (オプション) と <!--#4DENDIF--> コメントと共に使用することで、<!--#4DIF expression--> コメントはコードの一部に条件分岐を実行させることを可能にします。
expression 引数はブール値を返す有効な4D式です。式は括弧の中に記述され、4Dのシンタックスルールに準拠していなければなりません。
使用する4Dランゲージやバージョンに関係なく式が正常に評価される事を保証するためには、異なるバージョン間で名前が変化する可能性のある要素(コマンド、テーブル、フィールド、定数)に対してトークンシンタックスを使用することが推奨されます。例えば、[#cmd id="178"/]コマンドを挿入するためには、'Current time:C178' と入力します。この点の詳細な情報に付いては、フォーミュラ内でのトークンの使用を参照して下さい。
<!--#4DIF expression--> ... <!--#4DENDIF--> を複数レベルでネストできます。4Dのようにそれぞれの <!--#4DIF expression--> は <!--#4DENDIF-->とマッチしなければなりません。
解釈エラーの場合、<!--#4DIF --> と <!--#4DENDIF-->“の間のコンテンツの代わりに、<!--#4DIF expression-->: ブール式が必要です”が挿入されます。
同様に、<!--#4DIF -->が同じ数の<!--#4DENDIF-->で閉じられていない場合、“<!--#4DIF expression-->: 4DENDIFが必要です” が<!--#4DIF --> と <!--#4DENDIF-->の間のコンテンツの代わりに挿入されます。
<!--#4DELSEIF--> タグを使用すると、条件テストの記述が容易になります。最初にTrueと判定されたブロック内にあるコードだけが実行されます。Trueブロックがない場合、文は実行されません (<!--#4DELSE-->がなければ)。
最後の<!--#4DELSEIF-->の後に<!--#4DELSE-->タグを記述できます。すべての条件がFalseの場合、<!--#4DELSE-->ブロックの文が実行されます。
以下の2つのコードは同等です
<!--#4DIF Condition1--> /* Condition1 is true*/ <!--#4DELSE--> <!--#4DIF Condition2--> /* Condition2 is true*/ <!--#4DELSE--> <!--#4DIF Condition3--> /* Condition3 is true */ <!--#4DELSE--> /*None of the conditions are true*/ <!--#4DENDIF--> <!--#4DENDIF--> <!--#4DENDIF-->
<!--#4DIF Condition1--> /* Condition1 is true*/ <!--#4DELSEIF Condition2--> /* Condition2 is true*/ <!--#4DELSEIF Condition3--> /* Condition3 is true */ <!--#4DELSE--> /* None of the conditions are true*/ <!--#4DENDIF-->
この例題は接続したユーザーに基づき異なるページを返します:
<!--#4DIF LoggedIn=False--> <!--#4DINCLUDE Login.htm --> <!--#4DELSEIF User="Admin"--> <!--#4DINCLUDE AdminPanel.htm --> <!--#4DELSEIF User="Manager"--> <!--#4DINCLUDE SalesDashboard.htm --> <!--#4DELSE--> <!--#4DINCLUDE ItemList.htm --> <!--#4DENDIF-->
スタティックなHTMLページに書かれたこの例題のコードは、vname#"" 式の結果に応じ、異なるラベルを表示します:
<BODY> ... <!--#4DIF vname#""--> Names starting with <!--#4DVAR vname-->. <!--#4DELSE--> No name has been found. <!--#4DENDIF--> ... </BODY>
シンタックス: <!--#4DLOOP condition--> <!--#4DENDLOOP-->
このコメントを使用して、条件を満たす間、コードの一部を繰り返すことができます。繰り返し部のコードは<!--#4DLOOP--> と <!--#4DENDLOOP-->で挟まれます。
<!--#4DLOOP condition--> ... <!--#4DENDLOOP--> ブロックはネストできます。4Dと同様、それぞれの<!--#4DLOOP condition--> は同じ数の <!--#4DENDLOOP-->で閉じられていなければなりません。
条件には5種類あります:
以下のコードは:
<!--#4DLOOP [People]--> <!--#4DTEXT [People]Name--> <!--#4DTEXT [People]Surname--><BR> <!--#4DENDLOOP-->
4Dランゲージで表すと以下のとおりです:
FIRST RECORD([People])
While(Not(End selection([People])))
// ...
NEXT RECORD([People])
End while
注: このシンタックスで二次元配列を使用することはできません。この場合、ネストしたループでメソッドを条件に使用します。
以下のコードは:
<!--#4DLOOP arr_names--> <!--#4DTEXT arr_names{arr_names}--><BR> <!--#4DENDLOOP-->
4Dランゲージで表すと以下のとおりです:
For($Elem;1;Size of array(arr_names))
arr_names:=$Elem
//...
End for
警告: コンパイルのため、C_BOOLEAN($0) とC_LONGINT($1) が宣言されていなければなりません。
例題以下のコードは:
<!--#4DLOOP my_method--> <!--#4DTEXT 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
<!--#4DEVAL $i:=0--> <!--#4DLOOP ($i<4)--> <!--#4DEVAL $i--> <!--#4DEVAL $i:=$i+1--> <!--#4DENDLOOP-->
以下の結果を生成します:
0
1
2
3
使用する4Dランゲージやバージョンに関係なく式が正常に評価される事を保証するためには、異なるバージョン間で名前が変化する可能性のある要素(コマンド、テーブル、フィールド、定数)に対してトークンシンタックスを使用することが推奨されます。例えば、[#cmd id="178"/]コマンドを挿入するためには、'Current time:C178' と入力します。この点の詳細な情報に付いては、フォーミュラ内でのトークンの使用を参照して下さい。
ARRAY TEXT($array;2)
$array{1}:="hello"
$array{2}:="world"
$input:="<!--#4DEVAL $1-->"
$input:=$input+"<!--#4DLOOP $2-->"
$input:=$input+"<!--#4DEVAL $2->{$2->}--> "
$input:=$input+"<!--#4DENDLOOP-->"
PROCESS 4D TAGS($input;$output;"elements = ";->$array)
// $output = "elements = hello world "
解釈エラーの場合、“<!--#4DLOOP expression-->: エラーの説明” が<!--#4DLOOP --> と <!--#4DENDLOOP-->の間のコンテンツの代わりに挿入されます。
以下のメッセージが表示されます:
- 予期しない式のタイプ (標準のエラー);
- テーブル名が正しくありません (テーブル名のエラー);
- 配列が必要です (変数が配列でないか、二次元配列が指定された);
- メソッドが存在しません;
- シンタックスエラー (メソッド実行時);
- アクセス権エラー (テーブルやメソッドにアクセスする権限がない)。
- 4DENDLOOP が必要です (<!--#4DLOOP -->が対応する<!--#4DENDLOOP-->で閉じられていない)。
4D タグは繰り返し解釈されます。4Dは常に変換の結果を解釈しようとし、もし新しい変換が起きた際にはそれに伴い新しく解釈が実行され、取得した結果がこれ以上変換の必要がなくなるまで繰り返されます。例えば、以下のような宣言が合った場合:
<!--#4DHTML [Mail]Letter_type-->
もし[Mail]Letter_type text テキストフィールドにタグ(例えば<!--#4DSCRIPT/m_Gender--> など)が含まれていた場合、このタグは4DHTMLタグの解釈の後、それに伴って評価されます。
この強力な原則はテキスト変換に関連するほとんどの需要を満たす事ができます。しかしながら、これは場合に寄っては悪意のあるコードの侵入を許す事になる可能性があるという点に注意して下さい。この点についてのより詳細な情報については、以下の章を参照して下さい。
4D変換タグは様々なタイプのデータを引数として受け入れます。テキスト、変数、メソッド、コマンド名、etc...。これらのデータが自分で書い たコードから提供される場合、そのインプットを自分でコントロールできるので、悪意あるコードの侵入のリスクは無いと言っていいでしょう。しかしながら、 データベースのコード扱うデータは、多くの場合外部ソース(ユーザー入力、読み込み、等)を通じて導入されたものです。
この場合、4DEVALや4DSCRIPTなどの変換タグを使用しない事が賢明です。なぜならこれらのタグはこういったデータを直接使って変数を評価するからです。
これに加え、繰り返しの原則(前章参照のこと)に従い、悪意あるコード自信が変換タグを含んでいる可能性もあります。この場合、4DTEXT タグを使用する必要があります。
例として、"Name"という名前のWebフォームフィールドがあり、ユーザーがそこに名前を入力しなければならない場合を考えてみましょう。この名前は<!--#4DHTML vName--> タグを使用してページ内に表示されます。もし"<!--#4DEVAL QUIT 4D-->" 型のテキストが名前の代わりに入力されたとしたら、このタグを解釈するとアプリケーションは終了してしまいます。
このリスクを避けるため、この場合にはシステム全体で4DTEXT タグを使用します。このタグは特殊HTML文字をエスケープするため、挿入された悪意ある再起的コードは、再解釈されることはありません。前の例でいうと、"Name"フィールドにはこの場合"<!--#4DEVAL QUIT 4D-->" が含まれ、これは変換されません。
4DオブジェクトをHTMLオブジェクトにバインドする
PROCESS 4D TAGS
URLとフォームアクション
セミダイナミックページ
プロダクト: 4D
テーマ: 文字列
4DVAR, 4DTEXT, 4DHTMLVAR, 4DHTML, 4DSCRIPT, 4DINCLUDE, 4DIF, 4DLOOP, 4DELSEIF
ランゲージリファレンス ( 4D v15.4)
ランゲージリファレンス ( 4D v15)
ランゲージリファレンス ( 4D v15.3)