はじめに
バイトで長い時間苦しんだ部分についてメモを残していきたいと思います。
ControllerからViewに値を渡す
基本的にControllerからViewに値を渡す場合Viewクラスのforge()メソッドを利用する
Controller.php
public function action_index() {
return Response::forge(View::forge('第一引数', '第二引数', '第三引数'));
}
forge()メソッド
forge()メソッドはオブジェクトを生成するメソッド
Viewクラスのforge()メソッド
Viewオブジェクトを返すメソッド
Controller.php
View::forge($file, $data, $filter)
// $file = ビューファイル名を受け取る。app/viewsからの相対パス (ex: View/View.php)
// $data = Viewに渡したい値の配列 (ex: {'hoge' => $hoge})
// $filter = 自動エンコーディングを行うかを決める (デフォルトはtrueでエンコーディングを行う)
Responseクラスのforge()メソッド
Responseクラスの新しいインスタンスを生成する
HTTPレスポンスとブラウザ出力を扱うメソッドを持つ
Controller.php
Response::forge($body, $status, $header)
// $body = レスポンス本文。ユーザーに返したいレスポンス
// $status = HTTPステータスコード
// $header = レスポンスになりうる、あらゆる HTTP ヘッダ
ViewでHTMLのタグが表示されてしまう理由
View::forge()の第三引数を省略するとtrueになり、デフォルトでエスケープを行ってしまう
よって、DBなどに入っているHTMLタグが入った文字列をエスケープした状態でViewに渡してしまい、HTMLタグが表示されてしまう
解決策としては以下の2つある
第三引数をfalseにする
falseにすることにより$dataにエスケープ処理を与えずにViewに渡すことができる
Controller.php
View::forge('/View/View.php', {'hoge' => 'Hello World!<br>'}, false)
set_safe()メソッドを利用する
ビューに変数を割り当てるメソッド
変数に値を入れる際にエンコーディングを行わない
Controller.php
View::forge()->set_safe('hoge', 'テスト');
View.smarty
{$hoge}
↓ 出力
テスト