スポンサーサイト

0

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


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

    SonataAdminBundleでフォームや一覧表示を実用的にカスタマイズする方法(初歩編)

    0
      SonataAdminBundleとは、"The missing Symfony2 Admin Generator"というキャッチフレーズの通り、symfony1時代のAdmin Generatorのような機能が使えるバンドルです。
      つまり、いくつか決められた設定をするだけで、管理画面が自動で作られる使えるようになるバンドルというわけです。

      インストール方法・基本的な使い方などはバンドルのドキュメント(本家の英語版@最新,@okaponさんによる日本語翻訳@少し古い?)を見てください。

      さて、このSonataAdminBundle、便利な汎用バンドルにはありがちなことですが、少し変わったことをしようと思うと、工夫が必要になります。
      例えば、顧客の性別データを1=男性,2=女性,3=その他で管理しているとします。
      //src/Acme/DemoBundle/Entity/Customer.php
      class Customer
      {
          /**
           * @var integer
           *
           * @ORM¥Column(name="id", type="integer")
           * @ORM¥Id
           * @ORM¥GeneratedValue(strategy="AUTO")
           */
          private $id;
      
          /**
           * @var string
           *
           * @ORM¥Column(name="name", type="string", length=255)
           */
          private $name;
      
          /**
           * @var integer
           *
           * @ORM¥Column(name="seibetsu", type="integer")
           */
          private $seibetsu;
      }
      

      (この実装が良いかどうかは別として)これを前提として、SonataAdminBundleで通常通りに管理画面設定をすると、下記のようになります。
      // src/Acme/DemoBundle/Admin/CustomerAdmin.php
      
      use Sonata¥AdminBundle¥Admin¥Admin;
      use Sonata¥AdminBundle¥Datagrid¥DatagridMapper;
      use Sonata¥AdminBundle¥Datagrid¥ListMapper;
      use Sonata¥AdminBundle¥Form¥FormMapper;
      
      class CustomerAdmin extends Admin
      {
          protected $baseRouteName = 'admin_customer';
      
          /**
           * @param FormMapper $formMapper
           */
          protected function configureFormFields(FormMapper $formMapper)
          {
              $formMapper
                  ->add('name')
                  ->add('seibetsu')
              ;
          }
      
          /**
           * @param DatagridMapper $datagridMapper
           */
          protected function configureDatagridFilters(DatagridMapper $datagridMapper)
          {
              $datagridMapper
                  ->add('name')
                  ->add('seibetsu')
              ;
          }
      
          /**
           * @param ListMapper $listMapper
           */
          protected function configureListFields(ListMapper $listMapper)
          {
              $listMapper
                  ->addIdentifier('name')
                  ->add('seibetsu')
              ;
          }
      }
      

      フォーム表示
      一覧表示

      フォーム(登録・編集、絞込み)でselect,radioを使えるようにする

      まず、フォームで性別コード(1,2,3)を設定するのをやめたいと思います。
      いくら管理画面とはいえ不親切すぎますし、間違いやすいです。
      selectかradioで、男・女・その他のキャプションを見ながら選べるほうがいいですよね。

      最初に、性別専用のフィールドタイプを作ります。サービスとして登録するところまでやっておきましょう。
      作り方はこちら→カスタムフォームフィールドタイプの作成方法(日本語版)
      ※昨日翻訳を更新しておいたので最新版になってます!

      上記ドキュメントではm=Male,f=Femaleになっていますが、1=男,2=女,3=その他で作ります^^;
      フィールドタイプを作り終わったら、CustomerAdmin::configureFormFields()とCustomerAdmin::configureDatagridFilters()でseibetsuをaddするときに、第二引数として専用フィールドタイプのサービス名、つまりgenderを指定します。
          /**
           * @param FormMapper $formMapper
           */
          protected function configureFormFields(FormMapper $formMapper)
          {
              $formMapper
                  ->add('name')
                  ->add('seibetsu', 'gender')
              ;
          }
      
          /**
           * @param DatagridMapper $datagridMapper
           */
          protected function configureDatagridFilters(DatagridMapper $datagridMapper)
          {
              $datagridMapper
                  ->add('name')
                  ->add('seibetsu', 'gender')
              ;
          }
      

      これで、フォーム上の性別のウィジェットが性別選択専用のカスタムフィールドに変わりました。簡単でしたね:)
      変更後のフォーム表示

      一覧上で生の値でなくキャプションを表示させる

      フォームが直ったのでもう充分な気もしますが、一覧で性別コード(1,2,3)が表示されるのも直したいと思います。
      いくら管理画面とはいえ不親切(以下同文

      今度は、カスタムTwigExtensionを用意します。
      作り方はこちら→カスタムTwig拡張の書き方(日本語版)
      ※昨日翻訳したてのほやほやです。

      作るTwig拡張の内容は、【性別コード(1,2,3)を性別のキャプション(男,女,その他)に変換する】という機能をもつ関数にします。
      // src/Acme/DemoBundle/Twig/Extension/GenderNameExtension.php
      class GenderNameExtension extends ¥Twig_Extension
      {
          public function getName()
          {
              return 'acme_demo_gender_name';
          }
      
          public function getFunctions()
          {
              return array(
                  'gender_name' => new ¥Twig_Function_Method($this, 'getGenderName'),
              );
          }
          
          /**
           * @param string $value
           * @return string
           */
          public function getGenderName($value)
          {
              $list = array(
                  1 => '男',
                  2 => '女',
                  3 => 'その他',
              );
              
              return isset($list[$value]) ? $list[$value] : '-';
          }
      }
      
      専用TwigExtensionはサービスとして登録しておきます。
      これで、twigテンプレート側で{{ gender_name(1) }}のような形で呼び出すことで、性別コード→性別キャプションの変換ができるようになりました。

      専用のTwig関数ができたので、ここで、一覧表示の項目用のテンプレートを作ります。
      {# src/Acme/DemoBundle/Resources/views/sonata_customer_list_gender.html.twig #}
      {% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}
      {% block field %}
          {% spaceless %}
              {% if value is empty %}
                   
              {% else %}
                  {{ gender_name(value) }}
              {% endif %}
          {% endspaceless %}
      {% endblock %}
      

      このテンプレートをCustomerAdmin::configureListFields()でseibetsuのテンプレートとして指定したら、完了です。
          /**
           * @param ListMapper $listMapper
           */
          protected function configureListFields(ListMapper $listMapper)
          {
              $listMapper
                  ->addIdentifier('name')
                  ->add('seibetsu', 'string', array(
                          'template' => 'AcmeDemoBundle::sonata_customer_list_gender.html.twig',
                      ))
              ;
          }
      

      性別コードでなく性別キャプションのほうが表示されるようになりました。
      変更後の一覧表示

      実は私もまだ触り始めたばかりですが、SonataAdminBundleはちょっとした設定だけで色々カスタマイズができることがわかりました。現時点では、設定項目を網羅したリファレンス的なドキュメントが不足しているために、カスタマイズができるところがわかりにくいのが欠点かなと思います。
      今後に期待したいところです!


      スポンサーサイト

      0

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

        コメント
        コメントする








           

        PR

        calendar

        S M T W T F S
           1234
        567891011
        12131415161718
        19202122232425
        2627282930  
        << November 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