2014年2月11日

CakePHP+SmartyでCakeEmailを使う

 CakePHPとSmartyを合わせて使うとViewのテンプレート内でPHPのコードを欠かなくても良くなるのでとても見やすくなります。
 Webページ内で使うことについては、いろんなサイトに記載されているのでそちらを参照していただければと思います。
 SmartyViewというクラスを使用します。
ここからダウンロード(https://github.com/news2u/cakephp-smartyview)。

今回試した環境は以下です。
(開発環境としてWindowsを使っていますが実際の環境では、CentOS上で行います。)

  • Windows7
  • IIS7.5
  • CakePHP 2.4.5
  • PHP 5.4.16
  • Smarty 3.1.16

 CakeEmailで使うテンプレートもSmartyを使いたい

なのでちょっと調べたら、やり方を公開しているサイトがありましたので試してみました。


 やぎLabs(http://blog.koganinja.jp/archives/410)


ですが、CakeEmailの1625行目でエラーが発生してしまいメール送信までできませんでした。
エラーになっている行:$View = new $viewClass(null);
エラーメッセージ:[FatalErrorException] Cannot pass parameter 1 by reference
「引数に値を直接していないで変数を指定してね。」という意味のエラーのようです。

 確かに、CakeEmail内のviewClass変数のクラスのコンストラクタにnullを直接指定指定しています。
なので、null値化した変数を設定するようにしたらエラーもなくなり、メールが送信されました。
 SmartyViewクラスのコンストラクタの仮引数は参照で受けるようになっています。
function __construct (&$controller) {
  :
}

ということは、対応方法は2つあります。
1.SmartyViewクラスのコンストラクタの引数を変更する方法
修正前
 45 function __construct(&$controller)
修正後
 引数を参照で受ける記号(&)を削除します。
 45 function __construct($controller)

2.CakeEmailクラスのviewClassのインスタンス化のやり方を変更する方法
こんな感じに直してみました。
修正前
 1625 $View = new $viewClass(null);
修正後
 $pという変数をnullにして、変数の参照を渡すという感じです。
 1625 $View = new $viewClass($p=null);

通常1.で対応することが正解だと思います。
そもそも、SmartyViewクラスの親クラスのコンストラクタの引数が参照で受けていないのでなぜ、ここは参照で受けているのかが問題です(当然、このクラスの作者には感謝していますよ。)
二年前に作成されたクラスなので、当時は何かの問題で必要だったのかもしれませんね。

もし、1の対応で何か問題が発生した場合は、2.の方法で対応してみてください。


 これで、Viewは全て、Smartyに統一ができて嬉しいです。



追記

先に紹介したSmartyViewクラスのもう一箇所変更が必要なところがあります。
最近のPHPは、変数を参照渡しする場合、「&」は付けないのが正しいので以下の修正が必要になります。

修正前
 164 $this->{$helper}->_registerSmartyFunctions(&$this->Smarty);
修正後
 164 $this->{$helper}->_registerSmartyFunctions($this->Smarty);

0 件のコメント:

コメントを投稿