Validation 仅在输入数据时进行CakePHP表单验证
我正在尝试上传其中一个模型的照片,并在进入编辑模式时上传。当用户只想编辑与该记录相关的文本时,它仍然要求我上传照片。下面是我的验证规则Validation 仅在输入数据时进行CakePHP表单验证,validation,cakephp,cakephp-2.4.7,Validation,Cakephp,Cakephp 2.4.7,我正在尝试上传其中一个模型的照片,并在进入编辑模式时上传。当用户只想编辑与该记录相关的文本时,它仍然要求我上传照片。下面是我的验证规则 'display_photo' => array( 'uploadError' => array( 'rule' => array('uploadError'), 'message' => 'Please select a Photo.', '
'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,
),
),
设置参数
'on' => 'create'
仅针对“上传错误”
规则
'uploadError' => array(
'rule' => array('uploadError'),
'message' => 'Please select a Photo.',
'on' => 'create',
),
这种方式将迫使用户在创建记录时上传图像
其他验证规则intead将始终有效,但仅在实际上载文件时有效
请参见设置参数
'on' => 'create'
仅针对“上传错误”
规则
'uploadError' => array(
'rule' => array('uploadError'),
'message' => 'Please select a Photo.',
'on' => 'create',
),
这种方式将迫使用户在创建记录时上传图像
其他验证规则intead将始终有效,但仅在实际上载文件时有效
请参见使用并在控制器中取消设置基于应用程序逻辑的验证不需要的数组字段。使用并在控制器中取消设置基于应用程序逻辑的验证不需要的数组字段。尝试这种方法,我使用过多次。将“模型”替换为您的模型名称
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
}
试试这个方法,我用过好几次。将“模型”替换为您的模型名称
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
}
uploadError需要上传
需要上载:
public static function uploadError($check) {
if (is_array($check) && isset($check['error'])) {
$check = $check['error'];
}
return (int)$check === UPLOAD_ERR_OK;
}
如果没有上传文件,错误将不包含该值-它将被删除
文件上传永远不会为空
将'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\u photo
的验证规则。uploadError需要上载
需要上载:
public static function uploadError($check) {
if (is_array($check) && isset($check['error'])) {
$check = $check['error'];
}
return (int)$check === UPLOAD_ERR_OK;
}
如果没有上传文件,错误将不包含该值-它将被删除
文件上传永远不会为空
将'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\u photo
的验证规则。我想验证文件。只有在编辑记录时选择了该文件,我才尝试这样做。但它仍然要通过所有其他验证。@HarshaMV我也尝试过该代码,结果如下:1-当我创建记录时,如果我将字段留空或文件无效,则会出现验证错误。2-当我更新记录时,仅当我上载新的ivalid文件时,我才会收到验证错误,而如果我将字段留空,则不会收到验证错误。此时,我认为问题在于您的自定义验证规则,因此请使用您的photoUpload
规则中的代码更新您的问题我要验证文件。只有在编辑记录时选择了该文件,我才尝试这样做。但它仍然要通过所有其他验证。@HarshaMV我也尝试过该代码,结果如下:1-当我创建记录时,如果我将字段留空或文件无效,则会出现验证错误。2-当我更新记录时,仅当我上载新的ivalid文件时,我才会收到验证错误,而如果我将字段留空,则不会收到验证错误。在这一点上,我认为问题在于你的自定义验证规则,所以请用你的photoUpload
rule未获得u的代码表更新你的问题。请详细说明。如果不需要验证规则,如果cake在传递的数组中找不到要验证的字段,它不会抱怨。这与允许它为空(意味着存在)不同。如果该字段来自您的视图到控制器,而您不需要它,您可以在那里取消设置它。或者,您可以从控制器动态更改验证规则。是否有任何方法可以在不进行所有手动取消设置的情况下进行更改?您无法让计算机猜出您想要做什么。您希望一个字段根据情况由两组不同的规则进行检查。这必须通过“手动”在控制器中强制执行所需的应用程序逻辑或创建自定义验证规则来决定。在这种情况下,我会去不必要的领域,你可以选择你喜欢的。请详细说明。如果不需要验证规则,如果cake在传递的数组中找不到要验证的字段,它不会抱怨。这与允许它为空(意味着存在)不同。如果该字段来自您的视图到控制器,而您不需要它,您可以在那里取消设置它。或者,您可以从控制器动态更改验证规则。是否有任何方法可以在不进行所有手动取消设置的情况下进行更改?您无法让计算机猜出您想要做什么。您希望一个字段根据情况由两组不同的规则进行检查。这必须通过“手动”在控制器中强制执行所需的应用程序逻辑或创建自定义验证规则来决定。在本例中,我将取消设置不必要的字段,您可以选择您喜欢的内容。您可以在表单提交事件上执行JavaScript验证作为替代方法。@rohitr js验证从来都不是替代方法。它始终是对服务器端验证的补充。您可以在表单提交事件上进行JavaScript验证作为替代方法。@rohitr js验证从来都不是替代方法。它始终是对服务器的补充