在一般添加文章过程中,我们也都会上传图片。因此,新增文章就分为两部分,首先获取前台提交数据,但无法获取上传图片信息;第二步完成上传图片功能并将图片在服务器上保存的名字,赋值到获取前台数据的数组中,最后完成数据添加即可。
整个过程大致分为这几步,它们是顺序的过程,这是我们解决问题的一种方法(普遍采用的方式),可用数据库和模型方法完成。
第二种思路:如上图所示,采用模型层的事件方法就可实现,我们将上传图片代码写到文章的模型层中,减少控制器层的代码量。当在控制层调用新增方法时,它首先会检查模型层中有没有相应的事件方法,如果有则会优先执行它,然后在执行控制器中相应代码。今天我们要讲的就是采用模型事件的方式(这种方法只限在模型层使用),在完成数据新增时,先完成图片上传功能并将图片在服务器上保存的名字进行保存,最后完成新增。
一、前台界面
二、后台代码:
1、定义Article Model模型,添加如下代码:
class Article extends Model
{
protected static function init()
{
Article::event('before_insert', function ($data) {
//上传文件进行判断
$file = request()->file('pic'); // 获取表单上传文件 例如上传了001.jpg
// 移动到框架应用根目录/public/uploads/ 目录下
if($file){
$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
if($info){
// 成功上传后 获取上传信息
// 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
$data['pic']=$info->getSaveName();
}else{
// 上传失败获取错误信息
$data['pic']='';
}
}
});
}
}
2.Article Controller中的代码如下:
/***
* 添加
*/
public function add(){
//判断是否post提交
if(request()->isPost()){
//接受数据
$data=input('post.');
$article =new ArticleModel();
//验证数据
$validate=Loader::validate('article');
if(!$validate->scene('add')->check($data)){
$this->error($validate->getError());
}
//$result=db('article')->insert($data);
$result=$article->save($data);
if($result){
$this->success('文章添加成功!','lst');
}else{
$this->error('文章添加失败!');
}
}
$cate=new CateModel();
$catenames=$cate->catetree();
$this->assign('catenames',$catenames);
return $this->fetch();
}