文档章节

比onethink更好用的插件机制

einsqing
 einsqing
发布于 2015/08/12 11:29
字数 519
阅读 222
收藏 2
核心类
<?php
// +----------------------------------------------------------------------
// | Thinkphp [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2015 http://www.inuoer.com All rights reserved.
// +----------------------------------------------------------------------
// | Author: better <einsqing@gmail.com>
// +----------------------------------------------------------------------

namespace Common\Controller;
use Think\Controller;

/**
 * 插件类
 * @author better <einsqing@gmail.com>
 */
abstract class Addon extends Controller
{
    /**
     * 视图实例对象
     * @var view
     * @access protected
     */
    protected $view = null;

    public $addon_path = '';
    public $config_file = '';
    public $view_path = '';

    public function __construct()
    {
        $this->view = \Think\Think::instance('Think\View');
        $this->addon_path = ADDON_PATH . '/' . $this->getName() . '/';
        //重置视图配置
        C('DEFAULT_THEME', '');
        C('VIEW_PATH', '');
        if (is_file($this->addon_path . 'Conf/config.php')) {
            $this->config_file = $this->addon_path . 'Conf/config.php';
            $config = require $this->config_file;
            C($config);
        }

        $this->view_path = __ROOT__ . '/' . ADDON_PATH . '/' . $this->getName() . '/';
        C("TMPL_PARSE_STRING", array(
            '__IMG__' => $this->view_path . 'View' . C("DEFAULT_THEME") . '/Public/image',
            '__CSS__' => $this->view_path . 'View' . C("DEFAULT_THEME") . '/Public/css',
            '__JS__' => $this->view_path . 'View' . C("DEFAULT_THEME") . '/Public/js',
            '__ADDON_PUBLIC__' => $this->view_path . 'View' . C("DEFAULT_THEME") . '/Public',
        ));
    }

    /**
     * 模板主题设置
     * @access protected
     * @param string $theme 模版主题
     * @return Action
     */
    final protected function theme($theme)
    {
        $this->view->theme($theme);
        return $this;
    }

    //显示方法
    final protected function display($template = '')
    {
        if ($template == '')
            $template = CONTROLLER_NAME;
        $action = ACTION_NAME;

        echo($this->fetch($template, $action));
    }

    /**
     * 模板变量赋值
     * @access protected
     * @param mixed $name 要显示的模板变量
     * @param mixed $value 变量的值
     * @return Action
     */
    final protected function assign($name, $value = '')
    {
        $this->view->assign($name, $value);
        return $this;
    }


    //用于显示模板的方法
    final protected function fetch($templateFile = CONTROLLER_NAME, $action = ACTION_NAME)
    {
        if (!is_file($templateFile)) {
            if (C('VIEW_PATH')) {
                $templateFile = C('VIEW_PATH') . C('DEFAULT_THEME') . '/' . $templateFile . '/' . $action . C('TMPL_TEMPLATE_SUFFIX');
            } else {
                $templateFile = $this->addon_path . 'View/' . C('DEFAULT_THEME') . '/' . $templateFile . '/' . $action . C('TMPL_TEMPLATE_SUFFIX');
            }

            if (!is_file($templateFile)) {
                throw new \Exception("模板不存在:$templateFile");
            }
        }
        return $this->view->fetch($templateFile);
    }

    final public function getName()
    {
        $class = get_class($this);

        $str = explode('\\', $class);
        return $str[1];
    }


    //必须实现安装
    abstract public function install();

    //必须卸载插件方法
    abstract public function uninstall();

}

核心方法

/**
 * 执行SQL文件
 */
function execute_sql_file($sql_path)
{
    // 读取SQL文件
    $sql = wp_file_get_contents($sql_path);
    $sql = str_replace("\r", "\n", $sql);
    $sql = explode(";\n", $sql);

    // 替换表前缀
    $orginal = 'wp_';
    $prefix = C('DB_PREFIX');
    $sql = str_replace("{$orginal}", "{$prefix}", $sql);

    // 开始安装
    foreach ($sql as $value) {
        $value = trim($value);
        if (empty ($value))
            continue;

        $res = M()->execute($value);
        // dump($res);
        // dump(M()->getLastSql());
    }
}

