スポンサーサイト

0

    一定期間更新がないため広告を表示しています


    • 2014.12.23 Tuesday
    • -
    • -
    • -
    • -
    • -
    • by スポンサードリンク

    symfonyでhierselectができる!の補足(fillin時の手当)

    0
      昨日のsymfonyでhierselect実現!ですが、あのままではsymfonyのフィルイン機能を使った時に不具合があるのでちょっと補足メモ。
      #書いておかないと次のプロジェクトできっと同じところにハマるアフォな私…

      まず、symfonyのフィルイン(fillin)機能とは、
      1.ユーザーが間違ったデータを入力してsubmitボタンを押す(例:郵便番号の桁数違いとか)

      2.データを受け取ったアクションが間違いに気付いて(←validate機能)、入力フォームに戻す(handleError+アクション名のメソッドを定義して、sfView::SUCCESS)

      3.デフォルトのままではフォームの入力内容が全て消えてしまうが、それではユーザに対して不親切すぎるので、以前の入力内容を自動的にフォームに突っ込む(←これがfillin!)
      という感じ。

      脱線しまくりw
      fillinを有効にするには、validate.ymlファイルで
      fillin:
      enable: on
      と書けば良い。(アプリ全体のfilters.ymlファイルに書く方法もあるけど省略。)
      fillinを受ける側のフォームは、各input_tag等のフォームヘルパー関数の引数2つ目(デフォルト値を入れるところ)をnullにする。
      ※私は最初「''」を指定した状態でフィルインできませんでした。object系のフォームヘルパーを使ってDBからデフォルト値を持ってきてる場合はどうなるんだろう??今度実験してみよう…

      で、このフィルイン時に…
      私が作ったsymfony用のhierselectコードだけでは、hierselectのselectbox自体が壊れる(optionが何もないselect boxになってしまう)ので、handleErrorFormを下のように書きます。

      ■actions > actions.class.php

      public function handleErrorForm()
      {
      //1つ目のselect用に都道府県リストを用意
      $c= new Criteria();
      $c->setDistinct();
      $c->addAscendingOrderByColumn(AreaPeer::ID);
      $this->prefs= AreaPeer::doSelect($c);

      //javascript無効なブラウザ用の手当に使う市町村リストを用意
      $c2= new Criteria();
      $c2->addAscendingOrderByColumn(AreaPeer::ID);
      $this->areas= AreaPeer::doSelect($c2);

      return sfView::SUCCESS;
      }

      ※POST元のフォームとPOST先のアクションが同じ場合の書き方です

      ■■解説■■
      単純にreturn sfView::SUCCESSだけだと、フォームは表示できますがobjects_for_selectで使うオブジェクト$prefsと$areasが空っぽになるので、optionが無いselect boxができてしまうというわけ。
      ビューはSUCCESS時と同じものを使うけれど、バリデートエラーで表示されるフォームはあくまでエラーのアクションによって表示されるということなので。

      もし他のアクションの無い登録フォームだけのモジュールなら、オブジェクトを取ってくる部分をpreExecuteにつっこむといいかも?


      スポンサーサイト

      0

        • 2014.12.23 Tuesday
        • -
        • 10:58
        • -
        • -
        • -
        • -
        • by スポンサードリンク

        コメント
        コメントする








           
        この記事のトラックバックURL
        トラックバック

        PR

        calendar

        S M T W T F S
        1234567
        891011121314
        15161718192021
        22232425262728
        293031    
        << October 2017 >>

        twitter

        selected entries

        categories

        archives

        recent comment

        • 結局CodeIgniter用汎用Modelクラス&汎用CRUDスクリプトを書きました
          プログラマー
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          よし
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          ななうぇぶ
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          よし
        • icu4.4以上が用意できないサーバーでSymfony2.3以上を使う方法
          よし
        • WindowsのPCで開発するphperがxhprofを使う方法
          ななうぇぶ
        • WindowsのPCで開発するphperがxhprofを使う方法
          川本
        • [バッドノウハウ]Symfony2で別テーブルの集計項目を一覧に含めたいとき
          よし
        • Symfony Advent Calendar JP 2012 day 14 - vendorをcomposerで管理しているプロジェクトにcomposerを使わずにバンドルを追加したときのautoloadの書き方
          77web
        • Symfony Advent Calendar JP 2012 day 14 - vendorをcomposerで管理しているプロジェクトにcomposerを使わずにバンドルを追加したときのautoloadの書き方
          ktz

        recent trackback

        • HTMLの表(TABLE)のセル(TD)に斜線を引くjavascriptライブラリ slash.js 作っちゃいました
          常山日記
        • django対symfony 日本語メール送信(その1 symfony編)
          CPA-LABテクニカル
        • CodeIgniterでユーザー認証
          されどLAMPな日々
        • 久々にdjangoを最新版にしたらHTMLがエスケープされちゃった!!(解決済み)
          常山日記
        • FastCGIを諦めてmod_pythonを使う。Apacheのアップグレード
          サーバー用語集
        • さくらインターネット、sqlite3でdjango@CGI版を使う際の設定メモ
          常山日記
        • さくらインターネット スタンダードプランでdjango使ってる方、DBは?
          mitszoの日記
        • python多次元リストをsort(並べ替え)する方法?
          mitszoの日記
        • フォームから送信した値とrequest.POSTの挙動($_POST@PHPとの比較)
          Humming Via Kitchen
        • 日本語テキストをtruncate@django(Python全般にも??)
          常山日記

        recommend

        links

        profile

        search this site.

        others

        mobile

        qrcode

        powered

        無料ブログ作成サービス JUGEM