cakePHPでメールアドレスの変更を行いたいと考えています。
変更用のテーブルとして、emailsテーブルを作り、そこに変更用のメールを認証したいと考えていますが、バリテーションのところで
メールアドレスのdiffのチェックと、Usersテーブルの情報を扱うことがうまくいっておりません。
主にやりたいことは2点です。
①現在のメールアドレスをhiddenタグにいれてユーザが今使っているメールアドレスが入力されていたら、「変更先のメールアドレスを入力してください。」とエラーを出す
②ユーザテーブルを参照して、メールアドレスに他のユーザのメールアドレスと同じだったら「そのメールアドレスは既に存在しています」とエラーを出す。
view add.ctp
PHP
1<?= $this->Form->create($email); ?> 2 <?= $this->Form->hidden('user_id', ['value' => $this->request->session()->read('Auth.User.id')]); ?> 3 <?= $this->Form->hidden('current_email', ['value' => $this->request->session()->read('Auth.User.email')]); ?> 4 <?= $this->Form->input('change_email',['placeholder' => '変更先のメールアドレスを入力','label' => 'Emailアドレス']); ?> 5 <?= $this->Form->hidden('ukey',['value' => strtr(substr(base64_encode(openssl_random_pseudo_bytes(64)),0,64),'/+','_-')]); ?> 6 <?= $this->Form->button('送信');?> 7 <?= $this->Form->end();?>
model Mailstable.php
PHP
1 2 $validator 3 ->requirePresence('change_email', 'create') 4 ->notEmpty('change_email', 'メールアドレスを入力してください。') 5 ->add('change_email', 'compare', ['rule' => ['compareWith', 'current_email'], 'message'=>'変更先のメールアドレスを入力してください。'])//同じものではなく、違うということを比較したい。 6 ->add('email', 'existemail', [ 7 'rule' => [$this, 'existemail'], 8 'message' => 'そのメールアドレスは既に登録されています。',//userテーブルを参照して、同じものがあったらすでに登録されています的なエラーを出したい。 9 ]) 10 ; 11 12 public function existemail($value, $context) 13 { 14 $table = $context['providers']['table'];//どうここで他テーブルを扱うか。ここではusersテーブルを扱いたい 15 $query = $table->find()->where(['email' => $value]);//どうqueryをなげていくか。users.emailではエラーがでた。 16 $query->where([$context['field'] => $value]); 17 if(!empty($context['data'][$table->_primaryKey])) {//自身IDを除外 18 $query->where([$table->_primaryKey.' !=' => $context['data'][$table->_primaryKey]]); 19 } 20 $count = $query->count(); 21 return (bool) $count == 0; 22 }
その他
hiddenタグでcurrent_emailはsessionの情報を使うのではなく、同じくusersテーブルの情報を使ってチェックしたほうがいいでしょうか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/27 13:16
2016/10/27 15:13
2016/10/27 16:06
2016/10/27 20:45
2016/10/27 23:53
2016/10/28 00:13 編集
2016/10/28 00:21 編集