symfony マルチテキストインプット
備忘録
電話番号や郵便番号のフォームが必要になり、
sumfony1.4用のマルチインプットウィジェットとバリデータを作成したので、
以下に置いときます。
myValidatorMultiInput.class
myWidgetFormMultiInput.class
※ダウンロードできない場合は「開く」をクリックしてください。
やっつけで作ったので使い勝手はイマイチかもしれないけど、
要件は満たしているはず。
気に入らなかったら勝手に直してください。
備忘録
電話番号や郵便番号のフォームが必要になり、
sumfony1.4用のマルチインプットウィジェットとバリデータを作成したので、
以下に置いときます。
myValidatorMultiInput.class
myWidgetFormMultiInput.class
※ダウンロードできない場合は「開く」をクリックしてください。
やっつけで作ったので使い勝手はイマイチかもしれないけど、
要件は満たしているはず。
気に入らなかったら勝手に直してください。
備忘録。
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オブジェクトイラネ」というのもわかる気がする…
![]() | もし高校野球の女子マネージャーがドラッカーの『マネジメント』を読んだら岩崎 夏海ダイヤモンド社このアイテムの詳細を見る |
ベストセラーというのに乗せられて読みました。
パッケージは萌え要素が強いけど、
中身は「マネジメント」のHowTo本で、
青春小説なのは最後の1章だけと思ってもあまり間違いはないかもしれませんw
以下は個人的な感想。
■目的
いきなり「マネジメント」を読むのはハードルが高いので、
先にこの本を通して概要を知る
■結果・感想
「マネジメント」に必須なものが才能ではなく真摯さであること、
組織における顧客が誰であるかを定める際に大事な考え方、
組織及び所属構成員における目標設定の考え方、
人材こそ貴重な資源であることとそれの生かしかた、
組織の活動における社会貢献の重要性、
…等々、多くのことを知ることができた。
正直、読む前はナメてたが、
読んでみると自分の知りたいこととその活用例が非常にわかりやすくに書いてあり、
支払った以上の「感動」を得ることができました^^
それと同時に、
顧客に感動を与えることがどれだけ重要であるかを実体験として学ぶことができ、
仕事をこなす上でも考えさせられる1冊でした。
…俺ができる、人に感動を与えられることって何だろうなぁ^^;
preg関数でバックスラッシュを処理する際に軽くはまったので備忘録。
'.()/\'にバックスラッシュを追加
$target =~ s/([.()\/\\])/\\$1/
$target = preg_replace('/([.()\/\\\\])/','\\\\$1',$target)
なににはまったのかというと、
\\\\とバックスラッシュが4つ必要なこと。
なんでこんな構文なのかについては、
ここで知ったのだが、
簡単にいうと、
PHPが文字列リテラル→正規表現の順で2重評価をしているため
ということ。
…確かにバッドノウハウ(BK)だわ。
- ■やりたい事
- ■perlの場合
- ■PHPの場合
なににはまったのかというと、
\\\\とバックスラッシュが4つ必要なこと。
なんでこんな構文なのかについては、
ここで知ったのだが、
簡単にいうと、
PHPが文字列リテラル→正規表現の順で2重評価をしているため
ということ。
…確かにバッドノウハウ(BK)だわ。