2007年04月23日

CakePHP:コントローラ内でヘルパークラスを使ってみる

CakePHPでヘルパーというのは、マニュアルでは
http://www.cakephp.jp/doc/helpers.html

ヘルパーは、データの整形や表示などの、ビューで一般に必要とされる関数を便利な仕方で提供する方法です。


と定義されており一般にビューで使用されるものだ。

しかし、CakePHPの標準で提供されているヘルパークラスの中には、TimeHelperクラスのdaysAsSqlメソッドなどSQLのwhere句を作成するのを助けてくれるような、コントローラクラスでぜひとも使用したい便利なメソッドも定義されている。

そこでコントローラ内で

var $helpers = array('Html', 'Form', 'Time');


と定義し、ビューファイルで$Time->daysAsSqlとアクセスするように、アクションメソッド内で

$sql = $Time->daysAsSql("2007/04/01", "2007/04/20", 'field');


として実行してみた。

しかし、$Time変数が定義されてないというエラーで失敗。

原因を調査してみると、ビューで使用する$Htmlや$Timeは、実はViewクラス(cake/libs/view/view.php)の_render(プロテクト)メソッドのローカル変数だからということが分かった。
(コントローラのset関数でビューに渡される関数もこの_render関数内でextractされている。)

そして、この_renderメソッドを覗いて見ると$this->_loadHelpersメソッドをコールしており、どうやらこの_loadHelpers内でヘルパークラスが作成されているというのがわかった。

_loadHelpersメソッドではコントローラの$helpersフィールドに定義されたヘルパークラスたちがnewされ、'base'や'webroot'などのコントローラクラスのフィールドをヘルパークラスのフィールドにコピーしている。
(実際にはコントローラからビューに設定されたフィールド)

ということは、コントローラ内で使用したいヘルパークラスをnewしてやればいいのではないかと考えコントローラ内のアクションメソッド内で

$Time = new TimeHelper();


としてみた。しかしTimeHelperクラスが見つからないとエラー。どうやらTimeHelperクラスのファイルが読み込まれてないみたいだ。

_loadHelpersメソッド内を調べてみるとloadHelper関数(グローバル)を使用し必要なヘルパークラスのファイルを読み込ませているのがわかった。

なので、コントローラクラスの任意のアクションメソッド内で

if(loadHelper('Time'))
{
$Time = new TimeHelper();
$sql = $Time->daysAsSql("2007/04/01", "2007/04/20", 'field');
echo $sql;
}


とloadHelper関数でヘルパークラスを読み込んでみると、

(field >= '2007-04-01 00:00:00') AND (field <= '2007-04-20 23:59:59')


と期待した結果が得られ、コントローラ内でへルパークラスを使用することに成功した。

これで今までコントローラ内にコピペしていたのがスッキリする・・・

ちなみに、loadHelper関数だが、cake/basics.phpで定義されている。
このファイルには他にもe()やh()などecho()やhtmlspecialchars()などのショートカット関数も定義されているみたいだ。
posted by asaton at 15:58| Comment(0) | TrackBack(1) | CakePHP | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/39760357

この記事へのトラックバック

三日で90万(笑)
Excerpt: 少し前までドウ○イだったのに、今ではセッ○スで生活してます(笑)
Weblog: たけちゃん
Tracked: 2007-06-03 23:54
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。