【问题标题】:CakePHP empty field versus not empty field validationsCakePHP 空字段与非空字段验证
【发布时间】:2012-09-18 18:56:44
【问题描述】:

我对文件有以下验证规则:

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

如果图像为空,是否可以跳过验证?

【问题讨论】:

    标签: php cakephp cakephp-2.0


    【解决方案1】:

    您可能需要调整检查图像是否为空/未上传的方式 - 我不确定我所拥有的是否正确。但想法是检查和取消设置验证规则。

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

    【讨论】:

      【解决方案2】:

      见以下网址

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

      即它试图验证的值是一个数组,而不仅仅是一个字符串。这不太可能通过指定的验证规则。它也可能永远不会“空”。

      您要么创建一个可以处理此数组的自定义验证规则,要么在尝试验证之前需要在控制器中进行更多处理

      【讨论】:

        【解决方案3】:

        好的,据我所知,没有这样的代码可以在您的 $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 作为我的主要文章。但是这个函数似乎不是一个默认的 cake 变量。上面的代码应该可以工作。

        【讨论】:

        • beforeSave 为时已晚,iirc 已经运行了验证
        • @tigrang 感谢您的关注。确实错了。编写此代码时正在查看我自己的代码,但我的用法略有不同,它必须在 beforeSave 而不是 beforeValidate 中。 Tnx 的好阅读 :)
        猜你喜欢
        • 2014-06-17
        • 2018-09-22
        • 2012-02-20
        • 1970-01-01
        • 1970-01-01
        • 2019-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多