CakePHP2 の FormHelper 第2引数の escape オプションについて調べてみました。

以前 CakePHP2 でラジオボタンを作ったときに、ボタンをクリックしたら onclick に書いた関数を起動するようにしたかったときがありました。地味に躓いたので、ポイントをメモしておきます。

escape オプションのポイント

  • FormHelper 第2引数のオプションの値の中の文字列のエスケープも無効にできます。具体的な指定方法は、’escape’ => false 。ちょっと変則的な使い方、、、だと思います。
  • テキストエリアに ‘escape’ => false を指定すれば入力した文字列のエスケープが無効になります。これが基本的な使い方、、、だと思います。
  • escape オプションは指定しなければ true 。これがデフォルトです。

具体的に。まずはテキストエリア♪

ビューのソースです。ハイライトした行に ‘escape’ => false を設定しています。

<?php
echo $this->Form->input('User.address', array('type' => 'textarea'));
echo $this->Form->input('User.profile', array('type' => 'textarea', 'escape' => false));
?>

ページを表示するとき、テキストエリアに初期値として「<>’\」を表示させると HTML ソースはこうなります。

<div class="input textarea">
	<label for="UserAddress">Address</label>
	<textarea name="data[User][address]" cols="30" rows="6" id="UserAddress">
		&lt;&gt;&#039;\
	</textarea>
</div>
<div class="input textarea">
	<label for="UserProfile">Profile</label>
	<textarea name="data[User][profile]" cols="30" rows="6" id="UserProfile">
		<>'\
	</textarea>
</div>

‘escape’ => false を設定した方のテキストエリアに入力されたテキストを表示するとき、エスケープされずにそのまま <>’\ と表示されています。

具体的に。次は FormHelper ::radio ♪

まずはビューのソースです。

<?php
echo $this->Form->radio('User.sex', array(0 => '男', 1 => '女'), array('onclick' => 'sample(\'msg\')'));
echo $this->Form->radio('User.sex2', array(0 => '男', 1 => '女'), array('onclick' => 'sample(\'msg\')', 'escape' => false));
?>

続いて HTML ソースです。

<fieldset>
	<legend>Sex</legend>
	<input type="hidden" name="data[User][sex]" id="UserSex_" value="" />
	<input type="radio" name="data[User][sex]" id="UserSex0"
		onclick="sample(&#039;msg&#039;)" value="0" checked="checked" />
	<label for="UserSex0">男</label> <input type="radio" name="data[User][sex]" id="UserSex1"
		onclick="sample(&#039;msg&#039;)" value="1" />
	<label for="UserSex1">女</label>
</fieldset>
<fieldset>
	<legend>Sex2</legend>
	<input type="hidden" name="data[User][sex2]" id="UserSex2_" value="" />
	<input type="radio" name="data[User][sex2]" id="UserSex20"
		onclick="sample('msg')" value="0" checked="checked" />
	<label for="UserSex20">男</label>
	<input type="radio" name="data[User][sex2]" id="UserSex21"
		onclick="sample('msg')" value="1" />
	<label for="UserSex21">女</label>
</fieldset>

‘escape’ => false を設定した方は、onclick で呼び出している JavaScript 関数の引数を囲む「’」がそのまま表示されています。‘escape’ => false でない方は、「&#039;」とエスケープされています。

具体的に。最後に FormHelper ::input ♪

まずはやっぱりビューソースです。

<?php
echo $this->Form->input('User.status', array('type' => 'radio', 'options' => array(0 => 'オン', 1 => 'オフ'), 'onclick' => 'sample(\'msg\')'));
echo $this->Form->input('User.status2', array('type' => 'radio', 'options' => array(0 => 'オン', 1 => 'オフ'), 'onclick' => 'sample(\'msg\')', 'escape' => false));
?>

そして HTML ソースです。

<div class="input radio">
	<fieldset>
		<legend>Status</legend>
		<input type="hidden" name="data[User][status]" id="UserStatus_" value="" />
		<input type="radio" name="data[User][status]" id="UserStatus0"
			onclick="sample(&#039;msg&#039;)" value="0" checked="checked" />
		<label for="UserStatus0">オン</label>
		<input 	type="radio" name="data[User][status]" id="UserStatus1"
			onclick="sample(&#039;msg&#039;)" value="1" />
		<label 	for="UserStatus1">オフ</label>
	</fieldset>
</div>
<div class="input radio">
	<fieldset>
		<legend>Status2</legend>
		<input type="hidden" name="data[User][status2]" id="UserStatus2_" value="" />
		<input type="radio" name="data[User][status2]" id="UserStatus20"
			onclick="sample('msg')" value="0" checked="checked" />
		<label for="UserStatus20">オン</label>
		<input type="radio" name="data[User][status2]" id="UserStatus21"
			onclick="sample('msg')" value="1" />
		<label for="UserStatus21">オフ</label>
	</fieldset>
</div>

こちらも、’escape’ => false を指定した方は「’」が表示され、そうでない方は「&#039;」とエスケープされています。

おわりに

escape オプションについてはこちらの本家ドキュメントが参考になりました。いつもいつもお世話になっております♪

他にも FormHelper::button でも使えるようですよ。

なお、なぜか FormHelper::input あたりでは、見当たりませんでした。見落としたのでしょうか?

以上です!

コメントを残す

コメントを残す