性別や職業、都道府系といった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) }}
これだけで表示される。実に簡単。
もしこれでちゃんと表示されないならもろもろ別途確認