sfFormで確認画面を作るためのhidden作成

テンプレート内では、通常の要素表示(sfFormField->renderが呼び出される)の記述のまま、freezeされた場合はinputタグなどの表示から、入力値+hiddenタグの表示に自動的に切り替わるようにしてみました。

やっぱり皆やることは同じですねw

Ajaxが使える場合はUIを巧く利用することで確認画面を無くしても問題ないことが多いですが、案件内容によっては確認画面が必須だったりしますよね。

[追記]
確認画面部分をsfFormに拡張できるプラグインがあることをコメントいただきました。
http://www.open-force.info/index.php/blog/show/l/54
こちらを使ったほうが簡単に実装できそうです。

で、私の場合は以下のようなメソッドをフォームクラスに追加することでHTML_QuickFormのfreeze,unfreezeを実装してみました。

  /**
   * for freeze feature
   */
  public $isFreeze = false;
  protected static $valuesBeforeFreeze = array();
  protected static $widgetSchemaBeforeFreeze = null;
  public function setHiddenAll()
  {
    self::$valuesBeforeFreeze = $this->getValues();
    self::$widgetSchemaBeforeFreeze = clone $this->getWidgetSchema();
    foreach ($this->getWidgetSchema()->getFields() as $id => $v) {
      // CSRF token is set by automate, so except !
      if ($this->getCSRFFieldName() == $id) continue;
      $this->widgetSchema[$id] = new sfWidgetFormInputHidden(array(), array('value' => $this->getValue($id)));
    }
  }
  public function unfreeze()
  {
    $this->setwidgetSchema(self::$widgetSchemaBeforeFreeze);
    $this->setDefaults(self::$valuesBeforeFreeze);
    $this->isFreeze = false;
  }
  public function freeze()
  {
    $this->setHiddenAll();
    $this->isFreeze = true;
   }

やっていることは既に定義したsfWidgetSchemaをcloneでコピーしておき、各フィールドをsfWidgetFormInputHiddenで再作成するようにしています。そして、unfreeze時にはコピーしたスキーマを再セットしています。

これでアクション側で

$this->form->freeze();

とすればテンプレートで

echo $this->form;

とするだけで全てhiddenで書き出されます。

freezeされているかどうかは

$this->form->isFreeze

で確認できるはず。

というわけで、晒しておきますがおかしなところがあればご指摘ください。。