ぷぎがぽぎ このページをアンテナに追加 RSSフィード

2008-11-28

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

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

Symfonyと格闘・・・ - iNNX Life - real side

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

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

[追記]

確認画面部分をsfFormに拡張できるプラグインがあることをコメントいただきました。

Openforce

こちらを使ったほうが簡単に実装できそうです。

で、私の場合は以下のようなメソッドをフォームクラスに追加することで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

で確認できるはず。

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

innx_hidenoriinnx_hidenori 2008/11/28 18:53 おー、こういう方法がありましたか!
この方法でhidden値のカタマリのFORMは簡単に作れそうですねぇ。ウマいです。


ちなみに、おそらく(使う状況から考えて)問題になることはないと思うのですが、以下のような書き方をした場合、hiddenになっていないウィジェットが表示される可能性はあるかと思います。
(そういう裏技!ということでも良いかもしれませんw)


A.アクション内で $this->form->freeze() を呼び出す前に、
  foreach( $this->form as $value ) {} や、
  $this->form['hoge']->getValue();
など、フォーム要素を参照する処理がある。
(freezeの後であれば問題ないです)


B.テンプレートで個別フォーム要素を直接表示しようとしている場合
  echo $form[ 'hoge' ]


このAとBの両方の条件に当てはまる場合、freezeされていないウィジェットが出てくるようです。
かなり特殊な状況だと思いますが・・・・。
(まだまだ勉強不足なので、私が何か認識間違いなコードを書いているかもしれません!
 その場合はすみませんw)

brtRiverbrtRiver 2008/11/29 20:33 裏技がありましたかw
できればどんな場合でもhiddenが表示されるようにしたいですねー。
また時間があるときに考えてみます。

田舎の開発者田舎の開発者 2008/12/17 11:45 http://www.open-force.info/index.php/blog/show/l/54
私はこちらのプラグインを拡張して使っています。
wigdet毎に文字列としての表現を行う方法を微妙に変えないといけないので、そのあたりをうまく実装しているこのプラグインは(土台として)便利に使っていますね

brtRiverbrtRiver 2008/12/17 12:56 おぉ。プラグインを作ってらっしゃる方がいたんですね。
使い方しか見てませんがスマートに拡張できそうでいいですね。
このことについて追記しておきました。ありがとうございます。

田舎の開発者田舎の開発者 2008/12/23 21:27 早速の対応、ありがとうございます。
このプラグインはflushを使って値を持ちまわしているので、Hiddenでまわすには少々テクニックが必要です。
一応、継承を使ってそのあたりを実装したモノが手元にあるのですが、見てみます?
もっとも今のプロジェクトで実際に使っているものなので、公開するのは一応PMの許可をもらってからの方がいいでしょうね。

あと、こんなモノも作ってみましたので、もしよろしければ試してみてください。
http://shinshu.fm/MHz/52.04/archives/0000252139.html

brtRiverbrtRiver 2008/12/26 11:12 flushで持ち回すのが一番楽ですからね。ただ、Ajaxを使ってたりした場合は厳しい場合もありそうですね。
継承版ももし公開できるようでしたらお願いします。きっと同じようなことを考えている人は多いとおもいますし。

symfonyAdminいいですねー。共用サーバー系などでは重宝されますね。
symfony1.0のころは同じような機能を持つプラグインがあった気がしますが今はないようですね。

田舎の開発者田舎の開発者 2009/01/06 20:15 あけましておめでとうございます。今年も宜しくお願いいたします。
ということで、PMのOKがもらえましたので以下のURLで公開します>継承版
http://shinshu.fm/MHz/52.04/archives/0000266840.html
もしよろしければ見てみてください。

SymfonyAdmin、お試しいただきありがとうございます。テストサーバを複数で共有する場合などには便利に使っていただけると思います。
ただし(readmeにしつこく書いていますが)SymfonyAdminは存在自体がセキュリティホールそのものですので、間違ってもThe Internetから見える所には置かないでくださいね(苦笑

2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |