苹果CMS文档
分类

苹果CMS开发插件教程

2025-02-27 人阅读

开发标准:

插件不得篡改、替换、cms系统文件,只允许在不影响原有功能的情况添加配置参数,如【后台菜单配置、播放组配置】。如果每个开发者都不遵守该规则,那么应用市场面临各种相互不兼容问题,严重的还会影响cms本身功能以及安全问题,请广大开发者们务必遵守。

创建插件:

创建的插件可以在view视图中使用,也可以在php业务中使用 安装完成后访问系统时会在项目根目录生成名为addons的目录,在该目录中创建需要的插件。 下面写一个例子:

创建mydemo插件

在addons目录中创建mydemo目录

创建钩子实现类

在mydemo目录中创建Mydemo.php类文件。注意:类文件首字母需大写

<?php
namespace addons\mydemo;	// 注意命名空间规范
use thinkAddons;
/**
 * 插件测试
 * @author byron sampson
 */
class Mydemo extends Addons	// 需继承thinkaddonsAddons类
{
	// 该插件的基础信息
    public $info = [
        'name' => 'mydemo',	// 插件标识
        'title' => '插件测试',	// 插件名称
        'description' => 'thinkph5插件测试',	// 插件简介
        'status' => 0,	// 状态
        'author' => 'byron sampson',
        'version' => '0.1'
    ];

    /**
     * 插件安装方法
     * @return bool
     */
    public function install()
    {
        return true;
    }

    /**
     * 插件卸载方法
     * @return bool
     */
    public function uninstall()
    {
        return true;
    }

    /**
     * 实现的mydemohook钩子方法
     * @return mixed
     */
    public function mydemohook($param)
    {
		// 调用钩子时候的参数信息
        print_r($param);
		// 当前插件的配置信息,配置信息存在当前目录的config.php文件中,见下方
        print_r($this->getConfig());
		// 可以返回模板,模板文件默认读取的为插件目录中的文件。模板名不能为空!
        return $this->fetch('info');
    }

}

创建插件配置文件:

在mydemo目录中创建config.php类文件,插件配置文件可以自定义一些参数,然后在程序任何位置使用 get_addon_config(mydemo) 来获取定义的参数,后台打开配置视图为插件按钮的配置入口。

完整的config.php示例

<?php
return array (
   0 => array (
       'name' => 'rewrite', # 伪静态,在苹果cms开启路由模式后可在rewrite数组下的 value 添加路由规则
       'title' => '伪静态',
       'type' => 'array', # 数组类型
       'content' => array (),
       'value' => array (
          'index' => '/mydemo$',
          'api/index' => '/api$'
       ),
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => '',
   ),
   1 => array (
       'name' => 'open',
       'title' => '多选框',
       'type' => 'radio', # radio 多选框类型
       'content' => array (
          'on' => '启用',
          'off' => '关闭',
       ),
       'value' => 'off',
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => '',
   ),
   2 => array (
       'name' => 'open',
       'title' => '复选框',
       'type' => 'checkbox', # 复选框 类型
       'content' => array (
          'on' => '启用',
          'off' => '关闭',
       ),
       'value' => 'off',
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => '',
   ),
   3 => array (
       'name' => 'menu',
       'title' => '输入框',
       'type' => 'string', # 字符串 输入框类型
       'content' => array (),
       'value' => '1,2,3,4',
       'rule' => 'required',
       'msg' => '',
       'tip' => '备注文字',
       'ok' => '',
       'extend' => '', #string 类型支持 extend参数,如:style="line-height: 1.8;"
   ),
   4 => array (
       'name' => 'hot_banner',
       'title' => '下拉菜单',
       'type' => 'selects', # 下拉菜单类型
       'content' => array (
          0 => '小图风格',
          1 => '巨幕风格',
       ),
       'value' => '1',
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => '',
   ),
   5 => array (
       'name' => 'tiptext',
       'title' => '文本框',
       'type' => 'text', # textarea 文本框类型
       'content' => array (),
       'value' => '大家好我是老王,建站就用苹果cms',
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => 'style="height: 150px;"', # text 类型支持 extend参数,如:style="line-height: 1.8;"
   ),
   6 => array (
       'name' => 'go_time',
       'title' => '日期选择',
       'type' => 'datetime', # 日期选择器 类型
       'content' => array (),
       'value' => '1629560562',
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => '',
   ),
   7 => array (
       'name' => 'go_pic',
       'title' => '上传图片',
       'type' => 'images', # 上传图片表单类型
       'content' => array (),
       'value' => '',
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => '', 
   ),
   8 => array (
       'name' => 'go_file',
       'title' => '上传文件',
       'type' => 'files', # 上传文件表单类型
       'content' => array (),
       'value' => '',
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => '', 
   ),
   9 => array (
       'name' => 'go_bool',
       'title' => '双选表单',
       'type' => 'bool', # 双选表单类型
       'content' => array (),
       'value' => '',
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => '', 
   ),
 );

