在我的数据库中,我有4列,即名称,描述,图像和状态。在Oil scaffold创建的默认模板中,所有值都是预期的。
但在我的情况下,列'image'将是上传文件的名称,“status”smallint列将默认为1.但伪造失败是必需的。
在模型验证中,validate()执行如下操作。
public static function validate($factory) {
$val = Validation::forge($factory);
$val->add_field('name', 'Name', 'required|max_length[255]');
$val->add_field('description', 'Description', 'required');
$val->add_field('image', 'Image', 'required|max_length[255]');
$val->add_field('status', 'Status', 'required');
return $val;
}
据我了解,文件上传项目不属于表单。
在实际创建用于保存的Model对象之前调用$ val-> run()。它失败了,因为“图像”和“状态”的值在此之后填充。
if (Input::method() == 'POST') {
$val = Model_Category::validate('create');
if ($val->run()) {
Upload::process($config);
if (Upload::is_valid()) {
Upload::save(0);
$arr = Upload::get_files();
$category = Model_Category::forge(array(
'name' => Input::post('name'),
'description' => Input::post('description'),
'image' => $arr[0]['saved_as'],
'status' => 1,
));
}
} else {
Session::set_flash('error', $val->error());
}
}
有没有更好的fuelPHP处理方式?如何改变控制器?或者如何更改模型?
答案 0 :(得分:1)
“file”类型的表单输入字段的结果将在$ _FILES中,而不在$ _POST中。
由于验证仅适用于已发布的数据(或您传递给它的任何数组),因此无法验证这些输入字段。
您必须从验证定义中删除'image'字段,并让Upload类验证上传的文件。
这是一个更好的流程:
if (Input::method() == 'POST') {
Upload::process($config);
if (Upload::is_valid()) {
Upload::save(0);
if (Upload::is_valid()) {
$val = Model_Category::validate('create');
if ($val->run()) {
$arr = Upload::get_files();
$category = Model_Category::forge(array(
'name' => Input::post('name'),
'description' => Input::post('description'),
'image' => $arr[0]['saved_as'],
'status' => 1,
));
} else {
Session::set_flash('error', $val->error());
}
} else {
// deal with the Upload errors, check Upload::get_errors()!
}
} else {
// deal with the Upload errors, check Upload::get_errors()!
}
}