備忘録。
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オブジェクトイラネ」というのもわかる気がする…
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オブジェクトイラネ」というのもわかる気がする…