我正在尝试为其中一个型号上传照片,以及何时进入编辑模式。当用户只想编辑与该记录相关的文本时,它仍然要求我上传照片。以下是我的验证规则。
'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;
}
答案 0 :(得分:2)
设置参数
'on' => 'create'
仅适用于'uploadError'
规则
'uploadError' => array(
'rule' => array('uploadError'),
'message' => 'Please select a Photo.',
'on' => 'create',
),
这样,蛋糕会强制用户在创建记录时上传图像。
其他验证规则intead将始终有效,但仅在文件实际上传时才会生效。
请参阅manual
答案 1 :(得分:2)
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' => true,
放在规则定义中不会产生任何影响,因为值(如果存在)永远不会为空 - 它始终为以下形式:
array(
...
'error' => int
)
因此,最好从所有文件上传验证规则中删除allowEmpty
。
而不是处理验证规则,您可以使用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
的验证规则。
答案 2 :(得分:1)
尝试这种方法,我多次使用它。替换&#39;模型&#39;使用您的型号名称。
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
}
答案 3 :(得分:-1)
使用required = false
并在控制器中根据应用程序逻辑取消设置验证不需要的数组字段。