说了那么多,weiphp框架里的插件到底是个什么呢?这里的插件就是个小型的MVC,里面继承并扩展了onethink里的插件的设计模式。所以在学习weiphp插件制作之前,建议可以先学习一下onethink里的插件制作和模型制作。当然了,你也可以不用去学习,只要按照我下面讲的一步一步去做,也是可以的。咱们这里就以制作一个医院预约插件来举例。
2、需求分析:
对于医疗机构的预约功能来说,用户触发预约功能,微信客户端引导用户进入预约页面,用户填写预约信息,选择专家,提交数据,预约成功,工作人员在系统里查看预约信息。这里为了讲解插件开发简化了很多需求,实际的商业开发的时候,不仅仅是这些功能,例如还包括专家的分配管理、积分、订金支付等等。
3、设计数据表&制作模型:
对于预约功能插件的数据表来说,首先一点可以确定的是,表里一条记录就是一个预约,那么这个表里需要的字段自然就好梳理出来了。数据表里应该包含的基本信息有:预约客户的信息、预约专家的信息、预约的时间。这里有个概念需要弄清楚,就是关注者和预约客户的区别,这两者可能是同一个人,也可能不是同一个人,因为我们不能拒绝关注者帮助任何人预约,比如一个关注者要为自己的爷爷奶奶预约一个医生,那么这两个角色就是不一样的。所以客户在预约的时候需要填写客户信息,而不是从关注者表或者Oauth2.0去获取关注者信息。
根据这些分析,这个数据表就不难设计了。如下表所示:
| 字段名 | 中文名称 | 类型及精度 | 作用 | 备注 |
| id | 序号 | int(11) | 序号 | |
| clientname | 预约客户 | varchar(30) | 预约用户名 | 和关注者不一样,患者不一定就是用户 |
| sex | 客户性别 | varchar(6) | 客户性别 | 直接存“男”或“女” |
| age | 客户年龄 | varchar(3) | 客户年龄 | |
| mobile | 客户电话 | int(12) | 客户电话 | |
| orderdate | 预约就诊时间 | int(15) | 预约就诊时间 | 患者在这个时间去就诊 |
| expert | 专家姓名 | varchar(255) | 专家姓名 | |
| uid | 关注者ID | int(11) | 联系方式 | 关联follow表id |
| addtime | 预约创建时间 | int(15) | 预约创建时间 | 关注者在客户端创建预约的时间 |
| 电子邮箱 | varchar(50) | |||
| openid | 关注者openid | varchar(150) | 由微信提供 |
创建模型,进入 后台=》系统设置=》模型管理,点击新增按钮,进入新增模型页面。这里的操作也是继承了onethink模型管理里的设计模式。如下图所示:



点击上面“高级”一栏,如下图:

好,按照我上面所说的方法,把我们设计的数据表字段都添加进去。这时,查看数据库里,已经多了一个order表了。
最后回到编辑模型页的设计,这里有个“表单设计分组”,这个功能原先在onethink里面,是在后台添加文章数据的时候为了好看或者操作方便而设计的一种把表单分配给选项卡里的功能,但是在weiphp里,用处和意义都不大,所以不必理会。感兴趣的童鞋可以参考我之前做的“ onethink学习心得”。继续看“设计”下面的内容,这里有个列表定义,如下图:

,这个是列表里最后一列用来显示一些编辑链接的。其规则是[EDIT]代表编辑的地址,&id=[id]是get传参。有不明白的,可以参考这里:
http:///manual_1_0.html#onethink_2_7
“设计”页最下面的默认搜索字段和高级搜索字段都是设置列表页里搜索框的,当我们在搜索框里输入我们想要查找的内容的时候,程序就会按照这里的设置,在数据库里按照这个字段查找。
前台数据列表效果如下:

模型制作好以后,进入插件管理=》微信插件,这是微信插件的列表,点击上面的快速创建按钮,进入插件创建页面。如下图:

