sfFormを継承したベースクラスを作る
symfonyのタスクでpropel:build-formsとかやると、モデルからBaseFormPropelというクラスを継承したものがつくられます(Doctrineの場合はBaseFormDoctrine)。
これは$form->save()とかやれて便利ではあるのですが、以下のような理由で僕は使ってません。
- formオブジェクトに共通の処理をもてない
- テストのしやすさなども考えると、モデルの処理はモデルに書きたい。
なので自分でsfFormを直接継承したクラスをつくって、それをモジュール毎に継承して使ってます。
class myFormBase extends sfForm
{
// 共通のメソッドとかsfFormのメソッド上書きしたりとか
}
ここに共通で使うcallbackのメソッドとか書いたりしてます。まだこのベースクラスをつくってる途中なので試行錯誤中です。
あると便利だナーと思ったのは、確認画面用に値を出力するメソッド。基本的に確認画面があるなんてことを想定されてないので$form->getValue('filed')とかの値ってescaping_strategyを有効にしててもエスケープされないんですよね。
あと、ラジオボタンで選択したラベルを表示とか、時間表示のメソッドもつくっておくと便利。
/**
* エスケープしたフィールドの値を返す
*
* @param string $filed
* @return string
*/
public function getEscValue($field) {
return sfWidget::escapeOnce($this->getValue($field));
}
/**
* ラジオボタンとかセレクトボックスのラベルの値を返す
*
* @param string $filed
* @return string
*/
public function getLabelValue($field) {
$choices = $this[$field]->getWidget()->getOption('choices');
$value = $this->getValue($field);
if (array_key_exists($value, $choices)) {
return $choices[$value];
}
}
/**
* 日付の配列を日付フォーマットに変換した値を返す
*
* @param string $filed
* @param string $format
* @return string
*/
public function getDateValue($field, $format = 'Y年m月d日') {
return myUtil::dateTimeArrayToString($this->getValue($field), $format);
}
ベースができてしまえば後はフォーム量産するのみなのでベースができるまでももう少しがんばる。
- Prev Entry:sfFormの汚染された値とクリーンな値について
- Next Entry:meca.jsにposition:fixedを追加した