スポンサーサイト

0

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


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

    symfony+Ajaxでhierselectを実現!

    0
      えーっとついさっきsymfonyにはhierselectがない!と騒いでましたが、解決しました(^^;
      ちゃんと調べて実験してからメモ書きましょう。。。>自分

      参考にしたのはsymfony本家のCode Snippetにあったコード。
      Code Snippetは「色々な人がsymfonyを使ってこんなことできたよ!」を晒してくれる場所です。

      ⇒⇒Select with a onChange remote function option
      そのまんま、onChangeとremote_functionを使って連動するセレクトBOXを作る方法。
      ちなみに、javascript無効なブラウザでも大丈夫なように手当がされています。(多分)

      私のコードは以下の通りです。
      #gdgdで恥ずかしいけど誰かの役に立つことを願って公開しておきます。
      ■Areaテーブル@DB
      id: integer 主キー
      pref: varchar 都道府県名
      city: varchar 市町村名

      ■actions > actions.class.php

      public function executeForm()
      {
      if($this->getRequest()->getMethod()!=sfRequest::POST)
      {
      //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);
      }
      else
      {
      //送信後の処理(DB登録とか)をここに書く
      }
      }

      public function executeGetArea()
      {
      //ajaxからのリクエストのみ許可
      if($this->getRequest()->isXmlHttpRequest()){
      //DBのprefカラムが指定した都道府県になっている市町村のリストを取得
      $c=new Criteria();
      $c->addAscendingOrderByColumn(AreaPeer::ID);
      $c->add(AreaPeer::PREF, $this->getRequestParameter('pref'));
      $this->areas=AreaPeer::doSelect($c);
      }
      }

      ■templates > formSuccess.php

      (オブジェクトヘルパー使用の宣言)
      (javascriptヘルパー使用の宣言)
      (フォームタグ開始の宣言)

      <?php echo select_tag('pref',objects_for_select($prefs,'getPref','getPref'),
      array(
      'onChange'=>remote_function(array(
      'update' => 'cities',
      'url' => 'hoge/getarea',
      'with' => "'pref=' + this.options[this.selectedIndex].value"
      ))
      )) ?>
      <span id="cities">
      <?php echo select_tag('area_id',objects_for_select($areas,'getId','getCity')) ?>
      </span>

      (submitとかresetとか)
      </form>

      ■templates > getAreaSuccess.php
      <?php echo select_tag('area_id',objects_for_select($areas,'getId','getCity')) ?>


      ■■いらんと思うけど解説■■
      やりたいことは、
      1.フォームを表示すると、都道府県と市町村のselect boxがある。この時点では都道府県・市町村どちらも全国全ての都道府県・市町村がある。

      2.都道府県のselect boxで何か選ぶと、市町村のselect boxは、自動的に(ajaxがここで働く)選ばれた都道府県に対応する市町村だけに絞り込まれる。
      というもの。

      原理は、
      都道府県select boxのonChangeで動き出すsymfonyのremote_functionヘルパーが、urlに指定されたアクションgetAreaを呼び出す。その際urlの後ろにwith(パラメータ)をくっつけてくれる。
      getAreaはパラメータ(都道府県名)を受け取って、DBから都道府県に対応する市町村データを取り出し、それをviewにつっこんだものをremote_functionに返す。
      remote_functionはupdateで指定されたHTML要素内を、元々の記述からgetAreaが返してきたviewに書き換える。(今回はspanを使いましたが、divでもtdでもid属性がつけられれば何でもOKみたいです。divとtdは実験済み)

      code snippet投稿者のmlier氏に多謝!


      スポンサーサイト

      0

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

        コメント
        'with' => "'pref=' + this.options[this.selectedIndex].value"
        の部分の書き方が分からなくて苦戦していましたが、サンプルコードのおかげで解決しました!

        ありがとうございます。
        • ビギナーシンフォニアン
        • 2009/05/26 10:07 AM
        コメントする








           
        この記事のトラックバック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