插件名称就是中文名称,在左侧菜单显示的就是中文名称。版本号,可以自定义。作者,可以自定义。描述里简单写一下这个插件的作用,以便后期维护的时候,或者别的童鞋来查看的时候,方便找到想要的插件。安装后是否启用,打上对勾。是否需要配置,这个选项的意思是是否需要配置一下配置文件,我建议大家不要在这里填写,具体的做法,后面会讲到,咱们在这先不勾选。是否需要管理列表,勾选下面的复选框。
预览按钮显示出来的是即将生成的插件文件里的代码,里面的内容都是根据这个新建页面的表单数据生成的。不过,查看这些,意义不大,可以略过。
好,点击确定,提交表单。此时先不要着急安装,去服务器查看一下,Addons目录下应该有一个名叫“Order”的文件夹了,这个就是插件文件夹,里面包含了这个插件的所有文件。这时候,我们来创建一个配置文件config.php,代码如下:

其中,参数isaction是否开启插件,当选择开启的时候,即可使用插件,当选择关闭的时候,会提示用户功能关闭。参数expert是设置专家名字,这里为了算法简单,暂且使用笨办法吧:-)。 在textarea里专家名字之间用英文半角空格隔开,在PHP代码里再使用explode函数分割开。参数title是图文消息的标题,参数cover是图文消息的图片,desc是图文消息的描述。当参数类型是picture的时候,表单是file类型的,上传图片,数据库里存储的是图片表的id,需要使用函数get_cover_url()来解析出实际的url地址。
好,配置文件编写完成,这时候去后台插件管理=>微信插件,找到刚才创建的插件,在右侧点击安装,安装成功后,后台操作基本上到此就OK了。这时,在前台可以查看到由配置文件生成的配置页面:

在网站根目录里,有个Addons目录,里面找到刚才生成的Order目录,这即是咱们的预约插件目录。里面的目录结构,熟悉MVC的朋友一看就知道了,这里不再敖述。
打开模型文件WeixinAddonModel.class.php,如图:

那么除了reply方法,大家看到下面有很多事件响应方法,这些事件响应方法该如何使用呢?首先来看这样一个代码,找到文件/Application/Home/Controller/WeixinConreoller.class.php,对!看到这里,很多人想起来了,咱们在配置公众账号的时候,在微信官方的管理平台上设置的服务器地址指向的就是这个控制器的index方法:

现在看WeixinConreoller.class.php里的第60至78行,如图:

现在我们回过头来看一下模型WeixinAddonModel.class.php,reply方法有两个参数$dataArr和$keywordArr。第一个参数$dataArr是将微信服务器推送过来的xml信息转化成的数组,如图所示:

第二个参数$keywordArr是用户发送的信息所涉及的关键词的数据,从keyword表里读出来的。该表的结构请参见在线开发手册 http:///wiki/。该参数形式如图:

那么,这里指定了当用户点击图文消息时,跳转至Order插件的Order控制器的appoint方法,下面,我们来分析这个方法。如图所示:

<script>document.addEventListener('WeixinJSBridgeReady',function OnBridgeReady(){WeixinJSBridge.call('closeWindow');});</script>
是微信浏览器专属的一个监听事件(addEventListener),微信浏览器加载页面后,即执行退出页面的动作(closeWindow)。
这里,是否允许用户多次预约,可以做一个插件配置,然后由工作人员自行在后台配置页面上进行设置。就像控制活动是否结束一样。当然了,提示语也可以由配置里去设置。
继续看PHP代码,接下来就是获取插件配置里填写的专家名字,并传递给页面。以供用户在页面上选择。页面效果如下(页面由 方倍工作室编著《微信公众平台最佳实践》提供):


提交信息后,成功添加到数据库里,这时跳转到成功页面,如图:


接下来介绍一下自定义选项和自定义模型名。
当我们在管理平台上查看插件的时候,每个插件默认可以查看到数据列表和设置配置的页面,他的链接可以用如下方法设置:




下面讲一下自定义模型名。weiphp插件默认的数据表是与插件自身同名的表,如果插件的表和自身不同命,那么就需要开发者在控制器里重新定义数据表名,并且重载增删改查的方法。在上面初始化函数里有个类属性变量$this->model,这就是重新定义了模型名(表名)。在控制器里添加如下方法:

这里的关键词关联的是关键词库里的,进入 账号管理=》关键词维护,即可看到有哪些关键词,所谓关键词,就是当用户给公众号发送的文本,当文本里匹配到关键词的时候,即触发对应的功能插件。具体的关键词处理,可以查看/Application/Home/Controller/WeixinController.class.php里reply方法。
















