Domas
Domas

Reputation: 1133

CakePHP one form for multiple models does not validate properly

So I have two models, that are Company and User. Here are the relations:

Company:

public $hasMany = array(
'User' => array(
    'className' => 'User',
    'foreignKey' => 'company_id',
)

User:

public $belongsTo = array(
    'Company' => array(
        'className' => 'Company',
        'foreignKey' => 'company_id',
    )

And there is a form were both instances are being created. The problem is that only the Company fields are being validated and User is not. Even though the validation rules for just creating or editting a User work perfect. Here is the form in question:

echo $this->Form->create('Company', array('action'=>'register'));?>

     echo $this->Form->input('Company.name', array('label'=>__('Company name*')));
     echo $this->Form->input('Company.address', array('label'=>__('Address*')));
     echo $this->Form->input('Company.city', array('label'=>__('City*')));
     echo $this->Form->input('User.0.name', array('label'=>__('Name*')));
     echo $this->Form->input('User.0.email', array('label'=>__('Email*')));
     echo $this->Form->input('User.0.email_confirmation', array('label'=>__('Email confirmation')));


echo $this->Form->end(array('label'=>'Save', 'onclick'=>'disableSubmit(this)')); 

I am fully aware of the validate only option, but I wonder what is the proper way to make validation work.

Any help or guidance is much appreciated.

As requested, I provide the Model logic as well:

    public function registerCompany($data){


    unset($this->User->validate['company_id']);

    if($this->saveAll($data, array('validate'=>'only'))){
    if($this->saveAssociated($data)){                                                                                                     
        return true;
    }
}else{

             return false;
         }
    }

Here are some of the validation rules of User model, there are two different validation types for REST service and for web client, so this is for the web client only. NOTE: it works all good on single user create/edit:

$this->validate = array(

            'name'=>array(
        'Insert user name'=>array(
            'rule'=>'notEmpty',
            'message'=>'Insert user name',
            'last'=>false
        )
         )

Upvotes: 0

Views: 908

Answers (2)

ylerjen
ylerjen

Reputation: 4259

saveAll is a wrapper of saveMany and saveAssociated. So you don't have to call both methods.

Then, according to the Cake's doc, to unset a validation you should use the syntax : $this->Model->AssociatedModel->validate...

Should look like this :

public function registerCompany($data){
    unset($this->Company->User->validate['company_id']);
    if($this->Company->saveAssociated($this->request->data)){                                                                                 
        return true;
    }else{
        return false;
    }    
}

Upvotes: 0

user3270303
user3270303

Reputation:

Use this to validate:

Suppose you are saving the data from "Company Controller".

    if( $this->Company->saveAll(array('validate'=>only)){
          //your save logic here
    } else {
         //here form has some validation errors.
         debug($this->Company->validationErrors);
    }

Try this any reply....

Same you can do with "User"

    if( $this->User->saveAll(array('validate'=>only)){
          //your save logic here
    } else {
         //here form has some validation errors.
         debug($this->User->validationErrors);
    }

And

In form use this for user data:

echo $this->Form->input('User.name', array('label'=>__('Name*')));

Upvotes: 1

Related Questions