cakephp 2.x multiple models(included optional) validation

364 views Asked by At

by + button a jquery function generates the fields,it is without model validation

As writing more complex app i faced some challenges. I have 2 models on the same page.Person and User(it is optional). I have to use model validation rules(inbuilt and a costume:matchpassword). With person it is not a challenge but with User i don't know how. Because if i implement the validation rules at the first inload,i can not have optional User anymore.Jquery validation is not safe enough i need to the server side.

Groupscontroller:

    public function add() {
    if ($this->request->is('post')) {
        $this->Group->create();
        if (

        $this->Group->save($this->request->data)
        ) {
            $this->Session->setFlash(__('The group has been saved.'));

            $group_id=$this->Group->getInsertId();
             $person=$this->request->data['Person'];
             $person['group_id']=$group_id;
             $this->Group->Person->create();
             $this->Group->Person->save($person);


            return $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The group could not be saved. Please, try again.'));
        }
    }

the view file Since user is optional i generate the input fields by jquery:

     <div class="groups form">
    <?php echo $this->Form->create('Group', array('class' => 'jquery-validation'));

    echo $this->Html->script('http://code.jquery.com/jquery-1.11.3.min.js');


     ?>
        <fieldset>
            <legend><?php echo __('Add Group'); ?></legend>
        <?php
            echo $this->Form->input('name');
            echo $this->Form->input('comments');


        ?>
        </fieldset>


        <h2>People</h2>
        <table id="mytable">
        <tr><th></th><th>Last Name</th><th>First Name</th><th>Email</th><th>Gender</th></tr>
        <tr id="person0" style="display:none;">
            <td><?php echo $this->Form->button('&nbsp;-&nbsp;',array('type'=>'button','title'=>'Click Here to remove this person')); ?></td>

            <td><?php echo $this->Form->input('unused.lastName',array('label'=>'','type'=>'text')); ?></td>
            <td><?php echo $this->Form->input('unused.firstName',array('label'=>'','type'=>'text')); ?></td>
            <td><?php echo $this->Form->input('unused.email',array('label'=>'','type'=>'text')); ?></td>
            <td><?php echo $this->Form->input('unused.gender',array('label'=>'','type'=>'select','options'=>array('M'=>'M','F'=>'F','T'=>'T'))); ?></td>


        </tr>
        <tr id="trAdd"><td> <?php echo $this->Form->button('+',array('type'=>'button','title'=>'Click Here to add another person','onclick'=>'addPerson()')); ?> </td><td></td><td></td><td></td><td></td></tr>
        </table>

<div id="user-options">
    <?php 
    if (isset($this->data['User'])) {


            echo $form->hidden("User.0.id");
            echo $form->input("User.0.username", array('label' => "Option " . (0)));
echo $form->input("User.0.password", array('label' => "Option " . (0)));

echo $form->input("User.$i.password_confirm", array('label' => "Option " . (0)));
}
    ?>
    </div>

if i would not use : $this->Form->input('unused.firstName' and using $this->Form->input('User.firstName' the model validation rules would works but in this case i can not add only the person because of the required User fields

the Person modell:

    class Person extends AppModel {

    /**
     * Use database config
     *
     * @var string
     */
        public $useDbConfig = 'test';

    /**
     * Display field
     *
     * @var string
     */
        public $displayField = 'firstName';


         public $validate = array(
            'firstName' => array(
            'rule'=>'alphaNumeric',
            'required' => true,
            'message'=>'Not empty'),
'password' => array(
            'notEmpty' => array(
                'rule' => array('notEmpty'),
                'message' => 'Enter your Password',
                //'allowEmpty' => false,
                //'required' => false,
                //'last' => false, // Stop validation after this rule
                //'on' => 'create', // Limit validation to 'create' or 'update' operations
            ),

            'Match passwords'=>array(
                'rule'=>'matchPasswords',
                'message'=>'passwords are not equal'
                )

            ),

            'password_confirm' => array(
            'notEmpty' => array(
                'rule' => array('notEmpty'),
                'message' => 'Confirm your password',
                'update' operations
            ),


        );][1]

User Model:

'username' => array(
        'notEmpty' => array(
            'rule' => array('notEmpty'),

        ),
    ),
    'password' => array(
        'notEmpty' => array(
            'rule' => array('notEmpty'),
            'message' => 'Enter your Password',

        ),

        'Match passwords'=>array(
            'rule'=>'matchPasswords',
            'message'=>'passwords are not equal'
            )

        ),

        'password_confirm' => array(
        'notEmpty' => array(

        ),

Update1: I was think about a bit.Maybe i have to write a costume validation rule: where i can state that if (Model1 fields AND Model2 fields are not empty) OR Model1 fields not empty and Model2 fields empty) return true

1

There are 1 answers

5
kamal pal On

You can unset, rules before validating, see example below:

unset($this->User->validate['Match passwords']);
if($this->User->save($this->request->data)){
    //do something.
}

Attached screenshot seems, you might add multiple users at a time, if so User.0.password it's correct, otherwise you just need User.password