为更好的拓展系统功能,进云框架支持以插件的形式开发应用。下面简要介绍进云系统插件机制。
插件可以拥有自己的页面、数据表、工具类等。进云系统已内置插件类plugin,每一个插件类都是该类的实例,在插件控制文件中,可通过$this来访问该插件的属性和方法。
页面机制
和其他PHP框架不同,进云插件页面控制文件无需声明类。而是直接在特定目录创建文件以编写业务代码即可!但是进云插件所有页面都处于plugin类中,也就是在所有页面控制文件中都可以使用$this来访问相应插件类实例的方法和属性!
进云系统是一个多站点的站点管理系统,每个站点都有管理端和客户端,管理端是站点管理员登陆操作管理的页面,客户端是站点建好对外发布后,访客访问的页面。为提升系统安全性,管理端页面代码和客户端页面代码分开存放,分别位于插件根目录下的manage文件夹和custom文件夹。
进云系统中,每个页面对应一个页面控制文件(PHP文件)、一个页面样式文件(html文件),分别存放于指定位置,可查看下面面的目录结构。每个页面可分为若干个子页面,根据op来区分。
进云系统的插件目录是根目录下的addons目录,插件的根目录位于系统插件目录下以插件标识命名的文件夹。
插件目录:
插件根目录
——manage:插件管理端页面文件目录
; ; ; ;|——common.php:管理端初始化文件,非必须。如果存在,访问插件用户端页面时,会先执行该页面的代码,该文件中可通过$this访问插件类
; ; ; |——actions:控制文件目录
; ; ; ; ; ; ; ;|——index.php:插件管理端首页
; ; ; ; ; ; ; ;|——link.php:插件页面链接选择文件
; ; ; |——templates:页面文件目录
; ; ; ; ; ; ; ;|——windows:PC端页面文件
; ; ; ; ; ; ; ;|——mobile:手机端页面文件
——resource:插件图片、样式、js等资源文件目录
——custom:插件用户端页面文件目录
; ; ; ;|——common.php:用户端初始化文件,,非必须。如果存在,访问插件用户端页面时,会先执行该页面的代码,该文件中可通过$this访问插件类
; ; ; ;|——actions:控制文件目录
; ; ; ;|——templates:页面文件目录
——class:插件工具类目录
——subscribe:插件订阅事件处理函数目录
——model:插件工具类目录
; ; ; ;|——menu.php:插件管理端导航菜单声明文件,非必须
——init.php:插件类初始化文件,非必须。
——default_setting.php:插件默认参数声明文件,非必须。
一个典型的进云插件页面:
页面地址:http://你的域名/manage/index.php?plugin=jy_weishop&action=goods.list
页面控制文件路径:(相对插件根目录)
/manage/actions/goods/list.php
控制文件中,可以使用$this来方法插件类的方法和属性。整理好数据后,调用系统exi函数返回前端
页面pc端html文件路径:(相对插件根目录)
/manage/templates/windows/goods/list.html
页面手机端html文件路径:(相对插件根目录)
/manage/templates/mobile/goods/list.html
控制文件通过访问数据库将数据读出并整理好,然后通过调用exi()函数将数据返回给前端,系统自动调用相应html文件结合数据进行渲染,生成最终的展示页面
插件数据表名称命名规范:
为方便使用和统一管理,所有进云插件的数据表必须以(系统数据表前缀+插件标识+下划线)开头!
插件工具类声明和使用方法:
为方便model()函数调用,插件工具类必须全部声明在class文件夹中,然后按照标准的格式进行声明!(当然,如果是自己直接使用,随便怎么声明都可以!此处规范的类声明方式只是为了model函数能够调用到!)
下面介绍声明方法:
1、命名空间:plugin_name
2、类名: class_name
3、继承的基类:plugin。继承这个类的目的是在工具类中可以使用插件类的方法和属性!如果无需用到这些,也可不继承!
4、本插件调用方法:$this->model('class_name'),返回已实例化好的目标类的示例
5、外部插件调用方法:model('plugin_name/class_name'),返回已实例化好的目标类的示例
5、类比较多时,可在class目录下创建一级或多级文件夹,以更好的管理这些类,这些类的命名空间和调用方法如下:
命名空间:plugin_namedir_name
类名:class_name
调用方法:model('
plugin_name/dir_name/class_name')
多级文件夹以此类推!
下面是示例代码:
以下为微客分销插件佣金计算类的声明代码
文件路径:
/addons/jy_commission/class/commission.php(基于站点根目录)
<?php
namespace jy_commission;
defined('BY_JYA') or exit('error');
/*
分销佣金
*/
class commission extends plugin{
/*
生成佣金
*/
function create($order){
$level=intval($this->setting['level']);
if($level==0){
return;
}
$this->order=$order;
if($this->setting['self_commission']==1){
$agent_id=$order['mid'];
}else{
$agent_id=$this->getcolumn('member',array('mid'=>$order['mid']),'agent_id');
}
$this->commission_order=array(
'uniacid'=>$_SESSION['uniacid'],
'mid'=>$this->order['mid'],
'ordersn'=>$this->order['ordersn'],
'order_price'=>$this->order['price'],
'commission_money'=>0,
'createtime'=>TIMESTAMP,
);
//佣金计算方式,是否扣除运费
if($this->setting['commissiontype']==1){
$this->commission_order['commission_price']=$this->order['price'];
}else{
$this->commission_order['commission_price']=$this->order['price']-$this->order['dispatchprice'];
}
//当分销层级大于0时,逐次寻找上级推荐人并计算佣金
for($i=0;$i<$level;$i++){
if(!$agent_id){
break;
}
$agent_id=$this->create_commission($agent_id,$i+1);
}
//生成分销订单
$this->insert('order',$this->commission_order);
return true;
}
//以下部分省略
}