【问题标题】:CakePHP Form Validation only on Entering DataCakePHP 表单验证仅在输入数据时
【发布时间】:2014-06-15 20:19:37
【问题描述】:

我正在尝试为其中一个模型上传照片,并且何时进入编辑模式。当用户只想编辑与该记录相关的文本时,它仍然要求我上传照片。以下是我的验证规则。

    'display_photo' => array(
        'uploadError' => array(
            'rule' => array('uploadError'),
            'message' => 'Please select a Photo.',
            'allowEmpty' => true,
        ),
        'mimeType' => array(
            'rule' => array('mimeType', array('image/gif', 'image/png', 'image/jpg', 'image/jpeg')),
            'message' => 'Please only upload images (gif, png, jpg).',
            'allowEmpty' => true,
        ),
        'fileSize' => array(
            'rule' => array('fileSize', '<=', '5MB'),
            'message' => 'Photo must be less than 5MB.',
            'allowEmpty' => true,
        ),
        'photoUpload' => array(
            'rule' => array('photoUpload'),
            'message' => 'Unable to process Photo upload.',
            'allowEmpty' => true,
        ),
    ),

上传功能

   public function photoUpload($check = array()) {
        if (!is_uploaded_file($check['display_photo']['tmp_name'])) {
            return false;
        }

        if (!move_uploaded_file($check['display_photo']['tmp_name'], WWW_ROOT . 'img' . DS .
            'portfolios' . DS . $this->data[$this->alias]['slug'].".".pathinfo($check['display_photo']['name'], PATHINFO_EXTENSION))) {
            return false;
        }
        $this->data[$this->alias]['display_photo'] = $this->data[$this->alias]['slug'].".".pathinfo($check['display_photo']['name'], PATHINFO_EXTENSION);
        return true;
    }

【问题讨论】:

  • 您可以对表单提交事件进行 JavaScript 验证作为替代。
  • @rohitr js 验证是永远的替代方案。它始终是服务器端验证的补充。

标签: validation cakephp cakephp-2.4.7


【解决方案1】:

设置参数

'on' => 'create'

仅适用于'uploadError' 规则

'uploadError' => array(
    'rule' => array('uploadError'),
    'message' => 'Please select a Photo.',
    'on' => 'create',
),

这种方式 cake 将在创建记录时强制用户上传图像。

其他的验证规则,intead,将始终有效,但仅在文件实际上传时才有效。

manual

【讨论】:

  • 我想验证文件。仅当正在编辑记录时选择了文件
  • 我试过了。但它仍然会通过所有其他验证。
  • @HarshaMV 我也尝试了该代码,结果如下: 1 - 创建记录时,如果将字段留空或文件无效,则会出现验证错误。 2 - 当我更新记录时,只有当我上传新的 ivalid 文件时才会出现验证错误,而不是将字段留空。在这一点上,我认为问题出在您的自定义验证规则中,因此请使用photoUpload 规则中的代码更新您的问题
【解决方案2】:

uploadError 需要上传

The code for uploadError 需要上传:

public static function uploadError($check) {
    if (is_array($check) && isset($check['error'])) {
        $check = $check['error'];
    }

    return (int)$check === UPLOAD_ERR_OK;
}

如果没有上传文件,则错误将不包含该值 - 它将是 UPLOAD_ERR_NO_FILE

文件上传永远不会为空

'allowEmpty' =&gt; true, 放入规则定义中不会产生任何影响,因为该值(如果存在)永远不会为空 - 它始终采用以下形式:

array(
    ...
    'error' => int
)

因此,最好从所有文件上传验证规则中删除 allowEmpty

使用 beforeValidate

您可以代替处理验证规则,而是使用 beforeValidate 来简单地删除文件上传数据在进行验证检查之前

public function beforeValidate() {
    if (
        isset($this->data[$this->alias]['display_photo']) &&
        $this->data[$this->alias]['display_photo']['error'] === UPLOAD_ERR_NO_FILE
    ) {
        unset($this->data[$this->alias['display_photo']);
    }
    return parent::beforeValidate();
}

这样,如果没有要处理的上传,则完全跳过display_photo 的验证规则。

【讨论】:

  • @HarshaMV 我不知道为什么,因为它不会影响问题/答案。在一个不相关的点上,在验证数据时“做”任何事情是不正常的 - 移动文件应该在保存时发生。
  • 关于我如何处理上传的任何参考资料?现有的插件构建了一个我不需要的非常复杂的文件夹结构。我应该能够提供文件夹名称,然后开始将图像转储到特定模型的该文件夹中。
  • 你正在做的很好 - 但它应该在 beforeSave 或 afterSave 中(取决于你的偏好)。
  • 谢谢。如果我卡住了,我会改变它并回复你。
【解决方案3】:

试试这个方法,我用过几次。将“型号”替换为您的型号名称。

if($this->request->data['Molel']['display_photo']['name']!=''){
    // put your code here for upload image
else
{
    unset($this->request->data['Model']['display_photo']); // this will exclude this from validation
}

【讨论】:

    【解决方案4】:

    使用required = false 并在您的控制器中取消设置基于应用程序逻辑验证不需要的数组字段。

    【讨论】:

    • 没有得到你。请详细说明
    • 当然。如果你制定了不需要的验证规则,如果 cake 没有在传递的数组中找到要验证的字段,它不会抱怨。这与允许它为空(这意味着存在)不同。如果该字段来自您的视图到您的控制器并且您不需要它,您可以在那里取消设置。或者,您可以从控制器动态更改验证规则。
    • 有什么办法不用手动取消设置吗?
    • 你不能让电脑猜你想做什么。您希望根据情况由两组不同的规则检查一个字段。这必须通过“手动”在控制器中强制执行所需的应用程序逻辑或创建自定义验证规则来决定。在这种情况下,我会取消设置不必要的字段,您可以选择自己喜欢的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2019-03-08
    • 1970-01-01
    相关资源
    最近更新 更多