0
votes

I am working with cakephp. I need to add three validation on email field. First validation if email not given, second for valid email address, third if email address is given then it should be unique. Because its a signup form.

How I have add three validations on one field I try with the following code but it did not work for me.

public $validate = array(
        'email' => array(
            'email' => array(
                'rule' => array('email'),
                'message' => 'Invalid email address',
                'allowEmpty' => false,
                //'required' => false,
                //'last' => false, // Stop validation after this rule
                //'on' => 'create', // Limit validation to 'create' or 'update' operations
            )
        ),
        'email' => array(
                'rule'    => 'isUnique',
                'message' => 'Email already registered'
            ) 
);
3

3 Answers

14
votes

You have two identical indexes 'email' which PHP won't allow you. Change to something like:-

array(
    'email' => array(
        'notEmpty' => array(
            'rule' => 'notEmpty',
            'message' => 'Provide an email address'
        ),
        'validEmailRule' => array(
            'rule' => array('email'),
            'message' => 'Invalid email address'
        ),
        'uniqueEmailRule' => array(
            'rule' => 'isUnique',
            'message' => 'Email already registered'
        )
    )
);

Otherwise only one of your rules will be used.

1
votes

As of cakephp 3.0 in the entities table it should look something like this

namespace App\Model\Table;

public function validationDefault($validator)
{
$validator
    ->email('email')
    ->add('email', 'email', [
        'rule' => [$this, 'isUnique'],
        'message' => __('Email already registered')
    ])
    ->requirePresence('email', 'create')
    ->notEmpty('email', 'Email is Required', function( $context ){
        if(isset($context['data']['role_id']) && $context['data']['role_id'] != 4){
            return true;
        }
        return false;
    });
 return $validator;
 }
}


function isUnique($email){
$user = $this->find('all')
    ->where([
            'Users.email' => $email,
      ])
    ->first();
    if($user){
        return false;
    }
    return true;
}
0
votes

What version of Cakephp do you use?

Because I think if you use 2.3, it should be:

public $validate = array( 'email' => 'email' );

with the field email in your SQL table set as a primary key.