Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 
 

258 řádky
6.3 KiB

  1. <?php
  2. namespace think;
  3. use think\Config;
  4. use think\View;
  5. /**
  6. * 插件基类
  7. * Class Addons
  8. * @author Byron Sampson <xiaobo.sun@qq.com>
  9. * @package think\addons
  10. */
  11. abstract class Addons
  12. {
  13. // 视图实例对象
  14. protected $view = null;
  15. // 当前错误信息
  16. protected $error;
  17. // 插件目录
  18. public $addons_path = '';
  19. // 插件配置作用域
  20. protected $configRange = 'addonconfig';
  21. // 插件信息作用域
  22. protected $infoRange = 'addoninfo';
  23. /**
  24. * 架构函数
  25. * @access public
  26. */
  27. public function __construct()
  28. {
  29. $name = $this->getName();
  30. // 获取当前插件目录
  31. $this->addons_path = ADDON_PATH . $name . DS;
  32. // 初始化视图模型
  33. $config = ['view_path' => $this->addons_path];
  34. $config = array_merge(Config::get('template'), $config);
  35. $this->view = new View($config, Config::get('view_replace_str'));
  36. // 控制器初始化
  37. if (method_exists($this, '_initialize')) {
  38. $this->_initialize();
  39. }
  40. }
  41. /**
  42. * 读取基础配置信息
  43. * @param string $name
  44. * @return array
  45. */
  46. final public function getInfo($name = '')
  47. {
  48. if (empty($name)) {
  49. $name = $this->getName();
  50. }
  51. $info = Config::get($name, $this->infoRange);
  52. if ($info) {
  53. return $info;
  54. }
  55. $info_file = $this->addons_path . 'info.ini';
  56. if (is_file($info_file)) {
  57. $info = Config::parse($info_file, '', $name, $this->infoRange);
  58. $info['url'] = addon_url($name);
  59. }
  60. Config::set($name, $info, $this->infoRange);
  61. return $info ? $info : [];
  62. }
  63. /**
  64. * 获取插件的配置数组
  65. * @param string $name 可选模块名
  66. * @return array
  67. */
  68. final public function getConfig($name = '')
  69. {
  70. if (empty($name)) {
  71. $name = $this->getName();
  72. }
  73. $config = Config::get($name, $this->configRange);
  74. if ($config) {
  75. return $config;
  76. }
  77. $config_file = $this->addons_path . 'config.php';
  78. if (is_file($config_file)) {
  79. $temp_arr = include $config_file;
  80. foreach ($temp_arr as $key => $value) {
  81. $config[$value['name']] = $value['value'];
  82. }
  83. unset($temp_arr);
  84. }
  85. Config::set($name, $config, $this->configRange);
  86. return $config;
  87. }
  88. /**
  89. * 设置配置数据
  90. * @param $name
  91. * @param array $value
  92. * @return array
  93. */
  94. final public function setConfig($name = '', $value = [])
  95. {
  96. if (empty($name)) {
  97. $name = $this->getName();
  98. }
  99. $config = $this->getConfig($name);
  100. $config = array_merge($config, $value);
  101. Config::set($name, $config, $this->configRange);
  102. return $config;
  103. }
  104. /**
  105. * 设置插件信息数据
  106. * @param $name
  107. * @param array $value
  108. * @return array
  109. */
  110. final public function setInfo($name = '', $value = [])
  111. {
  112. if (empty($name)) {
  113. $name = $this->getName();
  114. }
  115. $info = $this->getInfo($name);
  116. $info = array_merge($info, $value);
  117. Config::set($name, $info, $this->infoRange);
  118. return $info;
  119. }
  120. /**
  121. * 获取完整配置列表
  122. * @param string $name
  123. * @return array
  124. */
  125. final public function getFullConfig($name = '')
  126. {
  127. $fullConfigArr = [];
  128. if (empty($name)) {
  129. $name = $this->getName();
  130. }
  131. $config_file = $this->addons_path . 'config.php';
  132. if (is_file($config_file)) {
  133. $fullConfigArr = include $config_file;
  134. }
  135. return $fullConfigArr;
  136. }
  137. /**
  138. * 获取当前模块名
  139. * @return string
  140. */
  141. final public function getName()
  142. {
  143. $data = explode('\\', get_class($this));
  144. return strtolower(array_pop($data));
  145. }
  146. /**
  147. * 检查基础配置信息是否完整
  148. * @return bool
  149. */
  150. final public function checkInfo()
  151. {
  152. $info = $this->getInfo();
  153. $info_check_keys = ['name', 'title', 'intro', 'author', 'version', 'state'];
  154. foreach ($info_check_keys as $value) {
  155. if (!array_key_exists($value, $info)) {
  156. return false;
  157. }
  158. }
  159. return true;
  160. }
  161. /**
  162. * 加载模板和页面输出 可以返回输出内容
  163. * @access public
  164. * @param string $template 模板文件名或者内容
  165. * @param array $vars 模板输出变量
  166. * @param array $replace 替换内容
  167. * @param array $config 模板参数
  168. * @return mixed
  169. * @throws \Exception
  170. */
  171. public function fetch($template = '', $vars = [], $replace = [], $config = [])
  172. {
  173. if (!is_file($template)) {
  174. $template = '/' . $template;
  175. }
  176. // 关闭模板布局
  177. $this->view->engine->layout(false);
  178. echo $this->view->fetch($template, $vars, $replace, $config);
  179. }
  180. /**
  181. * 渲染内容输出
  182. * @access public
  183. * @param string $content 内容
  184. * @param array $vars 模板输出变量
  185. * @param array $replace 替换内容
  186. * @param array $config 模板参数
  187. * @return mixed
  188. */
  189. public function display($content, $vars = [], $replace = [], $config = [])
  190. {
  191. // 关闭模板布局
  192. $this->view->engine->layout(false);
  193. echo $this->view->display($content, $vars, $replace, $config);
  194. }
  195. /**
  196. * 渲染内容输出
  197. * @access public
  198. * @param string $content 内容
  199. * @param array $vars 模板输出变量
  200. * @return mixed
  201. */
  202. public function show($content, $vars = [])
  203. {
  204. // 关闭模板布局
  205. $this->view->engine->layout(false);
  206. echo $this->view->fetch($content, $vars, [], [], true);
  207. }
  208. /**
  209. * 模板变量赋值
  210. * @access protected
  211. * @param mixed $name 要显示的模板变量
  212. * @param mixed $value 变量的值
  213. * @return void
  214. */
  215. public function assign($name, $value = '')
  216. {
  217. $this->view->assign($name, $value);
  218. }
  219. /**
  220. * 获取当前错误信息
  221. * @return mixed
  222. */
  223. public function getError()
  224. {
  225. return $this->error;
  226. }
  227. //必须实现安装
  228. abstract public function install();
  229. //必须卸载插件方法
  230. abstract public function uninstall();
  231. }