PEAR::HTML_QuickForm
iを利用するBEAR_Form
で作成したフォームがあり、フォームサブミットされ、バリデーションOKになればフォームアクションハンドラ(onAction)がサブミット変数$submitを引き数にコールされます。
サブミットされる値をセキュアにする機構があります。フォームアクションメハンドラ内では$_GET/$_POSTといったRawデータは用いずに引き数として渡される (array)$submitを使用するようにします。以下の条件を満たしたフォームエレメントのみ$submitとして渡されます。
- BEAR_FormクラスでaddElementされている
- バリデーションでNGが出ていない
- ラジオボタン、セレクトボックスの場合は登録した値内での値(addRuleでバリデーションをしなくても制限有効)
_
(アンダースコア)でフォーム名が始まっていない
サブミットボタンやユーザーが定義した"モード”を表す変数や、フォームにとって本質的でない変数は_
で始める変数にしておくとよいでしょう。フォームとして機能しても、フォームアクションハンドラに$submitとして渡されません。
フォームは自動でセッショントークンを含んだワンタイムトークンが_tokenとして発行されます。(_
で始まるフォームエレメントなので$submitには渡りません)。このトークンを使ってCSRF(クロスサイトリクエストフォージェリ)を防止したり2重投稿をしない機構(POE=Post Once Exactly)が使用できます。
登録外のフォームオブジェクトを不正にクライントから送信しても受信されません。つまり$submit['name'] か$submit['gender']しか期待してないページで他の連想配列がサブミットされても受信しません。また$submit['gender'] に0=男性、1=女性としてしかFormに登録していないときになんらかの方法で”2”がサブミットされてもそれを受け取りません。またnullが入力されていてもそれを無視しSQLインジェクションの可能性を低下させます。
フォームが複数あるマルチフォームのページではonAction<フォーム名>としてフォーム別のアクションメソッドが用意できます。 onActionが用意されてる場合はフォーム共通アクションとして機能します。LoginフォームがあるときonAction(), onActionLogin() の順でコールされます。
public function onActionLogin(array $submit)
{
}
public function onActionEntry(array $submit)
{
}
文字コードや絵文字変換はフレームワークが自動的に行なわれます。フォームからサブミットされた文字列も絵文字はエンティティに、文字コードはUTF-8に変換されて$submitとして渡されページ内で処理できます。基本はUTF-8、DocomoとAUの場合にのみSJISでページはSJISです。
ページクラスからユーザーエージェントに応じて文字コードを変換したり、テンプレートを出し分けたりする処理は記述する必要はありません。それらはBEARフレームワークの仕事です。
この絵文字と文字コードの自動判別と自動変換の仕組みがあるので、携帯で絵文字投稿可能でもソース、DB、テンプレート、全てUTF8で記述することができます。
絵文字エンティティは3キャリアで全て独立しています。DBから絵文字エンティティ読み込む時にキャリアの情報がなくても表示のときに正しい絵文字バイナリに展開されます。