Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

性別や職業、都道府系といった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) }}

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

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

poego
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした