写文章
登录
# TinyShop插件开发的初步认识 --- > Tiny框架在对插件的设计上,把插件的地位放到了与Controller同级,且插件基类Widget类继承了Controller类,也就是说Widget不但有与Controller同等功能,且Widget也有自己独特的功能,从这一点就可以知道开发Widget能实现多强大的功能了。 ## 插件分类 **安是否与主题有关来分** 1. 主题级插件 2. 系统级插件 **主题级插件:** 插件只针对特定主题而开发的插件,由于插件的设计使用了非常灵活机制,在一般的系统中,页面的合成往往是引用其它页面,如header,footer,而Tiny框架的设计是,可以使用系统的layout机制,也可以使用widget的方式,写一个插件视图,直接使用widget引用就即可。非常的灵活。主题级插件多用于视图的处理,当然开发成大型的交互式插件也是没有问题的。 **系统级插件** 插件主要是针对整个系统的插件,如官方提供的三级分销插件,一般都是较为大型的插件,插件有自己的后台管理菜单,自己的安装SQL,自己的前台菜单,自己的事件处理,由于事件的设计,在开发插件的时候完全与系统分离,开发者只需要关注开发的功能模块即可。 **安功能强大与否分** 1. 简单插件 2. 大型插件 **简单插件** 一般是用来开发视图类插件,如系统用户中心的菜单,由于多个页面都在有菜单,我们只需要引用一下菜单插件就可以了。这种插件相对简单,主要是实现视图的共享。 **大型插件** 一般用于系统的强大功能扩展上,也就是说你完全独立与系统开发自己的功能,甚至开发一个完全独立的系统都没有问题。特别适合开发与TinyShop进行系统对接的扩展开发。 ## 插件开发 **存放位置** 主题级插件的开发,在对应的主题的widgets目录下,纯视图类,直接建立一个目录,目录的名称即为插件的名了,在目录下建立对应的视图文件,文件名即为调用时action的名字。 系统级插件需要在protected目录下的widgets下建立,目录结构同上,那么任何主题都可以调用此接口。 **开发** 视图类插件的开发,同开发视图文件相同。 大型插件的开发,同controller的开发,但是也有不同之处,大型插件的开发会涉及到自己的数据库表,管理菜单,详情请参考大型插件开发。 ### 大型插件开发 在widgets目录下创建widget类,继承系统的Widget类,一般大型插件的开发都会涉及前后台,对于后台的处理,可以参考官方的三级分销插件,也可以自己来设计管理插件后台的权限控制。 ```php <?php //说明 必需继承Widget类,如果需要事件支持,还要实现EventInterface class DistributionWidget extends Widget implements EventInterface{ //此处是用户注册事件,书写方式on+事件名 public function onReguser($data){ //写自己的逻辑控制,$data中存放的是事件所传递过来的数据 } } ``` **目前系统提供的事件有** |事件名|说明| | --- | --- | | login |用户登录事件| |logout|用户退出登录事件| |reguser|用户注册事件| |payoder|支付订单事件| 稍后会放出大量的系统支持的事件。 插件的安装配制文件,在插件目录下建立install.php文件。 此文件有结构如下 ```php <?php return array( 'name' => '三级分销系统',//插件名 'author' => 'TinyRise官方',//作者 'version' => '1.0',//版本号 //插件包含的事件,没有不必写 'events' => array( 'reguser', 'login', 'payorder', ), //后台插件管理菜单,只需要写名称与对应的action就可以。 'menu' => array( array('name' => '分销管理', 'action' => 'index'), array('name' => '分销商列表', 'action' => 'user_list'), ), //用户中心入口菜单,只需要写名称与对应的action就可以。 'ucenter_menu' => array('name'=>'分销中心','action'=>'info'), 'sqls' => array( 'install'=>array( //SQL安装语句,没有不必写 ), 'uninstall'=>array( //SQL的卸载语句,没有不必写 ) ), ); ``` ## 插件调用 **插件被访问到有两种方式:** 一种是通过widget标签调用,实现页面级的调用。 另一种是通过url访问,这主要是针对大型的插件,widget的名字允当了controller的名字,从而实现大型插件的调用,同controller的使用相同。