1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CFMLとCFScriptの書き方の違い

Last updated at Posted at 2021-08-09

CFMLとCFScriptの書き方の違い

どんな話?

CFMLとCFScriptの書き方の違いを書いています。
CFMLで書いているものをCFScriptで書き換える場合はどんな感じ?みたいな。

CFML⇒CFScript に置き換える方法は、主に2つ

ColdFusionタグと同等の機能をCFScriptで記述する際、2つの方法があるようです。

  1. タグ名をそのままCFScriptとして記述
  2. タグと同等の機能を持つ関数などを利用する

2.については、以下の公式マニュアルに一部記載されています。
タグに相当するCFScript機能(日本語)

ただ、色々ググると上記には乗っていない情報も結構あります。
ColdFusion関連のことはググっても、

タグ名をそのままCFScriptとして記述する方法

※この記述方法はColdfusion11から利用可能
例えばcfcontentタグはこんな感じで書くと思います。

<!--- CFML --->
<cfcontent reset="true">

これをCFScriptで書きたい場合は、こんな感じになります。

// CFScript
cfcontent(reset="true");

ほぼタグのような書き方ですね。

パラメータが2つ以上ある場合は、カンマ区切りで書きます。例としてcfexecuteタグを。

<!--- CFML --->
<cfexecute name="hogeApp" argument="-fuga" outputFile="C:\Temp\result.txt" timeout="30">
// CFScript
cfexecute(name="hogeApp", argument="-fuga", outputFile="C:\Temp\result.txt", timeout="30");

CFMLをCFScriptに置き換えたい場合、まずはこんな感じで書いていくといいと思います。

タグと同等の機能を持つ関数などを利用する

タグ名をそのままCFScriptとして記述する方法以外に、
CFMLタグと同等の(または似たような)機能を利用する方法もあります。
他言語の経験者ならこちらの方がわかりやすそうです。

以下にいくつか記載します。
(ifなど、関数というよりはCFScriptを用いた構文の書き方みたいなものもあります)

CFML CFScript
cfabort abort
cfcomponent component
cfdump WriteDump
cffile FileRead
FileWrite
など...
cffunction function
cfif, cfelseif, cfelse if, elseif, else
cfinclude include
cfmail mail
cfquery, cfqueryparam QueryExequte
cfreturn return

以下、記述例とリファレンスのリンクを紹介。
リファレンスにリンクしていますが、日本語があるものと無いものがあるんですね・・・


cfabort

CFML(英語)

<cfabort>

CFScript

abort;

タグ名からcfを抜いたもの、そのまんまですね。


cfcomponent

CFML(英語)

<cfcomponent displayname="hoge" hint="fuga" output="false">
  (関数などを定義)
</cfcomponent>

CFScript(英語、functionと同じ)

component displayname="hoge" hint="fuga" output="false" {
  (関数などを定義)
}

これは関数と言うか、CFScriptを用いたコンポーネントの生成方法ですね。
属性としてdisplaynameなどを例に挙げていますが、他の属性でも同じような書き方です。
もちろん、使わないなら書く必要はありません。


cfdump

CFML(英語)

<cfdump var="hoge">

CFScript

WriteDump(hoge);

DumpではなくWriteDumpです。
outputformatなどのパラメータは使ったことがないので、気が向いたら調べて追記しておきます。


cffile

CFML(日本語)

<!--- ファイルに文字列「ほげほげふがふが」を書き込み --->
<cffile action="write" file="c:\files\hoge.txt" output="ほげほげふがふが" charset="utf-8">

<!--- 変数hogeにファイルの内容を読み込み --->
<cffile action="read" file="c:\files\hoge.txt" variable="hoge" charset="utf-8">

CFScript(以下2つともに英語)

// ファイルに文字列「ほげほげふがふが」を書き込み
FileWrite("c:\files\hoge.txt", "ほげほげふがふが", "utf-8");

// 変数hogeにファイルの内容を読み込み
hoge = FileRead("c:\files\hoge.txt", "utf-8");

cffileはいくつかの動作がありますが、例としてとりあえず書き込みと読み込みだけ。
他も似たような感じで書けます。


cffunction

CFML(cffunction)(日本語)
CFML(cfargument)(英語)

<cffunction name="hoge" access="private" returnType="query">
  <cfargument name="fuga" required="true" type="string" default="ABC">
  (処理)
</cffunction>

CFScript(英語、componentと同じ)

private query function hoge(required string fuga="ABC") {
  (処理)
}

component同様、関数と言うよりはCFScriptを用いた関数の定義方法ですね。
アクセス修飾子や引数のrequiredなど、CFMLで省略できるものはCFScriptでも省略できます。
そのうち、アクセス修飾子がremoteの場合の引数の受け取り方なども書きたいですね。


