前提
- CakePHP 2x
実現したいこと
radioボタンの項目によってバリデーションを有効/無効にしたい
問題点
メールと電話普通にバリデーションを書くだけだと
両方のバリデーションが動くため、未入力だと先に進めない。
かといってバリデーションなしだとUXが悪くなる。
実装イメージ
contact_kindのkeyがメールの値ならemailのバリデーションのみ有効
contact_kindのkeyが電話の値ならphoneのバリデーションのみ有効
参考コード
ビューファイル
views/root/index.ctp
ctp
1<?php echo $form->create(array('inputDefaults' => array('label' => false, 'div' => false, 'legend' => false), 'url' => true, 'id' => 'entry_form', 'class' => 'entry-form h-adr')); ?> 2 3ご希望連絡方法 4<?php echo $form->input('contact_kind', array('type' => 'radio', 'class' => 'contact_method inquiryRadio', 'options' => $select_data['contact_kind'], 'label' => true,)); ?> 5 6メールアドレス 7<?php e($form->input('email', array('div' => false, 'label' => false, 'class' => 'input zen_han', 'placeholder' => '例 example@example.jp'))); ?> 8 9電話番号 10<?php e($form->input('phone', array('div' => false, 'label' => false, 'class' => 'input zen_han', 'placeholder' => '例 09012345678'))); ?> 11 12<?php echo $form->end(); ?>
モデルファイル(バリデーション)
models/contact.php
php
1<?php 2 class Contact extends AppModel { 3 var $name = 'Contact'; 4 5 var $validate = array( 6 'contact_kind' => array( 7 'notempty' => array( 8 'rule' => array('notempty'), 9 'message' => '選択必須項目です', 10 'last' => true, // Stop validation after this rule 11 ), 12 ), 13 'email' => array( 14 'notempty' => array( 15 'rule' => array('notempty'), 16 'message' => '必須項目です', 17 'last' => true, // Stop validation after this rule 18 ), 19 'email' => array( 20 'rule' => 'email', 21 'message' => '正しいメールアドレス形式ではありません。', 22 ), 23 ), 24 'phone' => array( 25 'notempty' => array( 26 'rule' => array('notempty'), 27 'message' => '必須項目です', 28 'last' => true, // Stop validation after this rule 29 ), 30 'between' => array( 31 'rule' => array( 'custom', '/^(0{1}\d{1,4}-{0,1}\d{1,4}-{0,1}\d{4})$/'), // ハイフンありとなし両方許容 32 'message' => '正しい電話番号形式ではありません。', 33 'last' => true, // Stop validation after this rule 34 ), 35 ), 36 ); 37 } 38?>
cakeの環境が手元に無いですが、出力されるHTMLを提示いただればjsで対応できそうな気がします
CakePHPのFormヘルパーの出力HTML
ブラウザのソースコードからそのままコピペしました
```html
ご希望連絡方法
<input type="hidden" name="data[Contact][contact_kind]" id="ContactContactKind_" value="" /><input type="radio" name="data[Contact][contact_kind]" id="ContactContactKind1" class="contact_method inquiryRadio" value="1" /><label for="ContactContactKind1">メール</label><input type="radio" name="data[Contact][contact_kind]" id="ContactContactKind2" class="contact_method inquiryRadio" value="2" />
メールアドレス
<input name="data[Contact][email]" type="text" class="input zen_han" placeholder="例 example@example.jp" maxlength="200" id="ContactEmail" />
電話番号
<input name="data[Contact][phone]" type="text" class="input zen_han" placeholder="例 09012345678" maxlength="200" id="ContactPhone" />
```

回答2件
あなたの回答
tips
プレビュー