Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
8
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@poego

EC-CUBE3でフォームにMasterDataを利用したSelectBoxとかの作り方

性別や職業、都道府系といったMasterData(mtb_XXX)を利用したフォームを作成する時は多い。
この実装方法が、2.13系と、3系では、当然結構違う。

細かな仕組みは省略して、どう書かなきゃいけないかだけメモしておく。

例として、会員登録のFormに追加した時を上げている。

3.0のソースで以下の箇所を見ながらだと理解しやすいかと

- src/Eccube/Controller/conEntryContoroller.php
- src/Eccube/Form/Type/.php
- src/Eccube/ServiceProvider/EccubeServiceProvider.php
- src/Eccube/View/Entry/
.twig
- src/Eccube/Entity/Master/*

入力フォームでマスターデータを用いたセレクトボックスの作り方

1. Custom Form Field Typeを作る

例として職業のセレクトボックス(JobType.php)を作る。
すでに同様の実装をおこなっているsrc/Eccube/Form/Type/PrefType.phpをコピーして、PrefType.phpと同じディレクトリに、JobType.phpとする。

利用するMasterDataと紐づくEntityにあわせて以下の箇所を書き換える

- 'class' => 'Eccube\Entity\Master\Pref'
+ 'class' => 'Eccube\Entity\Master\Job'

getNameも修正


public function getName()
    {
-        return 'pref';
+        return 'job';
    }

2. 作成したCustom Form Field TypeをServiceProviderに登録

src/Eccube/ServiceProvider/EccubeServiceProvider.php の以下の辺りに追記


$app['form.types'] = $app->share($app->extend('form.types', function ($types) use ($app) {
            $types[] = new \Eccube\Form\Type\NameType();
            $types[] = new \Eccube\Form\Type\TelType();
+           $types[] = new \Eccube\Form\Type\JobType();

3. CustomerType.php から利用する

 public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $app = $this->app;

        $builder
            ->add('name', 'name', array(
                'options' => array(
                    'attr' => array(
                        'maxlength' => 50,
                    ),
                    'constraints' => array(
                        new Assert\NotBlank(),
                    ),
                ),
            ))
~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~
+           ->add('job', 'job', array(
+                'required' => false,
+           ))
~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~

4. テンプレートにフォームを記載

後はTwigのテンプレートファイル(src/Eccube/View/Entry/index.twig)に以下のように書く

                 <tr>
                    <th>職業</th>
                    <td>
                        {{ form_widget(form.job) }}<br />
                        {{ form_errors(form.job) }}
                    </td>
                </tr>

とくに問題がなければ、これだけでFormが表示される。

確認画面等での見せ方

上でフォームが作れていたら表示はもっと簡単。

2.13までのイメージだと以下のような記載をしていたものを

$arrJobs[$form.job_id]

3.0からは編集と同様に

{{ form_widget(form.job) }}

これだけで表示される。実に簡単。

もしこれでちゃんと表示されないならもろもろ別途確認

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
8
Help us understand the problem. What are the problem?