毎日漫然な愚者

少ない時間で挑むGNO2とモンハン日記ばかり?

symfony sfForm使用時にlabelがエスケープされない件

2010-05-07 08:20:08 | PHP
備忘録。

symfony1.4.3においてviewでformオブジェクトを利用する場合、
以下の点に注意する必要がある。

1、renderLabel()で生成されるラベル文字列はエスケープされない
2、getValue()の戻り値はエスケープされない

具体的にはこんなformがあったとして・・・

■Formクラス

class hogeForm extends sfForm
{
 public function configure()
 {
  $choices = array('hoge','fuga<input>');
  $this->widgetSchema['choiceHoge'] = new sfWidgetFormmSelectRadio(array(
    'label'   => 'choiceHoge',
    'choices'  => $choices,
  ));
  $this->validatorSchema['choiceHoge'] = new sfValidatorChoice(array(
    'choices' => array_keys($choices),
  ));

  $this->widgetSchema['inputHoge'] = new sfWidgetFormInput(array(
    'label' => '<input>Hoge'
  ));
  $this->validatorSchema['inputHoge'] = new sfValidatorString(array(
    'max_length' => 10,
  ));
  
 }
}


■ラジオボタン(チェックボックス)のオプションラベルはエスケープされない
上記formをviewで以下のように書くと・・・
■viewクラス

<?php echo $form ?>

見事にエスケープされずにinputボックスが表示されてしまうので以下のようにして、
あらかじめsfWidget::escapeOnceでエスケープします。
■ラベルのエスケープ漏れ対策

  $choices = array('hoge',sfWidget::escapeOnce('fuga<input>'));
  $this->widgetSchema['choiceHoge'] = new sfWidgetFormmSelectRadio(array(
    'label'   => 'choiceHoge',
    'choices'  => $choices,
  ));

…………

  $this->widgetSchema['inputHoge'] = new sfWidgetFormInput(array(
    'label' => sfWidget::escapeOnce('<input>Hoge')
  ));


■getValue()の戻り値はエスケープされない
これは、上記formの入力値を次のactionで利用するときに発生する問題。
■例
1、入力画面でinputフォームに<input>と入力
2、確認画面で入力内容を再表示するためにformオブジェクトを再利用
3、formオブジェクトから入力値を取得して表示する
  →ここで$form->getValue('inputHoge')する

対策が各パラメータをエスケープするしかないので、、
確認画面で入力値を再表示するときは、
actionでview変数にあらかじめセットするしたほうがいい。

知ってれば当然なのかもしれないけど、
「formオブジェクトイラネ」というのもわかる気がする…


最新の画像もっと見る