Gabriel Santos
Gabriel Santos

Reputation: 4974

CakePHP empty field versus not empty field validations

I have the follow validation rule for a file:

modelFile.php

public $validate = array(
    'image' => array(
        'maxWidth' => array(
            'rule' => array('maxWidth', 2000),
        ),
        'maxHeight' => array(
            'rule' => array('maxHeight', 2000),
        ),
        'extension' => array(
            'rule' => array('extension', array('gif', 'jpg', 'png', 'jpeg')),
        ),
        'filesize' => array(
            'rule' => array('filesize', 5120000),
        )
    )
);

Have a way to skip validations, if image are empty?

Upvotes: 2

Views: 1414

Answers (3)

Jelmer
Jelmer

Reputation: 2693

Ok, as far as I know there is no such code to set this in your $validate variable. So what you are going to have to do is:

In the beforeValidate of the corresponding model add the following piece of code:

<?php   
# Check if the image is set. If not, unbind the validation rule
# Please note the answer of Abid Hussain below. He says the ['image'] will probably
# never be empty. So perhaps you should make use of a different way to check the variable
if (empty($this->data[$this->alias]['image'])){
    unset($this->validate['image']);
}

I used http://bakery.cakephp.org/articles/kiger/2008/12/29/simple-way-to-unbind-validation-set-remaining-rules-to-required as my main article. But this function doesn't seem to be a default cake variable. The code above should work.

Upvotes: 0

tigrang
tigrang

Reputation: 6767

You may have to adjust how you check if the image is empty/not uploaded - I'm not sure if what I have is correct. But the idea is to check and unset the validation rule.

public function beforeValidate($options = array()) {
    if (empty($this->data[$this->alias]['image']['name'])) {
        unset($this->validate['image']);
    }

    return true;
}

Upvotes: 2

Abid Hussain
Abid Hussain

Reputation: 7762

See below URL

cakePHP optional validation for file upload

Or try it

"I assign $this->data['Catalog']['image'] = $this->data['Catalog']['imageupload']['name'];"

So by the time you save your data array, it looks something like this I assume:

array(
    'image' => 'foobar',
    'imageupload' => array(
        'name' => 'foobar',
        'size' => 1234567,
        'error' => 0,
        ...
     )
)

Which means, the imageupload validation rule is trying to work on this data:

array(
    'name' => 'foobar',
    'size' => 1234567,
    'error' => 0,
    ...
 )

I.e. the value it's trying to validate is an array of stuff, not just a string. And that is unlikely to pass the specified validation rule. It's also probably never "empty".

Either you create a custom validation rule that can handle this array, or you need to do some more processing in the controller before you try to validate it

Upvotes: 1

Related Questions