重庆小程序开发公司重庆安菲科技:专注微信开发,重庆小程序开发,重庆微信小程序定制开发等业务!
手机版手机网站二维码 微信版 微信二维码 业务咨询电话:186-96588-163

小程序开发者:插件机制与目录结构

发表于:2021-05-24 10:20:27 阅读(0 )

为更好的拓展系统功能,进云框架支持以插件的形式开发应用。下面简要介绍进云系统插件机制。

插件可以拥有自己的页面、数据表、工具类等。进云系统已内置插件类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;
	}
	//以下部分省略
}



top