nbhatti2001
nbhatti2001

Reputation: 363

cakephp notempty and unique validation on field

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'
            ) 
);

Upvotes: 0

Views: 14592

Answers (3)

Zachary Heaton
Zachary Heaton

Reputation: 66

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;
}

Upvotes: 1

Yvon-Rene Blanchard
Yvon-Rene Blanchard

Reputation: 1

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.

Upvotes: 0

drmonkeyninja
drmonkeyninja

Reputation: 8540

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.

Upvotes: 14

Related Questions