创建钩子模板文件:

在mydemo目录中创建info.html模板文件,钩子在使用fetch方法时对应的模板文件。

<h1>hello tpl</h1>

如果插件中需要有链接或提交数据的业务,可以在插件中创建controller业务文件,

要访问插件中的controller时使用addon_url生成url链接。

如下:

<a href="{:addon_url(&#x27;mydemo://Action/link&#x27;)}">link mydemo</a>

格式为:

mydemo为插件名,Action为controller中的类名,link为controller中的方法

创建插件的controller文件

在mydemo目录中创建controller目录,在controller目录中创建Action.php文件 controller类的用法与tp5中的controller一致

<?php
namespace addonsmydemoController;

class Action
{
    public function link()
    {
        echo &#x27;hello link&#x27;;
    }
}

如果需要使用view模板则需要继承thinkaddonsController类 模板文件所在位置为插件目录的view中,规则与模块中的view规则一致

<?php
namespace addonsmydemoController;

use thinkaddonsController;

class Action extends Controller
{
    public function link()
    {
        return $this->fetch();
    }
}

行为事件【钩子】:

在Mydemo.php 自定义 mydemohook 事件后,就可以在正常业务中使用该插件中的钩子了 使用钩子的时候第二个参数可以省略。苹果CMS中的行为支持ThinkPHP5的所有行为,以下是所有所支持的行为事件。

标签描述类型说明
APP_init应用初始化标签位系统
app_begin应用开始标签位系统
module_init模块初始化标签位系统
action_begin控制器开始标签位系统
view_filter视图输出过滤标签位系统
app_end应用结束标签位系统
log_write日志write方法标签位系统
log_write_done日志写入完成标签位系统
response_end输出结束标签位系统
response_send<img width="200/" className="medium-zoom-image"/>响应发送标签位 <img width="200/" className="medium-zoom-image"/>系统<img width="200/" className="medium-zoom-image"/>

说明:

在Mydemo.php 自定义 mydemohook 事件后,就可以在正常业务中使用该插件中的钩子了 使用钩子的时候第二个参数可以省略。苹果CMS中的行为支持ThinkPHP5的所有行为,以下是所有所支持的行为事件。

示例代码

比如我要写一个功能希望它 在 视图输出 时自动执行,那么只需要在 Mydemo.php 创建 viewFilter 方法即可,当插件启用时自动注册到view_filter 中,并且全局运行,不需要你在前台控制器或者模板中手动调用。

public function viewFilter(&$request)
    {
      if(ENTRANCE == "index"){ # 使用 ENTRANCE 判断是否为前台
         $isMobile = 0;
         $ua = strtolower($_SERVER[&#x27;HTTP_USER_AGENT&#x27;]);
         $uachar = "/(nokia|sony|ericsson|mot|samsung|sgh|lg|philips|panasonic|alcatel|lenovo|meizu|cldc|midp|iphone|wap|mobile|android)/i";
         if((preg_match($uachar, $ua))) {
            $isMobile = 1;
            echo &#x27;手机端&#x27;;
         }else{
            echo &#x27;电脑端&#x27;;   
         }
      } 
    }

模板中调用自定义行为

<div>{:hook(&#x27;mydemohook&#x27;, [&#x27;id&#x27;=>1])}</div>

php中调用自定义行为 只要是thinkphp5正常流程中的任意位置均可以使用

hook(&#x27;mydemohook&#x27;, [&#x27;id&#x27;=>1])

最终生成的目录结构为

maccms
 └─ addons
 │   └─mydemo
 │      └─controller
 │      │   └─Action.php
 │      │─view
 │      │   └─action
 │      │       └─link.html
 │      │─config.php
 │      │─info.ini
 │      │─Mydemo.php
 │─application
 │─thinkphp
 │─extend
 │─vendor
热门推荐