バージョン選択

フォーラム

メニュー

オンライン状況

66 人のユーザが現在オンラインです。 (57 人のユーザが フォーラム を参照しています。)
登録ユーザ: 1
ゲスト: 65
mi-chan もっと...

サイト内検索

質問 > フロント機能 > 条件付きバリデーション

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
h_tanaka
投稿日時: 2019/4/4 15:23
対応状況: 解決済
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1646
条件付きバリデーション
EC-CUBE 4.0.2

ラジオボタンに「0」「1」という値を持たせ、「1」が選択されたときにテキストフィールドの入力を必須にしたいです。

調べながらいろいろと試していますが、うまくいきません。
どうすれば実現できるでしょうか?

app/Customize/Form/Type/Front/SenderType.php
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('slip_sender_choice', ChoiceType::class, [
                'choices'  => [
                    '代表者住所と同じ' => 0,
                    'その他' => 1,
                ],
                'required' => true,
                'expanded' => true,
                'constraints' => [
                    new Assert\NotBlank(),
                    new Assert\Callback(array($this, 'validate_slip_sender')),
                ],
            ])
    }

    // 配送伝票の送り主のバリデーション
    public function validate_slip_sender($value, ExecutionContext $context) {
        $form = $context->getRoot();
        $data = $form->getData();

        if ($value == 1) {

            // パターン1
            $context->validateValue($data['slip_sender_phone_number'], array(    // ★ UndefinedMethodException になる
                    new Assert\NotBlank(),
                ), 'slip_sender_phone_number');

            // パターン2
            if (empty($data['slip_sender_phone_number'])) {
                $context->buildViolation('入力してください。')
                    ->atPath('slip_sender_phone_number')    // ★ slip_sender_phone_number ではなく slip_sender_choice に紐づくエラーになってしまう
                    ->addViolation();
            }
        }
    }
nyorai
投稿日時: 2019/4/5 9:51
対応状況: −−−
仙人
登録日: 2015/8/21
居住地:
投稿: 302
Re: 条件付きバリデーション
このあたりを参考にされると良いかと思います
https://qiita.com/chihiro-adachi/items/a92c607d0e84a7662c89
h_tanaka
投稿日時: 2019/4/5 17:51
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1646
Re: 条件付きバリデーション
nyorai さん
ありがとうございます。

ただ、そちらは Controller での書き方のようです。
FormType 内で同じように書こうと思ったのですが、FormType で $app を取得する方法がわかりません。。

app/Customize/Form/Type/Front/SenderType.php
    /**
     * @param EccubeConfig $eccubeConfig
     */
    public function __construct(EccubeConfig $eccubeConfig)
    {
        $this->eccubeConfig = $eccubeConfig;
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $validator = $app['validator'];    // ★ どうやって取得する?

        $builder
            ->add('slip_sender_choice', ChoiceType::class, [
                'choices'  => [
                    '代表者住所と同じ' => 0,
                    'その他' => 1,
                ],
                'required' => true,
                'expanded' => true,
                'constraints' => [
                    new Assert\NotBlank(),
                ],
            ])
    }


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

umebius
投稿日時: 2019/4/6 10:32
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: 条件付きバリデーション

方法は非常にたくさん考えられますが
バリデーショングループを使う方法なんか楽で分かりやすいです。

ラジオが1の場合のGROUPを作るイメージです。

https://symfony.com/doc/3.4/form/validation_groups.html


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

umebius
投稿日時: 2019/4/6 10:36
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: 条件付きバリデーション
あと、上の記事は$app['validator']はあえて使わなくても良いと思います。
emptyとか正規表現でチェックしてやれば。
h_tanaka
投稿日時: 2019/4/8 14:29
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1646
Re: 条件付きバリデーション
umebius さん

ありがとうございます!

バリデーショングループを使う方法は、実装方法がわからなかったため諦めました。

$app['validator'] を使わないやり方でうまく動作するようになりました。

app/Customize/Form/Type/Front/SenderType.php
            // 条件付きバリデーション
            ->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event) {
                $form = $event->getForm();
                $data = $event->getData();
                if ($data['slip_sender_choice'] == 1) {
                    if (empty($data['slip_sender_postal_code'])) {
                        $form['slip_sender_postal_code']->addError(new FormError(trans('This value should not be blank.', [], 'validators')));
                    }
                    if (empty($data['slip_sender_pref'])) {
                        $form['slip_sender_address']['slip_sender_pref']->addError(new FormError(trans('This value should not be blank.', [], 'validators')));
                    }
                    if (empty($data['slip_sender_addr01'])) {
                        $form['slip_sender_address']['slip_sender_addr01']->addError(new FormError(trans('This value should not be blank.', [], 'validators')));
                    }
                    if (empty($data['slip_sender_addr02'])) {
                        $form['slip_sender_address']['slip_sender_addr02']->addError(new FormError(trans('This value should not be blank.', [], 'validators')));
                    }
                    if (empty($data['slip_sender_phone_number'])) {
                        $form['slip_sender_phone_number']->addError(new FormError(trans('This value should not be blank.', [], 'validators')));
                    }
                }
            })


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,865名です
総投稿数は109,998件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2313
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1295
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.