Webtech Walker

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);
}

ベースができてしまえば後はフォーム量産するのみなのでベースができるまでももう少しがんばる。

このエントリーをはてなブックマークに追加