メモ > 技術 > 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 内に作成するのが良さそう