Administer.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. <?php
  2. /*
  3. * FecShop file.
  4. *
  5. * @link http://www.fecshop.com/
  6. * @copyright Copyright (c) 2016 FecShop Software LLC
  7. * @license http://www.fecshop.com/license/
  8. */
  9. namespace fecshop\services\extension;
  10. //use fecshop\models\mysqldb\cms\StaticBlock;
  11. use Yii;
  12. use fecshop\services\Service;
  13. /**
  14. * @author Terry Zhao <2358269014@qq.com>
  15. * @since 1.0
  16. */
  17. class Administer extends Service
  18. {
  19. // 卸载应用,是否删除掉应用的文件夹
  20. public $uninstallRemoveFile = true;
  21. public $currentNamespace;
  22. /**
  23. * 1.插件的安装
  24. * @param $extension_name | string , 插件名称(唯一)
  25. * @param $forceInstall | boolean , 是否强制安装(即使安装了,还是强制执行安装的代码。)
  26. * @return boolean 安装成功返回的状态
  27. *
  28. */
  29. public function install($extension_namespace, $forceInstall=false)
  30. {
  31. // 插件不存在
  32. $modelOne = Yii::$service->extension->getByNamespace($extension_namespace);
  33. if (!$modelOne['namespace']) {
  34. Yii::$service->helper->errors->add('extension: {namespace} is not exist', ['namespace' =>$extension_namespace ]);
  35. return false;
  36. }
  37. $this->currentNamespace = $extension_namespace;
  38. // 插件已经安装
  39. $installed_status = $modelOne['installed_status'];
  40. if (!$forceInstall && Yii::$service->extension->isInstalledStatus($installed_status)) {
  41. Yii::$service->helper->errors->add('extension: {namespace} has installed', ['namespace' =>$extension_namespace ]);
  42. return false;
  43. }
  44. // 通过数据库找到应用的配置文件路径
  45. $extensionConfigFile = Yii::getAlias($modelOne['config_file_path']);
  46. if (!file_exists($extensionConfigFile)) {
  47. Yii::$service->helper->errors->add('extension: {namespace} [{extensionConfigFile}]config file is not exit', ['namespace' =>$extension_namespace, 'extensionConfigFile' => $extensionConfigFile ]);
  48. return false;
  49. }
  50. // 加载应用配置
  51. $extensionConfig = require($extensionConfigFile);
  52. // 如果没有该配置,说明该插件不需要进行安装操作。
  53. if (!isset($extensionConfig['administer']['install'])) {
  54. Yii::$service->helper->errors->add('extension: {namespace}, have no install file function', ['namespace' =>$extension_namespace ]);
  55. return false;
  56. }
  57. // 事务操作, 只对mysql有效,如果是mongodb,无法回滚
  58. $innerTransaction = Yii::$app->db->beginTransaction();
  59. try {
  60. // 执行应用的install部分功能
  61. if (!Yii::$service->extension->installAddons($extensionConfig['administer']['install'], $modelOne)) {
  62. $innerTransaction->rollBack();
  63. return false;
  64. }
  65. $innerTransaction->commit();
  66. return true;
  67. } catch (\Exception $e) {
  68. $innerTransaction->rollBack();
  69. Yii::$service->helper->errors->add($e->getMessage());
  70. return false;
  71. }
  72. return false;
  73. }
  74. public function testInstall($extension_namespace, $forceInstall=false)
  75. {
  76. // 插件不存在
  77. $modelOne = Yii::$service->extension->getByNamespace($extension_namespace);
  78. if (!$modelOne['namespace']) {
  79. Yii::$service->helper->errors->add('extension: {namespace} is not exist', ['namespace' =>$extension_namespace ]);
  80. return false;
  81. }
  82. $this->currentNamespace = $extension_namespace;
  83. // 通过数据库找到应用的配置文件路径
  84. $extensionConfigFile = Yii::getAlias($modelOne['config_file_path']);
  85. if (!file_exists($extensionConfigFile)) {
  86. Yii::$service->helper->errors->add('extension: {namespace} [{extensionConfigFile}]config file is not exit', ['namespace' =>$extension_namespace, 'extensionConfigFile' => $extensionConfigFile ]);
  87. return false;
  88. }
  89. // 加载应用配置
  90. $extensionConfig = require($extensionConfigFile);
  91. // 如果没有该配置,说明该插件不需要进行安装操作。
  92. if (!isset($extensionConfig['administer']['install'])) {
  93. Yii::$service->helper->errors->add('extension: {namespace}, have no install file function', ['namespace' =>$extension_namespace ]);
  94. return false;
  95. }
  96. // 事务操作, 只对mysql有效,如果是mongodb,无法回滚
  97. $innerTransaction = Yii::$app->db->beginTransaction();
  98. try {
  99. // 执行应用的install部分功能
  100. if (!Yii::$service->extension->testInstallAddons($extensionConfig['administer']['install'], $modelOne)) {
  101. $innerTransaction->rollBack();
  102. return false;
  103. }
  104. $innerTransaction->commit();
  105. return true;
  106. } catch (\Exception $e) {
  107. $innerTransaction->rollBack();
  108. Yii::$service->helper->errors->add($e->getMessage());
  109. return false;
  110. }
  111. return false;
  112. }
  113. /**
  114. * 应用升级函数
  115. * @param $extension_namespace | string , 插件的名称
  116. */
  117. public function upgrade($extension_namespace)
  118. {
  119. // 插件不存在
  120. $modelOne = Yii::$service->extension->getByNamespace($extension_namespace);
  121. if (!$modelOne['namespace']) {
  122. Yii::$service->helper->errors->add('extension: {namespace} is not exist', ['namespace' =>$extension_namespace ]);
  123. return false;
  124. }
  125. $this->currentNamespace = $extension_namespace;
  126. // 插件如果没有安装
  127. $installed_status = $modelOne['installed_status'];
  128. if (!Yii::$service->extension->isInstalledStatus($installed_status)) {
  129. Yii::$service->helper->errors->add('extension: {namespace} has not installed', ['namespace' =>$extension_namespace ]);
  130. return false;
  131. }
  132. // 通过数据库找到应用的配置文件路径,如果配置文件不存在
  133. $extensionConfigFile = Yii::getAlias($modelOne['config_file_path']);
  134. if (!file_exists($extensionConfigFile)) {
  135. Yii::$service->helper->errors->add('extension: {namespace} config file is not exit', ['namespace' =>$extension_namespace ]);
  136. return false;
  137. }
  138. // 加载应用配置
  139. $extensionConfig = require($extensionConfigFile);
  140. // 如果没有该配置,说明该插件不需要进行安装操作。
  141. if (!isset($extensionConfig['administer']['upgrade'])) {
  142. Yii::$service->helper->errors->add('extension: {namespace}, have no upgrade file function', ['namespace' =>$extension_namespace ]);
  143. return false;
  144. }
  145. // 事务操作, 只对mysql有效,如果是mongodb,无法回滚
  146. $innerTransaction = Yii::$app->db->beginTransaction();
  147. try {
  148. // 执行应用的upgrade部分功能
  149. if (!Yii::$service->extension->upgradeAddons($extensionConfig['administer']['upgrade'], $modelOne)) {
  150. $innerTransaction->rollBack();
  151. return false;
  152. }
  153. $innerTransaction->commit();
  154. return true;
  155. } catch (\Exception $e) {
  156. $innerTransaction->rollBack();
  157. Yii::$service->helper->errors->add($e->getMessage());
  158. return false;
  159. }
  160. return false;
  161. }
  162. public function testUpgrade($extension_namespace)
  163. {
  164. // 插件不存在
  165. $modelOne = Yii::$service->extension->getByNamespace($extension_namespace);
  166. if (!$modelOne['namespace']) {
  167. Yii::$service->helper->errors->add('extension: {namespace} is not exist', ['namespace' =>$extension_namespace ]);
  168. return false;
  169. }
  170. $this->currentNamespace = $extension_namespace;
  171. // 通过数据库找到应用的配置文件路径,如果配置文件不存在
  172. $extensionConfigFile = Yii::getAlias($modelOne['config_file_path']);
  173. if (!file_exists($extensionConfigFile)) {
  174. Yii::$service->helper->errors->add('extension: {namespace} config file is not exit', ['namespace' =>$extension_namespace ]);
  175. return false;
  176. }
  177. // 加载应用配置
  178. $extensionConfig = require($extensionConfigFile);
  179. // 如果没有该配置,说明该插件不需要进行安装操作。
  180. if (!isset($extensionConfig['administer']['upgrade'])) {
  181. Yii::$service->helper->errors->add('extension: {namespace}, have no upgrade file function', ['namespace' =>$extension_namespace ]);
  182. return false;
  183. }
  184. // 事务操作, 只对mysql有效,如果是mongodb,无法回滚
  185. $innerTransaction = Yii::$app->db->beginTransaction();
  186. try {
  187. // 执行应用的upgrade部分功能
  188. if (!Yii::$service->extension->testUpgradeAddons($extensionConfig['administer']['upgrade'], $modelOne)) {
  189. $innerTransaction->rollBack();
  190. return false;
  191. }
  192. $innerTransaction->commit();
  193. return true;
  194. } catch (\Exception $e) {
  195. $innerTransaction->rollBack();
  196. Yii::$service->helper->errors->add($e->getMessage());
  197. return false;
  198. }
  199. return false;
  200. }
  201. /**
  202. * 3.插件卸载。
  203. *
  204. */
  205. public function uninstall($extension_namespace)
  206. {
  207. // 插件不存在
  208. $modelOne = Yii::$service->extension->getByNamespace($extension_namespace);
  209. if (!$modelOne['namespace']) {
  210. Yii::$service->helper->errors->add('extension: {namespace} is not exist', ['namespace' =>$extension_namespace ]);
  211. return false;
  212. }
  213. $this->currentNamespace = $extension_namespace;
  214. // 插件如果没有安装
  215. $installed_status = $modelOne['installed_status'];
  216. if (!Yii::$service->extension->isInstalledStatus($installed_status)) {
  217. Yii::$service->helper->errors->add('extension: {namespace} has not installed', ['namespace' =>$extension_namespace ]);
  218. return false;
  219. }
  220. // 通过数据库找到应用的配置文件路径,如果配置文件不存在
  221. $extensionConfigFile = Yii::getAlias($modelOne['config_file_path']);
  222. if (!file_exists($extensionConfigFile)) {
  223. Yii::$service->helper->errors->add('extension: {namespace} config file is not exit', ['namespace' =>$extension_namespace ]);
  224. return false;
  225. }
  226. // 加载应用配置
  227. $extensionConfig = require($extensionConfigFile);
  228. // 如果没有该配置,说明该插件无法进行卸载操作
  229. if (!isset($extensionConfig['administer']['uninstall'])) {
  230. Yii::$service->helper->errors->add('extension: {namespace}, have no uninstall file function', ['namespace' =>$extension_namespace ]);
  231. return false;
  232. }
  233. // 事务操作, 只对mysql有效,执行插件的uninstall,并在extensions表中进行删除扩展配置
  234. $innerTransaction = Yii::$app->db->beginTransaction();
  235. try {
  236. // 执行应用的upgrade部分功能
  237. if (!Yii::$service->extension->uninstallAddons($extensionConfig['administer']['uninstall'], $modelOne)) {
  238. $innerTransaction->rollBack();
  239. return false;
  240. }
  241. $innerTransaction->commit();
  242. return true;
  243. } catch (\Exception $e) {
  244. $innerTransaction->rollBack();
  245. Yii::$service->helper->errors->add($e->getMessage());
  246. return false;
  247. }
  248. // 进行应用源文件的删除操作。
  249. $package = $modelOne['package'];
  250. $folder = $modelOne['folder'];
  251. if ($package && $folder && $this->uninstallRemoveFile) {
  252. $installPath = Yii::getAlias('@addons/' . $package . '/' . $folder);
  253. // 从配置中获取,是否进行应用文件夹的删除,如果是,则进行文件的删除。
  254. Yii::$service->helper->deleteDir($installPath);
  255. }
  256. return true;
  257. }
  258. public function testUninstall($extension_namespace)
  259. {
  260. // 插件不存在
  261. $modelOne = Yii::$service->extension->getByNamespace($extension_namespace);
  262. if (!$modelOne['namespace']) {
  263. Yii::$service->helper->errors->add('extension: {namespace} is not exist', ['namespace' =>$extension_namespace ]);
  264. return false;
  265. }
  266. $this->currentNamespace = $extension_namespace;
  267. // 通过数据库找到应用的配置文件路径,如果配置文件不存在
  268. $extensionConfigFile = Yii::getAlias($modelOne['config_file_path']);
  269. if (!file_exists($extensionConfigFile)) {
  270. Yii::$service->helper->errors->add('extension: {namespace} config file is not exit', ['namespace' =>$extension_namespace ]);
  271. return false;
  272. }
  273. // 加载应用配置
  274. $extensionConfig = require($extensionConfigFile);
  275. // 如果没有该配置,说明该插件无法进行卸载操作
  276. if (!isset($extensionConfig['administer']['uninstall'])) {
  277. Yii::$service->helper->errors->add('extension: {namespace}, have no uninstall file function', ['namespace' =>$extension_namespace ]);
  278. return false;
  279. }
  280. // 事务操作, 只对mysql有效,执行插件的uninstall,并在extensions表中进行删除扩展配置
  281. $innerTransaction = Yii::$app->db->beginTransaction();
  282. try {
  283. // 执行应用的upgrade部分功能
  284. if (!Yii::$service->extension->testUninstallAddons($extensionConfig['administer']['uninstall'], $modelOne)) {
  285. $innerTransaction->rollBack();
  286. return false;
  287. }
  288. $innerTransaction->commit();
  289. return true;
  290. } catch (\Exception $e) {
  291. $innerTransaction->rollBack();
  292. Yii::$service->helper->errors->add($e->getMessage());
  293. return false;
  294. }
  295. // 进行应用源文件的删除操作。
  296. $package = $modelOne['package'];
  297. $folder = $modelOne['folder'];
  298. if ($package && $folder && $this->uninstallRemoveFile) {
  299. $installPath = Yii::getAlias('@addons/' . $package . '/' . $folder);
  300. // 从配置中获取,是否进行应用文件夹的删除,如果是,则进行文件的删除。
  301. Yii::$service->helper->deleteDir($installPath);
  302. }
  303. return true;
  304. }
  305. // 数据库的安装
  306. protected function installDbData($modelOne)
  307. {
  308. }
  309. // theme文件进行copy到@app/theme/base/addons 下面。
  310. public function copyThemeFile($sourcePath)
  311. {
  312. if (!$this->currentNamespace) {
  313. Yii::$service->helper->errors->add('copyThemeFile: current extension: {namespace} is not exist', ['namespace' =>$this->currentNamespace ]);
  314. return false;
  315. }
  316. $targetPath = Yii::getAlias('@appimage/common/addons/'.$this->currentNamespace);
  317. Yii::$service->helper->copyDirImage($sourcePath, $targetPath);
  318. }
  319. // theme文件进行copy到@app/theme/base/addons 下面。
  320. public function removeThemeFile()
  321. {
  322. if (!$this->currentNamespace) {
  323. Yii::$service->helper->errors->add('removeThemeFile: current extension: {namespace} is not exist', ['namespace' =>$this->currentNamespace ]);
  324. return false;
  325. }
  326. $sourcePath = Yii::getAlias('@appimage/common/addons/'.$this->currentNamespace);
  327. Yii::$service->helper->deleteDir($sourcePath);
  328. return true;
  329. }
  330. }