メール送信時に(Viewの)テンプレートファイルを使う方法

CakePHP 1.2.0.7125 RC1.を使ってるのですが、メール送信時にメール本文をテンプレート化してそれを読み込んで送信しようと思い、検索したところ、controllerのrenderの内容を出力するob_get_clean(); の存在を知り、いろいろやってたんですがどうもうまくいかない。メール本文の内容まで画面に出力されてしまった。

駄目だったコードはこんな感じ

 ob_start();  
 $this->render(null, 'email', 'infomail');  
 $body = ob_get_clean();

$bodyにメール本文が入り、それをメール送信関数に渡します。
このob_get_cleanで直前までのrenderの内容を出力して変数に入れることが出来ます。
その後、該当アクションのviewのファイルが呼ばれて画面にhtml出力されます。


うまくいくとこんな感じになるのですが、今回のCakeのバージョンだと$this->renderしてob_get_cleanを読んでも内容が変数に入らず、画面に表示されてしまう。



ということで、cake/libs/controller/controller.phpの中のrenderメソッドのコードを読んでみたら、下記のようになってた。

function render($action = null, $layout = null, $file = null) {

        途中省略。

	$this->autoRender = false;
	$this->output .= $View->render($action, $layout, $file);

	return $this->output;
}


renderはbooleanが返ってくるかと思ってたら、テンプレートファイルの内容をreturnしてるもよう。
そして、$this->outputがviewで呼び出されて画面に出力される。

ということで、下記のようにしてみた

	$this->set("inputdata",$data);
	$content = $this->render(null,'email', 'infomail');
	$this->output = '';


上記のコードでは、テンプレートに渡すinputdataに出力したい内容の$dataをセットし、renderメソッドのreturn値をメール本文に該当する$contentに入れる。最後に、render内で$this->outputに入ったメール本文の内容を消去。
そしてこの後に、viewで該当アクションのテンプレートが呼ばれて、$this->outputに画面表示用のhtmlがセットされて画面に出力される。


上記のコードの場合、renderの第2引数でレイアウトファイルemail.ctpを定義し、第3匹数でテンプレートファイルinfomail.ctpを定義しているので、app/view/layouts/email.ctpと、app/view/モデル名/infomail.ctpを用意しておく。

app/view/layouts/email.ctpでは、下記のような内容を定義

<?php echo $content_for_layout; ?>

-----------------------------------
xxxx@xxxxxxx.jp
シグネチャの内容
-----------------------------------

$conent_for_layoutに、下記のテンプレートの内容がセットされる

app/view/モデル名/infomail.ctpの内容

お問い合わせ頂きありがとうございます。

下記がお問い合わせ内容です。

会社名:<?php echo $inputdata['モデル名']['companyname']; ?>


名前:<?php echo $inputdata['モデル名']['username']; ?>


上記のテンプレートは、コントローラーで
$this->set("inputdata",$data);
としていて、$dataに$data['モデル名']['companyname']とセットされているのが前提です。