[symfony] HTMLタグを含む文字列をエスケープせずに出力する
symfonyでHTMLのタグを記述した文字列($this->str = '<p>文字列</p>'みたいなの)を出力すると、view.ymlでの設定にもよるらしいけど'<'や'>'が実体参照(それぞれ'<'や'>')に変換されて結局ブラウザにはHTMLコードがそのまま表示されてしまうんですよね(実は本日知りましたw)
赤い文字を表示したいと思って、以下のようにしてもダメなのね。
//アクション:actions.class.php
public function executeAction(
sfWebRequest $request)
{
$this->str =
'<p style="color:red;">'.
'文字列</p>';
}
//テンプレート actionSuccess.php <?= $str ?> <?php echo $str;?>
これを意図する通り表示させたいなら、テンプレート側で以下のようにすれば良いらしい。
//テンプレート actionSuccess.php
<?= $sf_data->get(
'str', ESC_RAW) ?>
?。いやマジでなんのこっちゃと思いますけど、こうなのだから仕方がない。
通常、アクション側で$this->hogehogeとして使用された変数は、テンプレート側で単に $hogehoge と表記しますけど、果たしてその実体は?というと$sf_data->get('hogehoge')ということなんでしょうな(自信ないけどw)。そして、このgetメソッドは文字列をエスケープして返してくるけど、第二引数にESC_RAWという定数を与えるとエスケープしないってことなのだろうね。と推測した。
が、それだけでは説明が付かない事態。自作のクラスのgetterからHTMLを出力する場合もエスケープされてしまう。困った。
//HogeHogeは自作クラス $obj = new HogeHoge(); echo $obj->getHtmlString();
これはどう対処するのかというと、、、
↓こうするんだって。
//HogeHogeは自作クラス $obj = new HogeHoge(); echo $obj->getHtmlString(ESC_RAW);
驚いた。HogeHogeは自作クラスだから、getHtmlStringというメソッドも自作。引数は取らないように宣言しているのに、無理やり身に覚えのないESC_RAWを渡すと、エスケープ無しで返してくれる。つまりsymfonyさんが勝手にいろいろやってくれているんですね。
まさか使い始めて半年経ってこういうことを知る羽目になるとは、symfonyって深いなー。というか変態的だなw
こんなの知らなきゃわからないね。
アンジャッシュのネタが中国にぱくられるとかw。あのダブルミーニング的なネタは中国人でなくてもパクリたくなる気持ちはわかる。
| 固定リンク



コメント