// 防超时的file_get_contents改造函数
function wp_file_get_contents($url)
{
    $context = stream_context_create(array(
        'http' => array(
            'timeout' => 30
        )
    )); // 超时时间,单位为秒

    return file_get_contents($url, 0, $context);
}

/**
 * 插件显示内容里生成访问插件的url
 * @param string $url url
 * @param array $param 参数
 * @author better
 * @useage u_addons('apply://App/Index/addorder',array('id'=>'1'))
 */
function u_addons($url, $param = array()){
    $url = explode('://', $url);
    $addon = $url[0];
    $url = $url[1];

    $url = U($url, $param, false);
    return $url . '/addon/' . $addon;
}


© 著作权归作者所有

einsqing
粉丝 39
博文 42
码字总数 15136
作品 8
郑州
程序员
私信 提问
OneThink 1.0 正式版发布,内容管理框架

OneThink1.0正式版发布 OneThink是一个开源的内容管理框架,基于最新的ThinkPHP3.2版本开发,提供更方便、更安全的WEB应用开发体验,采用了全新的架构设计和命名空间机制,融合了模块化、驱动...

流年
2013/12/19
5K
15
OneThink V1.0.130929开发版发布

OneThink V1.0.130929开发版发布------V1.0.130929开发版本是在9月19日发布的1.0beta版本的基础上,改进用户体验、增加了一些功能。 注意事项: 1、OneThink安装要求PHP5.3+版本; 2、目前开...

麦当苗儿
2013/09/30
764
1
OneThink内容管理框架即将发布

继ThinkPHP的SAE引擎、云引擎和TPM(ThinkPHPMobile)之后,上海顶想信息科技将于中秋发布一款内容管理框架OneThink,正式向应用开发迈出新的一步。 作为国内领先的WEB应用开发框架提供商,顶...

Topthink
2013/08/26
5.3K
4
独树一帜的微信公众号管理系统-Amango微信公众号管理

Amango•芒果微信公众号管理开发框架 简介:芒果微信公众号管理框架是基于Onethink开源框架进行的二次开发,它继承Onethink的基本CMS管理理念,丰富了对微信公众号管理的更好得支持。 因此,...

陈登禄
2014/11/06
4
0
onethink不能安装到已经存在的数据库中的问题

onethink官方版本 onethink1.0140202.zip 放到环境中,进行安装,到第二步时,怎么也通不过 因为我是安装到一个已经存在的库中,才有此问题 而该版本的InstallController的第81行的对已存在库...

qingfeng哥
2014/04/26
0
1

没有更多内容

加载失败,请刷新页面

加载更多

热点图heatMap.js V2.0 研究笔记 及应用

https://blog.csdn.net/rongchaoliu/article/details/47830799 调用方法 function init() { $.ajax({ url: "${request.contextPath}/refresh?type=1", type: "get",......

yan_liu
7分钟前
0
0
Kubernetes 支持 OpenAPI 的新功能

Open API 让 API 提供者可以定义自己的操作和模型,并让开发者可以自动化的生成喜欢语言的客户端,用以和 API 服务器通信。Kubernetes 已经支持 Swagger 1.2(OpenAPI 规范的前身)有一段时间...

xiangyunyan
11分钟前
0
0
深入分析Zookeeper原理

本章重点: 1.了解zookeeper 及zookeeper 的设计猜想 2. zookeeper集群角色 3. 深入分析ZAB协议 4. 从源码层面分析leader选举的实现过程 5. 关于zookeeper的数据存储  Zookeeper的由...

须臾之余
13分钟前
1
0
Spring Cloud Eureka 常用配置详解,建议收藏!

前几天,栈长分享了 《Spring Cloud Eureka 注册中心集群搭建,Greenwich 最新版!》,今天来分享下 Spring Cloud Eureka 常用的一些参数配置及说明。 Spring Boot 的配置参考Java技术栈微信...

Java技术栈
31分钟前
0
0
分布式项目(七)consul 服务注册与发现

说到分布式自然就离不开分布式和微服务的话题,简单聊一下。 微服务是一种软件架构方式,或者说一个一种结构设计风格,它并不是标准,它的逻辑是把一个整体服务按业务拆分成不同独立的服务,...

lelinked
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部