エンジニ屋.com(エンジニヤドットコム)

分かりやすくを意識して情報発信!

【応用可】Formの必須に条件を付ける【Eccube4・symfony】

本記事は、下記画像のように登録方法という項目があったとして、もし「法人としての登録」を選択した場合のみ、会社名を必須にする方法を紹介します。 他のパターンでも応用可能なように少し詳しく解説も挟んでいきます!

会員登録画面

尚、登録方法の項目のように、オリジナルの項目を追加されていることを前提として、話を進めますので、先にこちらの記事をお読みいただいたほうが理解ができます。

enginiya.com

※Javascriptを使用しても対応可能ですが、本記事では、phpのみで実装していきます。

Formファイルに追記

修正するファイルは、Formが生成されているファイルの1つのみです。 手を加えるフォームは、会員画面なのでEntrytypeの拡張ファイルです。 app\Customize\Form\Extension\Front\EntryTypeExtension.phpに 下記のようにコードを書きます。 registration_typeというFormが作成されていますが、本記事では解説はしません。

<?php

namespace Customize\Form\Extension\Front;

use Eccube\Form\Type\Front\EntryType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormError;

class EntryTypeExtension extends AbstractTypeExtension
{
    public function getExtendedType()
    {
        return EntryType::class;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('registration_type',ChoiceType::class,[
                'required' => true,
                'choices' => [
                     trans('front.customer.corporation.label') => 0,
                     trans('front.customer.individual.label') => 1,
                ],
                'label' => false,
                'expanded' => true,
                'multiple' => false,
            ]);

        $builder
            ->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event){
                $form = $event->getForm()->get('company_name');
                /** @var Customer $data */
                $data = $event->getData();

                $registrationType = $data->getRegistrationType();
                if( $registrationType === 0){
                    if( $form->getData() === null ){
                        $form->addError(new FormError('登録方法が法人の場合は、必須となります。'));
                    }
                }
            });
    }
}

以上で実装完了ですが、他のパターンでも通用するように詳しく解説します。 addEventListenerというbuilderに用意された関数を使用します。こちらの関数で、Formの送信ボタンを押した時や、Formが生成されるときなど、イベントという形でコードをセットすることが出来ます。 第一引数に、どのタイミングでイベントを呼び出すか設定します。今回は、確認画面というボタンを押すタイミングなので、FormEventsのclassで用意されているPOST_SUBMITを設定します。名前の通り、Formをsubmitした時に発動します。 第2引数には、コールバック関数がセットされています。コールバック関数が詳しく理解したい方は、こちらの記事がとても分かりやすいので、参考してください。

tsuyopon.xyz

要するに、addEventListener()で定義された関数内の処理を行います。第2引数の値が返される処理があり、FormEvent $eventに値が格納され、引数で用意された関数が発動します。 $eventオブジェクトの中はFormのデータが格納されているので、$event->getForm()->get('company_name');でcompany_nameが設定されているFormを読み込んでいます。 次に、$event->getData();でPostのタイミングで発動なので、Formに格納された値を読み込んでいます。 getRegistrationTypeはEntityで設定した登録方法の値を呼び出すメソッドなので、ここで値を呼び出します。 if文で0が設定されていたら、次にcompany_nameの値を呼び出します。ここでもし値が空であれば、formにaddError()関数でエラー文を追加します。

以上となります。 文字だけなので分かりづらい部分があったとは思いますが、一度同じように作成して読み解いていくと理解が深まると思います。

最後に

Eccubeはsymfonyのフレームワークで構成されています。もし「自力でもっとカスタマイズしたい」や「仕事でEccubeで開発することになった」方には、下記のsymofony4 入門の参考書をおすすめします。
こちらの参考書にはEccubeのカスタマイズ方法については、記載されてませんがカスタマイズに必要な知識のEntity、Controller、twig、Repositoryなどの利用方法が非常に分かりやすく書かれています。筆者も仕事でEccubeに携わることとなり、参考書を購入し理解が深まりました。 symfonyはLaravelと密接している部分もありLaravelの構成部分の理解も深まり有益でした。
価格帯は若干高めですが、中身はしっかりしているので、購入して損はないと思います。