我有一个允许文件上传的表单,我正在使用数据验证来检查它是什么类型的文件,这一切都很好。我想要做的是让他们编辑同一条记录,但不需要在那时上传文件。
我的验证规则如下:
'header_pic' => array(
'extension' => array(
'rule' => array('extension', array('jpeg', 'jpg', 'gif', 'png')),
'message' => 'You must supply a GIF, PNG, or JPG file.',
)
)
但是这个规则需要一个文件。我找到了'on'参数,我可以将它添加到此规则中,但它只会在创建时检查文件。不是编辑。
我尝试了这个,但它不起作用:
'header_pic' => array(
'extension' => array(
'rule' => array('extension', array('jpeg', 'jpg', 'gif', 'png')),
'required' => false,
'allowEmpty' => true,
'message' => 'You must supply a GIF, PNG, or JPG file.',
),
'notEmpty' => array(
'rule' => array( 'notEmpty'),
'on' => 'create',
'message' => 'You must supply a file.',
),
)
我错过了什么? (先谢谢!!)
答案 0 :(得分:0)
我遇到了同样的问题,我的解决方案并不是很好,但它对我有用,我做的是,允许Empty =>真正。并且在控制器的编辑功能中,我将该图像的数据传递给$ this->数据数组,就像这样,所以当你转到表单时,你已经有了带有一些数据的字段'image',而且您不必再次上传图像,也不必修改它。
如果不清楚,请告诉我,我会尝试将其分解。
我希望它适合你
function admin_edit($id = null) {
if (!$id && empty($this->data)) {
$this->Session->setFlash(__('Invalid category', true));
$this->redirect(array('action' => 'index'));
}
if (!empty($this->data)) {
if(!empty($this->data['Category']['image']['name']))
{
$image_name = $this->Picture->upload_image_and_thumbnail($this->data,"image",570,70,"categories",true,"Category");
$this->data['Category']['image'] = $image_name;
}
else{
$image_name = $this->Category->find('first',array(
'conditions'=> array(
'Category.id' => $this->data['Category']['id']
),
'fields' => array(
'Category.image'
)
));
$this->data['Category']['image'] = $image_name['Category']['image'];
}
if ($this->Category->save($this->data)) {
$this->Session->setFlash(__('The category has been saved', true));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The category could not be saved. Please, try again.', true));
}
}
if (empty($this->data)) {
$this->data = $this->Category->read(null, $id);
}
}
答案 1 :(得分:0)
var $validate = array(
'imageupload' => array(
'checksizeedit' => array(
'rule' => array('checkSize',false),
'message' => 'Invalid File size',
'on' => 'update'
),
'checktypeedit' =>array(
'rule' => array('checkType',false),
'message' => 'Invalid File type',
'on' => 'update'
),
'checkuploadedit' =>array(
'rule' => array('checkUpload', false),
'message' => 'Invalid file',
'on' => 'update'
),
'checksize' => array(
'rule' => array('checkSize',true),
'message' => 'Invalid File size',
'on' => 'create'
),
'checktype' =>array(
'rule' => array('checkType',true),
'message' => 'Invalid File type',
'on' => 'create'
),
'checkupload' =>array(
'rule' => array('checkUpload', true),
'message' => 'Invalid file',
'on' => 'create'
),
)
);
function checkUpload($data, $required = false){
$data = array_shift($data);
if(!$required && $data['error'] == 4){
return true;
}
//debug($data);
if($required && $data['error'] !== 0){
return false;
}
if($data['size'] == 0){
return false;
}
return true;
//if($required and $data)
}
function checkType($data, $required = false,$allowedMime = null){
$data = array_shift($data);
if(!$required && $data['error'] == 4){
return true;
}
if(empty($allowedMime)){
$allowedMime = array('image/gif','image/jpeg','image/pjpeg','image/png');
}
if(!in_array($data['type'], $allowedMime)){
return false;
}
return true;
}
function checkSize($data, $required = false){
$data = array_shift($data);
if(!$required && $data['error'] == 4){
return true;
}
if($data['size'] == 0||$data['size']/1024 > 2050){
return false;
}
return true;
}
我也是这样做的 我成功了 试试。 如果需要,可以做出改变。 所有最好的
答案 2 :(得分:0)
我明白了。 (感谢omabena和RSK的建议。)我发现我可以设置两个验证规则,并使用一个用于添加,一个用于创建。干得很干净。
'header_pic' => array(
'extension' => array(
'rule' => array('extension', array('jpeg', 'jpg', 'gif', 'png')),
'message' => 'You must supply a GIF, PNG, or JPG file.',
'required' => false,
'on' => 'add'
),
'extension2' => array(
'rule' => array('extension', array('jpeg', 'jpg', 'gif', 'png')),
'message' => 'You must supply a GIF, PNG, or JPG file.',
'required' => true,
'on' => 'create'
),
)