智简魔方文档

插件开发

位置

插件放在 public/plugins/addon/ 目录下

目录结构

public/plugins/addon/idcsmart_ticket
|--- controller(控制器目录,后台控制器直接放此目录下)
|----- clientarea(前台控制器目录,实际位于 controller/clientarea)
|--- lang(语言目录)
|--- zh-cn.php(中文语言文件)
|--- template(模板)
|--- admin(后台模板目录)
|--- clientarea(前台模板目录)
|--- IdcsmartTicket.php(插件主文件)
|--- route.php(自定义路由文件)
|--- sidebar.php(后台插件导航文件)

开发流程

以工单插件为例:

创建工单插件目录 public/plugins/addon/idcsmart_ticket/

①目录名以小写字母+下划线形式,必须以字母开头,如idcsmart_ticket;

创建入口文件:IdcsmartTicket.php

命名空间namespace addon\idcsmart_ticket(控制器下命名空间对应相应目录即可,其它同理);

②以目录名大驼峰+.php,创建在插件根目录下,如idcsmart_ticket\IdcsmartTicket.php;

③文件中需要定义info属性,示例:

# 插件基本信息
public $info = array(
    'name'        => 'IdcsmartTicket', //插件英文名,作为插件唯一标识,改成你的插件英文就行了
    'title'       => '智简魔方工单插件', //插件名称
    'description' => '智简魔方工单插件', //插件描述
    'author'      => 'idcsmart',  //开发者
    'version'     => '1.0',      // 版本号
);

④必须实现install()安装以及uninstall()卸载方法

⑤可实现钩子方法,如要实现订单创建后钩子 after_order_create,则可在此文件中创建以下公共方法:

public function afterOrderCreate($param)

⑥系统会在订单创建后的位置放置⑤中的钩子,放置方式:

hook('after_order_create', ['id' => $orderId]);

⑦如果定义变量noNav,表示不需要默认导航(具体参考7,插件后台导航)

public $noNav;

创建插件后台控制器 idcsmart_ticket\controller\TicketController.php

①命名空间addon\idcsmart_ticket\controller;

②继承后台基类控制器PluginAdminBaseController,增加了权限控制,允许使用一些通用方法;

③get_admin_id()可获取后台管理员登录ID;

④实现接口,如 public function ticketList(),系统默认访问此接口的 URL 为:

网站地址/{DIR_ADMIN}/addon?_plugin=idcsmart_ticket&_controller=ticket&_action=ticket_list

系统默认地址需要登录,若需要免登录访问,需要自定义路由(见后面自定义路由)。

⑤系统提供了生成④中默认访问地址的方法:

idcsmart_addon_url($url, $vars = [], $is_admin = false)

参数说明

参数类型必填说明
urlstring格式:插件名://控制器名/方法,如 IdcsmartTicket://Ticket/ticketList
varsarray参数,默认为空数组
Is_adminboolean是否后台,默认为false

创建插件前台控制器idcsmart_ticket\controller\clientarea\TicketController

.php

①命名空间addon\idcsmart_ticket\controller\clientarea;

②继承前台基类控制器PluginBaseController,允许使用一些通用方法;

③get_client_id()可获取前台客户登录ID;

④实现接口,如 public function ticketList(),系统默认访问此接口的 URL 为:

网站地址/console/addon?_plugin=idcsmart_ticket&_controller=ticket&_action=ticket_list

或者使用插件 ID(以下 1 表示插件 ID):

网站地址/console/addon?_plugin=1&_controller=ticket&_action=ticket_list

说明:系统默认地址默认登录,若需要免登录访问,需要自定义路由(见后面自定义路由);

⑤系统提供了生成④中默认访问地址的方法:

idcsmart_addon_url($url, $vars = [], $is_admin = false)

参数说明

参数类型必填说明
urlstring格式:插件名://控制器名/方法,如 IdcsmartTicket://Ticket/ticketList
varsarray参数,默认为空数组
Is_adminboolean是否后台,默认为false

插件提供两种路由

①、系统默认url带参数,参考4

②、自定义路由,插件根目录下定义route.php,示例:

前台路由:

Route::group('console/v1',function (){

Route::get('ticket',"\\addon\\idcsmart_ticket\\controller\\clientarea\\TicketController@ticketList")->append(['_plugin'=>'idcsmart_ticket','_controller'=>'ticket','_action'=>'ticket_list']);# 带上默认参数,可以使用继承控制器app\admin\controller\PluginBaseController的一些通用方法,也可以不追加这些参数(_plugin插件名称C风格,_controller控制器名称C风格,_action方法名称C风格)

})->middleware(\app\http\middleware\ParamFilter::class)

