CakePHP 2.x验证表单

I'm new to CakePHP and I have followed tutorial from their www. Now I'm making simple application and I stuck in validating form, I read about validating form here.

Controller:

class DevicesController extends AppController {
   public $helpers = array('Html', 'Form', 'Session');
   public $components = array('Session');

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

        if ($this->Device->validates()) {
                if ($this->Device->save($this->request->data)) {
                    $this->Session->setFlash(__('feedback'));
                    return $this->redirect(array('action' => 'index'));
                } else {
                // didn't validate logic
                $this->Session->setFlash($this->Device->validationErrors);
                }
        }

    $this->Session->setFlash(__('feedback'));
    }
}

Model:

class Device extends AppModel {
public $validate = array(
    'user' => array(
        'alphaNumeric' => array(
            'rule'     => 'alphaNumeric',
            'required' => true,
            'message'  => 'Alphabets and numbers only'
        ),
        'between' => array(
            'rule'    => array('between', 5, 15),
            'message' => 'Between 5 to 15 characters'
        )
    ),
    'manufacturer' => array(
        'rule'       => 'date',
        'message'    => 'Enter a valid date',
        'allowEmpty' => true
    ),
    'mac' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'message' => 'Nick name is required.'
        )
    )
);}

View:

echo $this->Form->create('Device');
echo $this->Form->input('user', array('label' => 'Urzytkownik'));
echo $this->Form->input('mac', array('label' => 'MAC'));
echo $this->Form->input('manufacturer', array('label' => 'Producent'));

Even when I will not fill the form it successfully passed validation process. What I'm doing wrong here ?

The way of approach is wrong here..

You'll get validation errors in else block of validates once validation fails. but you're accessing it in validates block itself which is incorrect.

it should be like this.

if ($this->Device->validates()) {
    // successful validation
} else {
    // you'll get the validation errors here
}

Now the resultant code should be

if ($this->Device->validates()) {
    if ($this->Device->save($this->request->data, false)) { // setting 2nd param to false thus no need to validate again.
        $this->Session->setFlash(__('feedback'));
        return $this->redirect(array('action' => 'index'));
    } 
} else {
    // didn't validate logic
    $this->Session->setFlash($this->Device->validationErrors);
}

Try this code....

if ($this->Device->validates()) {
    if ($this->Device->save($this->request->data)) {
        $this->Session->setFlash(__('feedback'));
        return $this->redirect(array('action' => 'index'));
    } else {
        // didn't validate logic
        $this->Session->setFlash($this->Device->validationErrors);
    }
} else {       
    $errors = $this->Device->validationErrors;
}

Refer : CakePHP validation not working

Using

if ($this->Device->save($this->request->data)) {

after already validating doesn't make sense.

Either do it together in one simple call:

if ($this->request->is('post')) {
    $this->Device->create();
    if ($this->Device->save($this->request->data)) {
        $this->Session->setFlash(__('feedback'));
        return $this->redirect(array('action' => 'index'));
    }
    // didn't validate logic - note that validationErrors is an array!
    $this->Session->setFlash($this->Device->validationErrors);
}

or use save correctly in this case:

$this->Device->save(null, false)

(to avoid secondary validation).

Note: The first is the cleaner option.

**Try the code.....**

<?php
if ($this->request->is('POST')) {
                $this->Device->create();
                       if ($this->Device->save($this->data)) {
$this->Session->setFlash(__('Data has been save.'));
}
}
 ?>