どんな話?
久しぶりにColdfusionに触って、カスタムタグの使い方を忘れていたので。
公式マニュアルのこの辺の話。
https://helpx.adobe.com/jp/coldfusion/developing-applications/building-blocks-of-coldfusion-applications/creating-and-using-custom-cfml-tags.html
公式マニュアルは長いし、英語読むのも面倒だし、ざっくりと。
カスタムタグって何だっけ?
こんな感じで書くと、
<cf_hogetext id="hoge_id" name="hogename">
サーバ側でごにょごにょ処理が実行されて、こんなものが出力される、みたいな。
(もちろん、こんな感じで出力されるように、裏で処理を作る必要はあります)
<input type="text id="hoge_id" name="hogename" placeholder="ほげほげ">
主に画面表示出力などを共通化するための仕組みですね。
サーバ側の処理をCFMLで書いているなら、cffunction
の代わりに使えたりもしますね。
カスタムタグの配置場所を設定する
cf_hogetext
タグを使ったときに呼びだされる処理は、hogetext.cfm
に記述する必要があります。
- src
- gamen
- test_customtag.cfm
- hogetext.cfm
ただ、この構成だとちょっとわかりにくいと思います。
カスタムタグは、Application.cfc
でパスを指定することで、そこにあるファイルを読み込むことができるようになります。
(パスの記述は環境に合わせてそれらしく)
<cfset this.customtagpaths = "カスタムタグを配置する場所">
この設定をすることで、カスタムタグの処理を記述するファイルを分けることができます。
- src
- customtag
- hogetext.cfm
- gamen
- test_customtag.cfm
とりあえず処理を書いてみる(Attributesの使い方とか)
test_customtag.cfm
はカスタムタグって何だっけ?をそのまま使ってみる。
<cf_hogetext id="hoge_id" name="hogename">
そしてカスタムタグの処理。
カスタムタグを使うときに記述されている属性(id
とかname
とか)は、Attributes
から取得できます。
<cfoutput>
<input type="text" id="#Attributes.id#" name="#Attributes.name#" placeholder="ほげほげ">
</cfoutput>
これでtest_customtag.cfm
を呼び出せば、カスタムタグって何だっけ?と同じ結果が返ってくるはずです。
<input type="text id="hoge_id" name="hogename" placeholder="ほげほげ">
これを応用すれば、データベースから取得した情報を使ってselectタグとoptionタグを生成したり、みたいなこともできますね。
cffunction
タグやCFScriptで関数定義したりでも似たようなことができると思いますが、状況によってはこちらの方が使いやすいと思います。
Callerなんてものが使える(けどあまり使いたくはない)
カスタムタグの処理内でCaller
を使うことにより、カスタムタグの呼び出し元で定義されている変数を取得したり、値を書き換えたりすることもできます。
(多用するとソースが読みにくくなりそうですが・・・)
例えばこんなカスタムタグを定義してみます。
<cfscript>
// もちろんCFMLではなく、こんな感じでCFScriptでも処理を書けます
Caller.hogehoge = "書き換えたhogehoge";
Caller.fugafuga = "新たにセットしたfugafuga";
</cfscript>
そしてカスタムタグを使うと、カスタムタグを呼び出す前にセットしたhogehoge
が書き換えられますし、カスタムタグ内で新たにセットされたfugafuga
の値を取り出すこともできます。
<cfset hogehoge = "ほげほげ">
<cf_hogecaller>
<cfdump var="#hogehoge#"> <!--- hogecallerタグによって書き換えられた値が出力される --->
<cfdump var="#fugafuga#"> <!--- hogecallerタグによって新たにセットされた値が出力される --->
いやでも、この仕組みはやっぱりソースの可読性が・・・
個人的には、共通の定数定義を読み込むときに使うくらいがいいような気がします。
TODO
時間がある時にまだ書けそうなことがありますね。そのうち追記します。
- 終了タグを使った処理の書き方