->middleware(\app\http\middleware\CheckHome::class);#前台需要登录就使用此中间件

后台路由:

Route::group(DIR_ADMIN . '/v1',function (){

Route::get('ticket',"\\addon\idcsmart_ticket\controller\TicketController@ticketList")->append(['_plugin'=>'idcsmart_ticket','_controller'=>'ticket','_action'=>'ticket_list']);})->middleware(\app\http\middleware\ParamFilter::class)->

middleware(\app\http\middleware\CheckAdmin::class);#后台需要登录就使用此中间件

插件多语言

①创建语言文件lang/zh-cn.php,返回如下格式的数组:

return [
    'success_message' => '请求成功',
    'ticket_title_require' => '请输入工单标题',
'ticket_log_client_create_ticket' => '{client}新建工单:{ticket_id}',
]

②使用 lang_plugins('语言标识', $param = []) 实现多语言,$param 为语言文件中的参数,例如:

lang_plugins('ticket_log_client_create_ticket', ['{client}' => 'wyh', '{ticket_id}' => 1]);

③前端多语言文件

前台语言文件:在template/clientarea/lang/目录下index.js文件;

后台语言文件:在template/admin/lang目录下

(function () {

  const module_lang = {

    "zh-cn": {

      add: "添加",

    },

    "zh-hk": {

      add: "添加",

    },

    "en-us": {

      add: "Add",

    },

  };

  const DEFAULT_LANG = localStorage.getItem("backLang") || "zh-cn";

  window.module_lang = module_lang[DEFAULT_LANG];

})();

具体参考idcsmart_ticket工单插件

插件后台导航

①导航默认会创建在插件导航之下,默认链接:plugin/插件名/index.html,对应template/admin/index.php文件,同时需要在lang/下的语言文件创建如下格式的语言,nav_plugin_addon_插件名:

'nav_plugin_addon_idcsmart_ticket' => '工单',

②自定义导航,若是一级导航,会增加在插件导航之上,管理导航之下,在插件根目录下创建sidebar.php,示例:

/*
 *  自定义后台导航菜单(仅支持一二级),注意系统会在插件导航下默认创建url为"plugin/插件名称/index.html"的导航,因此需要在template/admin/目录下创建index.php文件作为插件入口
 */
return [
    [ # 一级导航
        'name' => 'nav_plugin_addon_ticket', # 导航名称,不要与系统冲突(参考idcsmart_nav表中name字段),同时需要在lang/目录下定义语言
        'url'  => '', # 为空表示一级导航,不需要链接
        'icon' => 'tools', # 图标,获取图标:https://tdesign.tencent.com/vue/components/icon
        'in' => '', # 一级导航,此值为空
        'child' => [ # 二级导航
            [
                'name' => 'nav_plugin_addon_ticket_list', # 导航名称
                'url' => 'ticket', # 链接格式,会自动加上.html
                'in' => 'nav_user_management', # 可定义导航在某个一级导航之下,默认会放置在此一级导航最后的位置(获取方式:idcsmart_nav表中的parent_id==0的name字段)
                'icon' => '', # 图标,获取图标:https://tdesign.tencent.com/vue/components/icon
            ],
            [
                'name' => 'nav_plugin_addon_ticket_internal_list', # 导航名称
                'url' => 'ticket_internal', # 链接格式,会自动加上.html
                'in' => '', # 可定义导航在某个一级导航之下,默认会放置在此一级导航最后的位置
                'icon' => '', # 图标,获取图标:https://tdesign.tencent.com/vue/components/icon
            ],
        ]
    ],
];

插件前台导航

①导航默认会创建在插件导航之下,默认链接:plugin/插件名/index.html;

②自定义导航,会增加在插件导航之上,管理导航之下,在插件根目录下创建sidebar_clientarea.php,示例:

/*
 *  自定义前台导航菜单(仅支持一二级)
 */
return [
    [
        'name' => 'nav_plugin_addon_ticket', # 链接名称,同时需要在lang/目录下定义语言
        'url'  => '', # 链接格式,会自动加上.html
        'icon' => '', # 图标
        'child' => [ # 二级菜单
            [
                'name' => 'nav_plugin_addon_ticket_list',
                'url' => 'ticket',
                'icon' => '', # 图标
            ],
        ]
    ],
];

插件后台权限管理

在插件根目录下创建auth.php,示例如下(注意定义语言):

<?php
/*
 *  定义权限,系统会默认插入名称为插件名的一级权限,以下仅需定义二级/三级权限;(首先,要使用二级权限,插件后台控制器需要继承app\event\controller\PluginAdminBaseController基类控制器)
 */
