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']とセットされているのが前提です。