2012-09-18 54 views
2

我有後續的驗證規則的文件:CakePHP的空場與非空字段驗證

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), 
     ) 
    ) 
); 

有辦法跳過驗證,如果圖像是空的?

回答

2

您可能之前調整如何檢查圖像空/未上傳 - 我不確定我所擁有的是否正確。但是,這個想法是檢查並取消設置驗證規則。

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

    return true; 
} 
0

好吧,據我所知,沒有這樣的代碼來設置你的$ validate變量。所以,你將不得不做的是:

在相應型號的beforeValidate添加以下代碼塊:

<?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']); 
} 

我以前http://bakery.cakephp.org/articles/kiger/2008/12/29/simple-way-to-unbind-validation-set-remaining-rules-to-required作爲我的主要文章。但是這個函數似乎並不是一個默認的變量。上面的代碼應該可以工作。

+0

哈哈哈,這是確定=) –

+0

'beforeSave'就爲時太晚,驗證將已經被用於察覺運行IIRC – tigrang

+0

@tigrang感謝。確實是錯的。在寫這篇文章時,我正在看自己的代碼,但是我有一個稍微不同的用法,它必須位於beforeSave而不是beforeValidate中。 Tnx的好閱讀:) – Jelmer

1

請參見下面的網址

cakePHP optional validation for file upload

或者嘗試

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

所以你的時間保存數據陣列,它看起來像這樣我假設:

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

這意味着,imageupload驗證規則試圖處理這些數據:

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

I.e.它試圖驗證的值是一組東西,而不僅僅是一個字符串。這不太可能通過指定的驗證規則。它也可能永遠不會「空虛」。

要麼你創建一個可以處理該陣列中的自定義的驗證規則,或者你需要做一些更多的處理控制器嘗試驗證它