Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cakephp one form, multiple models, not displaying one model's validation messages

I have a registration form and I am creating a record in both User and Identity tables (a user hasMany identities)

the form looks like this

<?php echo $this->Form->create('User');?>
    <fieldset>
        <legend><?php __('Register'); ?></legend>
    <?php
        echo $this->Form->input('Identity.name');
        echo $this->Form->input('Identity.surname');
        echo $this->Form->input('User.username');
        echo $this->Form->input('User.pass');
        echo $this->Form->input('User.pass_confirm', array('type' => 'password'));      
        echo $this->Form->input('Identity.email');      
    ?>
    </fieldset>
<?php echo $this->Form->end(__('Submit', true));?>

I get all the validation error messages for User.* fields but Identity.* fields are shown without messages.

screenshot

validation rules:

Identity:

var $validate = array(
        'name' => array(
            'notempty' => array(
                'rule' => 'notempty',              
                'required' => true,
                'message' => 'Your name is required.'
            )
        ),
        'surname' => array(
            'notempty' => array(
                'rule' => 'notempty',              
                'required' => true,
                'message' => 'Your surname is required.'
            )
        ),
        'email' => array(
            'validateEmail' => array(
                'rule' => 'validateEmail',              
                'required' => true,
                'message' => 'The email seems invalid.'
            ),
            'notempty' => array(
                'rule' => 'notempty',
                'message' => 'You have to enter an email address.'
            )
        ),
    );

User:

var $validate = array(
        'pass' => array(
            'required' => array(
                'rule' => array('custom','/^.*[0-9].*$/i'),
                'message'=>'Password must contain numbers'),
            'length' => array(
                'rule' => array(
                    'minLength',8),
                    'message' => 'Password must be at least 8 characters long')
        ),
        'pass_confirm' => array(
            'required' => array(
                'rule' => 'notempty',
                'message' => 'You have to confirm the password'
            ),
            'length' => array( 
                'rule' => 'validatePassword',
                'message'=>'Your passwords don\'t match!' )
        ),
        'username' => array(
            'unique' => array(
                'rule' => 'validateUniqueUsername',
                'message' => 'Username is already taken, please choose a different one.'
            ),
            'notempty' => array(
                'rule' => 'notempty',
                'message' => 'You have to choose a username.'
            )
        ),
    );
like image 759
Elwhis Avatar asked Jan 12 '11 19:01

Elwhis


2 Answers

hasMany model's fields should be as array (when combined with parent model), see .0 added between field names

echo $this->Form->input('Identity.0.name');
echo $this->Form->input('Identity.0.surname');
...
echo $this->Form->input('Identity.0.email');
like image 58
Ish Avatar answered Oct 18 '22 12:10

Ish


One answer I found was on this page much about the same problem. The solution was to add the validate attribute to saveAll

if($this->Member->saveAll($this->data, array('validate'=>'only'))){
   //your custom save function
}
like image 5
marcandrepl Avatar answered Oct 18 '22 12:10

marcandrepl