免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2750 | 回复: 0
打印 上一主题 下一主题

比onethink更好用的插件机制 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-12 13:37 |只看该作者 |倒序浏览
自主开发的thinkphp插件机制,比onethink方便移植,升级和二次开发。

代码
  1. 核心类
  2. <?php
  3. // +----------------------------------------------------------------------
  4. // | Thinkphp [ WE CAN DO IT JUST THINK IT ]
  5. // +----------------------------------------------------------------------
  6. // | Copyright (c) 2015 http://www.inuoer.com All rights reserved.
  7. // +----------------------------------------------------------------------
  8. // | Author: better <einsqing@gmail.com>
  9. // +----------------------------------------------------------------------

  10. namespace Common\Controller;
  11. use Think\Controller;

  12. /**
  13. * 插件类
  14. * @author better <einsqing@gmail.com>
  15. */
  16. abstract class Addon extends Controller
  17. {
  18.     /**
  19.      * 视图实例对象
  20.      * @var view
  21.      * @access protected
  22.      */
  23.     protected $view = null;

  24.     public $addon_path = '';
  25.     public $config_file = '';
  26.     public $view_path = '';

  27.     public function __construct()
  28.     {
  29.         $this->view = \Think\Think::instance('Think\View');
  30.         $this->addon_path = ADDON_PATH . '/' . $this->getName() . '/';
  31.         //重置视图配置
  32.         C('DEFAULT_THEME', '');
  33.         C('VIEW_PATH', '');
  34.         if (is_file($this->addon_path . 'Conf/config.php')) {
  35.             $this->config_file = $this->addon_path . 'Conf/config.php';
  36.             $config = require $this->config_file;
  37.             C($config);
  38.         }

  39.         $this->view_path = __ROOT__ . '/' . ADDON_PATH . '/' . $this->getName() . '/';
  40.         C("TMPL_PARSE_STRING", array(
  41.             '__IMG__' => $this->view_path . 'View' . C("DEFAULT_THEME") . '/Public/image',
  42.             '__CSS__' => $this->view_path . 'View' . C("DEFAULT_THEME") . '/Public/css',
  43.             '__JS__' => $this->view_path . 'View' . C("DEFAULT_THEME") . '/Public/js',
  44.             '__ADDON_PUBLIC__' => $this->view_path . 'View' . C("DEFAULT_THEME") . '/Public',
  45.         ));
  46.     }

  47.     /**
  48.      * 模板主题设置
  49.      * @access protected
  50.      * @param string $theme 模版主题
  51.      * @return Action
  52.      */
  53.     final protected function theme($theme)
  54.     {
  55.         $this->view->theme($theme);
  56.         return $this;
  57.     }

  58.     //显示方法
  59.     final protected function display($template = '')
  60.     {
  61.         if ($template == '')
  62.             $template = CONTROLLER_NAME;
  63.         $action = ACTION_NAME;

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

  66.     /**
  67.      * 模板变量赋值
  68.      * @access protected
  69.      * @param mixed $name 要显示的模板变量
  70.      * @param mixed $value 变量的值
  71.      * @return Action
  72.      */
  73.     final protected function assign($name, $value = '')
  74.     {
  75.         $this->view->assign($name, $value);
  76.         return $this;
  77.     }


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

  87.             if (!is_file($templateFile)) {
  88.                 throw new \Exception("模板不存在:$templateFile");
  89.             }
  90.         }
  91.         return $this->view->fetch($templateFile);
  92.     }

  93.     final public function getName()
  94.     {
  95.         $class = get_class($this);

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


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

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

  103. }

  104. 核心方法

  105. /**
  106. * 执行SQL文件
  107. */
  108. function execute_sql_file($sql_path)
  109. {
  110.     // 读取SQL文件
  111.     $sql = wp_file_get_contents($sql_path);
  112.     $sql = str_replace("\r", "\n", $sql);
  113.     $sql = explode(";\n", $sql);

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

  118.     // 开始安装
  119.     foreach ($sql as $value) {
  120.         $value = trim($value);
  121.         if (empty ($value))
  122.             continue;

  123.         $res = M()->execute($value);
  124.         // dump($res);
  125.         // dump(M()->getLastSql());
  126.     }
  127. }

  128. // 防超时的file_get_contents改造函数
  129. function wp_file_get_contents($url)
  130. {
  131.     $context = stream_context_create(array(
  132.         'http' => array(
  133.             'timeout' => 30
  134.         )
  135.     )); // 超时时间,单位为秒

  136.     return file_get_contents($url, 0, $context);
  137. }

  138. /**
  139. * 插件显示内容里生成访问插件的url
  140. * @param string $url url
  141. * @param array $param 参数
  142. * @author better
  143. * @useage u_addons('apply://App/Index/addorder',array('id'=>'1'))
  144. */
  145. function u_addons($url, $param = array()){
  146.     $url = explode('://', $url);
  147.     $addon = $url[0];
  148.     $url = $url[1];

  149.     $url = U($url, $param, false);
  150.     return $url . '/addon/' . $addon;
  151. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP