Aug 5, 2013

Ketan Patel

Dynamic Fields Validation in CakePHP

Dynamic Fields Validation in CakePHP



In this post we'll learn about dynamic fields validation. Generally simple validation is achieved by placing the validation rules in the model file.You can get the idea of how validation rules are written in model file by the example given below.


<!-- file:app/models/yourmodel.php -->

var $validate = array(
  'name' => array(
   'notempty' => array(
    'rule' => array('notempty'),
    'message' => 'This field is required..!',
    //'allowEmpty' => false,
    //'required' => false,
    //'last' => false,
    //'on' => 'create',
   ),
  ),
  'SRRP' => array(
   'numeric' => array(
    'rule' => array('numeric'),
    'message' => 'This field is required..!',
    //'on' => 'create',
   ),
  )
);


But here,the fields (Example: name,SRRP) are static fields. Following lines of code were written in view file to generate them. 

<!--file:app/views/(yourmodel)s/add.ctp-->

   echo $this->Form->input('name');
   echo $this->Form->input('SRRP');


Because they were static its easy to validate them.For the dynamic fields,you can provide validation in controller file..!! Yes in controller file.

I have three dynamically generated fields called : title1 , title2 , title3 (in my case max limit of adding this field is 3).So how to handle validation rules for these fields? Add the following code in your controller's add function and as well as in edit function also.

<!-- File:app/controllers/yourcontroller-->

public function add()
 {
   if ($this->request->is('post')) {
      $this->Model->create();
        
    if (!empty($this->request->data)){
         $validate = array();
         $fields =array();  
         //Because my suffix starts with 1 (title1) and max limit of this field is 3 
         for($i=1;$i<4;$i++)
           {
               $fields[]='title'.$i;
           }

          foreach($fields as $field)
         {
          $validate[$field] = array(
          'required'=>array(
          'rule'=>'notEmpty',
          'message'=>'Cannot be empty'
            )
           );
          }

     $this->Model->validate = $validate;
     for($i=1;$i<4;$i++)
     {
      if(!empty($this->data['Model']['title'.$i]))
       {
        $title=$this->data['Model']['title'.$i];
        $this->request->data['Model']['title'.$i] = $title;
       }
     }

     if ($this->Model->save($this->request->data)) {
        $this->Session->setFlash('Your data has been saved.');
        $this->redirect(array('action' => 'index'));
      }
      else {
            $this->Session->setFlash('Unable to add data.');
          }
        }
    }
}


If you have any queries then please comment here.

Ketan Patel

About Ketan Patel -

I have developed a wide range of websites using CorePHP, Opencart, CakePHP and CodeIgniter including sites for startup companies and small businesses. Apart from my blogging life, I like to read Novels, Listening music and Net surfing.

Subscribe to this Blog via Email :