cfif, cfelseif, cfelse

CFML(cfif)(英語)

<cfif hoge EQ 1>
  (処理1)
<cfelseif hoge GT 1>
  (処理2)
<cfelse>
  (処理3)
</cfif>

CFScript

if (hoge == 1) {
  (処理1
} elseif (hoge > 1) {
  (処理2
} else {
  (処理3
}

これも関数ではないですね。CFScriptを用いたif構文の書き方です。
CFScriptだと>などを使って比較もできるので、多言語慣れしている方にはより書きやすいかなと。
参考: 式:開発ガイド(日本語)


cfinclude

CFML(英語)

<cfinclude template="hogehogepath" runOnce="true">

CFScript

include "hogehogepath" runOnce = "true";

runOnceは省略可能。省略した場合はfalseと同じ動きをするようです。


cfmail

CFML(英語)

<cfmail server="hoge" from="fuga" to="piyo" subject="foo">
  メール本文
</cfmail>

CFScript(英語)

var mail = new mail(
  server = "hoge",
  from = "fuga",
  to = "piyo",
  subject = "foo"
  body = "メール本文"
);
mail.send();

インスタンスを生成して、そのメソッドを使って送信、と言った感じですね。
インスタンス生成はnew mail()の代わりにcreateObject("component", "mail")とも書けます。

また、作成したオブジェクトに対して、後からfromを変更したい場合は、
mail.setAttribute('from', 'fugafuga')
または
mail.setFrom('fugafuga')
のように書くこともできるようです。
引数が多いのはちょっと嫌な方は、後者のような書き方のほうがきれいに書けると思います。

2022/1/25訂正
先に示したリンク先のドキュメントには
setAttribute()setParam()メソッドが定義されているようですが、
ColdFusion2018でパラメータ"to"の動作を確認したところ、
setAttribute()は使えず(そんなメソッドは無い的な例外)、
setParam()は動作するものの設定されないようです。
(ColdFusion2021なら動くのかな・・・時間がある時に確認してみます)

パラメータtoの場合はsetTo()メソッドを使うなど、
いくつかのパラメータについてはsetHoge()メソッドが用意されています。
(すべて可能ではないですが、from、to、cc、bcc、subject、body、removeは専用のメソッドで設定可能であることを確認)

メール添付については、こんな感じで行けると思います。

mail.addParam(file = ファイルパス, type = "text/plainなどファイルに合わせたもの");

// メール送信後にファイルを削除する場合
mail.setRemove(true);

まあ、もう少し調査が必要ですね・・・


cfquery, cfqueryparam

CFML(cfquery)(日本語)

<cfquery name="hoge" datasource="fuga" result="piyo">
  SELECT * FROM HOGEHOGE
  WHERE COLUMN1 = <cfqueryparam value="ABC" CFSQLType="CF_SQL_NVARCHAR">
  AND COLUMN2 = <cfqueryparam value="DEF" CFSQLType="CF_SQL_NVARCHAR">
</cfquery>

CFScript(英語)

hoge = QueryExecute("
    SELECT * FROM HOGEHOGE
    WHERE COLUMN1 = :value1
    AND COLUMN2 = :value2
",
{
    value1 = {value = "ABC", CFSQLType = "CF_SQL_NVARCHER"},
    value2 = {value = "DEF", CFSQLType = "CF_SQL_NVARCHER"}
},
{
    datasource = "fuga",
    result = "piyo"
});

改行やインデントはお好みで・・・
使わないなら、第2引数(cfqueryparamにあたるもの)や第3引数(datasourceとか)は省略できます。
上に書いていないパラメータも似たような感じで書けるはずです。
SQLのパラメータ部分の書き方は、CFSQLTypeを省略するならもっと簡単に書けたりもするので、
リファレンス(英語)をチラ見してみるといいかもしれません。

第3引数を指定することはあまりないかもしれません。
datasourceは省略すればApplication.cfcで指定した値を使いますし、resultは以下のような方法でも取得できますので。

// 方法その1
result = QueryGetResult(hoge);

// 方法その2
result = hoge.GetResult();

参考: QueryGetResult(英語)


cfreturn

CFML(英語)

<cfreturn hoge>

CFScript

return hoge;

これはそのまんま。他言語とほぼ同じ書き方ですね。


終わりに

何年かぶりにColdFusionを触ることになって、色々忘れてしまった。
ColdFusionのお仕事ってCFMLベースで書くことが多く、
あまりCFScriptが使われていないと思います(個人の感想です)が、
他言語慣れしていると(ビュー部分以外は)CFScriptのほうが書きやすいですね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?