return [
    [
        'title' => 'auth_plugin_addon_ticket_list', # y用户工单
        'url' => 'ticket',
        'child' => [ # 操作权限
            [
                'title' => 'auth_plugin_addon_ticket_view', # 工单查看
                'url' => '',
                'auth_rule' => 'TicketController::ticketList',  # 工单列表具体控制器方法
                'auth_rule_title' => 'auth_rule_plugin_addon_ticket_list'  # 具体权限名称
            ],
            [
                'title' => 'auth_plugin_addon_ticket_receive',
                'url' => '',
                'auth_rule' => 'TicketController::receive',
                'auth_rule_title' => 'auth_rule_plugin_addon_ticket_receive'  # 具体权限名称
            ],
            [
                'title' => 'auth_plugin_addon_ticket_resolved',
                'url' => '',
                'auth_rule' => 'TicketController::resolved',
                'auth_rule_title' => 'auth_rule_plugin_addon_ticket_resolved'  # 具体权限名称
            ],
        ]
    ],
    [
        'title' => 'auth_plugin_addon_ticket_detail', # 工单详情
        'url' => 'ticket_detail',
        'child' => [
            [
                'title' => 'auth_plugin_addon_ticket_view',
                'url' => '',
                'auth_rule' => 'TicketController::index',
                'auth_rule_title' => 'auth_rule_plugin_addon_ticket_index'  # 具体权限名称
            ],
            [
                'title' => 'auth_plugin_addon_ticket_reply',
                'url' => '',
                'auth_rule' => 'TicketController::reply',
                'auth_rule_title' => 'auth_rule_plugin_addon_ticket_reply'  # 具体权限名称
            ],
            [
                'title' => 'auth_plugin_addon_ticket_download',
                'url' => '',
                'auth_rule' => 'TicketController::download',
                'auth_rule_title' => 'auth_rule_plugin_addon_ticket_download'  # 具体权限名称
            ],
        ]
    ],
    [
        'title' => 'auth_plugin_addon_ticket_internal_list', # 内部工单
        'url' => 'ticket_internal',
        'child' => [
            [
                'title' => 'auth_plugin_addon_ticket_view',
                'url' => '',
                'auth_rule' => 'TicketInternalController::ticketInternalList',
                'auth_rule_title' => 'auth_rule_plugin_addon_ticket_internal_list'  # 具体权限名称
            ],
            [
                'title' => 'auth_plugin_addon_ticket_view',
                'url' => '',
                'auth_rule' => 'TicketInternalController::index',
                'auth_rule_title' => 'auth_rule_plugin_addon_ticket_internal_index'  # 具体权限名称
            ],
            [
                'title' => 'auth_plugin_addon_ticket_add',
                'url' => '',
                'auth_rule' => 'TicketInternalController::create',
                'auth_rule_title' => 'auth_rule_plugin_addon_ticket_internal_create'  # 具体权限名称
            ],
            [
                'title' => 'auth_plugin_addon_ticket_receive',
                'url' => '',
                'auth_rule' => 'TicketInternalController::receive',
                'auth_rule_title' => 'auth_rule_plugin_addon_ticket_internal_receive'  # 具体权限名称
            ],
            [
                'title' => 'auth_plugin_addon_ticket_resolved',
                'url' => '',
                'auth_rule' => 'TicketInternalController::resolved',
                'auth_rule_title' => 'auth_rule_plugin_addon_ticket_internal_resolved'  # 具体权限名称
            ],
            [
                'title' => 'auth_plugin_addon_ticket_reply',
                'url' => '',
                'auth_rule' => 'TicketInternalController::reply',
                'auth_rule_title' => 'auth_rule_plugin_addon_ticket_internal_reply'  # 具体权限名称
            ],
            [
                'title' => 'auth_plugin_addon_ticket_forward',
                'url' => '',
                'auth_rule' => 'TicketInternalController::forward',
                'auth_rule_title' => 'auth_rule_plugin_addon_ticket_internal_forward'  # 具体权限名称
            ],
        ]
    ],
];

插件接口内部调用

使用 plugin_api() 函数可内部调用插件 API,需要开发者提供插件 API 开发文档,具体格式参考系统 API 文档。

/**
 * @param string addon - 插件 require
 * @param string controller - 控制器前缀 require
 * @param string action - 方法 require
 * @param array param - 传入的参数
 */
plugin_api($addon, $controller, $action, $param = [])

示例

具体可参考智简魔方工单插件 public/plugins/addon/idcsmart_ticket/