🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 留言插件的开发 > 通过前几节对插件以及创建扩展的学习,已经对插件有了基本的认识,在这里咱就来开发一个`在线留言`插件。 ## 插件功能 ### 1\. 在博文详情页添加上在线留言功能 ### 2\. 留言给博文对应有作者 ### 3\. 个人博客后台可以查看自己的博客留言信息 本插件不但需要在前台进行展示,同时博文作者可以通过个人博客后台查看留言 ## 知识点 ### 1\. 留言表的创建(sql创建) ### 2\. 插件中静态资源文件的引入方式 ## 第一部分:创建留言插件 > 按照前几节课制定的插件开发规范,创建留言插件`message`,由于在个人博客后台需要添加查看留言的菜单项,所以在插件基本信息中,直接加上菜单项的配置。另外,需要在钩子方法设置留言表单的模板。 ## 第二部分:数据表的创建 > 在创建留言表时,需要在安装插件时直接创建,所以需要使用建表语句来创建。 > 留言表-建表语句(根据需要自行调整) ~~~ CREATE TABLE `td_message` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL DEFAULT '0' COMMENT '姓名', `phone` VARCHAR(11) NOT NULL DEFAULT '0' COMMENT '手机号', `content` VARCHAR(200) NOT NULL DEFAULT '0' COMMENT '留言内容', `create_time` INT(10) NOT NULL DEFAULT '0', `update_time` INT(10) NOT NULL DEFAULT '0', `touid` INT(10) NOT NULL DEFAULT '0' COMMENT '留言对象', PRIMARY KEY (`id`) ) COMMENT='留言表' ENGINE=MyISAM ; ~~~ > 在这里要注意,建表语句的存放位置,一般情况下可以放到一个文件里比如,课程中是直接放到了留言插件目录下的`install.sql`。另外,由于一个插件对于数据库的操作可能有多个,所以在安装时需要执行的sql语句并不一定只有一个,也就是install.sql中存放的`sql`语句可能有多个,那么这里就要分开来执行,所以需要对install.sql中的语句进行分解,即把`sql`语句拆分。折分后,再循环执行。 ### 创建数据表的注意事项 #### 1\. install.sql文件中,结尾不要有空行 #### 2\. 在进行拆分`sql`语句时,要进行空数据的过滤 #### 3\. 要进行数据表的存在性判断 数据表创建代码片段 ~~~ //创建留言数据表 $sql_content=file_get_contents(ADDON_PATH .'message/install.sql');//获取sql脚本 $arr_sql=array_filter(explode(";",$sql_content));//对sql进行拆分,并过滤空数据 foreach ($arr_sql as $v){//循环执行sql Db::execute($v); } ~~~ ## 第三部分 创建钩子模板(留言表单) > 要实现留言功能,首先需要添加留言表单。通过钩子模板来实现。在这里要注意表单样式,由于钩子模板会做为所在页面的一部分,所以会继承当前页面的样式。具体效果可以自行进行设置。 ## 第四部分 实现留言功能 > 留言表单处理好后,接下来要做的就是将用户的留言数据通过表单提交到后端处理并写入数据表(td\_message)。 在这里重点看一下处理表单提交业的数据处理如何实现。在这里插件扩展也遵循TP5的MVC模式。所以对于留言数据的处理,也要通过控制器模型的方式来实现(也可以不使用模型层)。 ### 1\. 在插件目录下创建控制器目录`controller`和模型目录`model` ### 2\. 创建控制器`Index.php`和数据处理的方法`save` > 在这里的控制器名称和方法名称可是自定义的。 #### 注意事项 ##### 1\. 控制器的命名空间要注意`addons\message\controller` ##### 2\. 控制器要继承插件扩展中`think\addons\Controller`并不是`think\Controller` ~~~ <?php namespace addons\message\controller; use think\addons\Controller; use addons\message\model\Message; class Index extends Controller { /** * 在线留言数据处理 */ public function save(){ $data=input('post.'); $result=Message::store($data); if($result){ $this->success("留言成功"); }else{ $this->error("留言失败"); } } } ~~~ ### 3\. 模型的创建 > 在创建模型时,和TP中的模式的使用方法是完一样的,也同样需要继承Think的Model基类。 > \[danger\]要注意的是和数据表的对应(确认表前辍是否和系统默认配相同)。 ~~~ <?php namespace addons\message\model; use think\Model; class Message extends Model { protected $table = 'td_message'; protected $autoWriteTimestamp = true; public static function store($data){ if(!is_array($data)){ return false; } //获取博文发布的id $touid=db("blogcate")->where('cid',$data['cid'])->value('uid'); $data['touid']=$touid; $result=self::create($data); if($result){ return true; } return fase; } } ~~~ > 由于要指定留言的对像,所以在留言时需要获取到博文发布着的用户id。在这里要注意一点,前台博文详情页中的模板变量,在插件模板中是不能直接使用的。所以在这里需要在调用插件时,通过参数的方式进行传递。 所以博文详情页中调用留言插件时,如下调用 ~~~ {:hook("messagehook",['cid'=>$article.cid])} ~~~ ## 第五部分 个人博客管理后台查看留言功能的实现 > 在这里开发MVC的模式和application下的模人开发是一样的。但是要注意以下几 。 注意事项: 1. 插件中的 控制器方法的访问方式不同 2. 模板拆分中的路径设置问题(相对路径) 3. 插件和application中共用模板时的路径设置 4. 做后台插件时,要注意插件的访问权限(判断用户是否登录) # 插件中静态资源文件的处理 > 在很多场景下,插件下是需要静态资源文件的,如js、css、imgage等。像这些在访问时,需要在站点根目录下(public)下才可以访问。所以在安装插件时,需要对静态资源文件进行处理。 > 通常情况下会将`静态资源文件`移动到public目录下。具体的规则需要规范化。比如,约定插件的资源文件安装后,会移入`public\static\addons`目录下 5.