毎日漫然な愚者

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

symfony マルチテキストインプット

2010-05-20 08:13:05 | PHP
symfony マルチテキストインプット

備忘録

電話番号や郵便番号のフォームが必要になり、
sumfony1.4用のマルチインプットウィジェットとバリデータを作成したので、
以下に置いときます。

myValidatorMultiInput.class
myWidgetFormMultiInput.class
※ダウンロードできない場合は「開く」をクリックしてください。

やっつけで作ったので使い勝手はイマイチかもしれないけど、
要件は満たしているはず。

気に入らなかったら勝手に直してください。

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

PHP preg関数でのバックスラッシュについて

2010-03-21 13:14:53 | PHP
preg関数でバックスラッシュを処理する際に軽くはまったので備忘録。


■やりたい事

'.()/\'にバックスラッシュを追加

■perlの場合

$target =~ s/([.()\/\\])/\\$1/

■PHPの場合

$target = preg_replace('/([.()\/\\\\])/','\\\\$1',$target)



なににはまったのかというと、
\\\\とバックスラッシュが4つ必要なこと。

なんでこんな構文なのかについては、
ここで知ったのだが、
簡単にいうと、
PHPが文字列リテラル→正規表現の順で2重評価をしているため
ということ。

…確かにバッドノウハウ(BK)だわ。


PHP symfony 入力フォームのエスケープ処理

2009-10-30 08:13:45 | PHP
思わず連投w

さっき、このブログで投稿する際に、
タイトル中にリンクを書いて文字数制限に引っかかって、
編集画面に再遷移してタイトルのinputタグが壊れて表示されてたんで気づいたんだけど、
このブログ、エスケープ処理大丈夫?…^^;

で、こんなときPHPフレームワークsymfonyを用いると、
設定のみで簡単に解決できます。

やり方は・・・書くのが面倒なのでこっちを参照してねw

では、symfonyを用いない場合はどうするのか?というと、
htmlspecialcharsをすれば及第点は得られるかと^^;

まあ、実際には要件によりそんな簡単にはいかないことが多いのが、
悲しいとこだったりするけどね・・・(T T)