Memo

メモ > 技術 > CMS: ECCube > カスタマイズ: バリデーションの調整

カスタマイズ: バリデーションの調整
FormTypeのカスタマイズ - < for EC-CUBE 4.0 Developers /> https://doc4.ec-cube.net/customize_formtype フォームの入力項目に独自のバリデーションルールを追加する - 320321.net https://320321.net/2020/11/ec-cube4-add-validation-rule/ バリデーションは、FormExtension拡張してカスタマイズするのがお作法となっている 具定例として、電話番号のバリデーションを改良してみる 標準の入力チェックでは、電話番号は「数字でなければエラー」としかチェックされない これを「ゼロからはじまる10桁もしくは11桁の数字で入力されなければエラー」としてみる 以下のファイルを確認すると、電話番号のバリデーションは PhoneNumberType が使用されている src\Eccube\Form\Type\Front\EntryType.php PhoneNumberTypeは以下にある src\Eccube\Form\Type\PhoneNumberType.php 上記ファイルをもとに、以下のファイルを作成する app\Customize\Form\Extension\PhoneNumberTypeExtension.php
<?php namespace Customize\Form\Extension; use Eccube\Common\EccubeConfig; use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Validator\Constraints as Assert; use Eccube\Form\Type\PhoneNumberType; use Symfony\Component\Form\FormError; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\FormInterface; use Symfony\Component\Validator\ConstraintViolationListInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; use Symfony\Component\DependencyInjection\ContainerInterface; class PhoneNumberTypeExtension extends AbstractTypeExtension { /** * @var EccubeConfig */ private $eccubeConfig; /** * @var ValidatorInterface */ protected $validator; /** * @var ContainerInterface */ protected $container; public function __construct(ContainerInterface $container, ValidatorInterface $validator, EccubeConfig $eccubeConfig) { $this->eccubeConfig = $eccubeConfig; $this->validator = $validator; $this->container = $container; } /** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { // 全角英数を事前に半角にする $builder->addEventSubscriber(new \Eccube\Form\EventListener\ConvertKanaListener()); $builder->addEventSubscriber(new \Eccube\Form\EventListener\TruncateHyphenListener()); // 電話番号 バリデーション $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) { $form = $event->getForm(); $data = $form->getData(); if (!empty($data)) { if (!preg_match('/^0\d{9,10}$/', $data)) { $form->addError(new FormError('電話番号はゼロからはじまる10桁もしくは11桁の数字で入力してください')); } } }); } /** * {@inheritdoc} */ public function getExtendedType() { return PhoneNumberType::class; } }
これで注文時のお客さま情報入力、お問い合わせ入力、管理画面など、 電話番号の入力部分でバリデーションルールが変化する なお、上記バリデーションの正規表現は以下を参考にしている まれによく使う正規表現 - Qiita https://qiita.com/ken97/items/9276f59f3148bb8fbe67 ただし、今後は14桁の電話番号も使われる予定があるらしい 今の時点から、桁数制限は「最大14桁」としておく方が無難そう 総務省、M2M用の「020」番号を14桁化へ - ケータイ Watch https://k-tai.watch.impress.co.jp/docs/news/1219218.html ■制約の追加 バリデーター内で使う制約を追加するなら、 src/Eccube/Validator/EmailValidator/NoRFCEmailValidator.php や vendor/symfony/validator/Constraints/Length.php を参考に app/Customize/Validator/Constraints 内に作成するのが良さそう

Advertisement