_service = $service; $this->_permission_manager = $permission_manager; } /** * First modules initialization */ public function actionInit() : void { \Yii::$app->moduleManager->getModules(); } /** * Activate module and apply it migration if needed * @param $name */ public function actionActivate($name) { $module = ModuleRecord::find()->andWhere(['name' => $name])->one(); if ($module || $module->isDisabled()) { $this->_service->enable($module); } } public function actionSetSystem($name) { $module = ModuleRecord::find()->andWhere(['name' => $name])->one(); if ($module) { $this->_service->setSystem($module); } } public function actionInstall($name) { $path = \Yii::getAlias('@common/modules/' . $name); echo ConsoleColor::log('Installing module: ', 'yellow') . ConsoleColor::log($name, 'white') . PHP_EOL; // check exists if (file_exists($path)) { echo ConsoleColor::log('Module ' . $name . ' already exists', 'red') . PHP_EOL; return; } // create folder mkdir($path); // git clone chdir($path); echo ConsoleColor::log('Git clone: ', 'normal'); shell_exec('git clone https://gitlab.com/zertex/zxcms-' . $name . '.git .'); echo ConsoleColor::log('complete', 'white') . PHP_EOL; // get module manifest $manifest = require \Yii::getAlias('@common/modules/' . $name . '/manifest.php'); // migration echo ConsoleColor::log('Database: ', 'normal'); if (file_exists($path . '/migrations')) { shell_exec('php ' . __DIR__ . '/../../yii migrate --migrationPath=' . $path . '/migrations --interactive=0'); } echo ConsoleColor::log('complete', 'white') . PHP_EOL; // add module record with active flag $db_module = ModuleRecord::find()->andWhere(['name' => $name])->one(); if (!$db_module) { $this->_service->create($name, 'common\\modules\\' . $name . '\\' . $manifest['module'], 'common', 1); } // init permissions echo ConsoleColor::log('Permissions: ', 'normal'); if (isset($manifest['permissions']) && is_array($manifest['permissions'])) { $this->assignPermissions($manifest['permissions']); } echo ConsoleColor::log('complete', 'white') . PHP_EOL; // regenerate cp global search echo ConsoleColor::log('Search database: ', 'normal'); SearchPerformance::init(); echo ConsoleColor::log('complete', 'white') . PHP_EOL; echo ConsoleColor::log('Module ' . $name . ' successfully installed', 'light_green') . PHP_EOL; } public function actionRemove($name) { // drop module record $db_module = ModuleRecord::find()->andWhere(['name' => $name])->one(); if ($db_module == ModuleRecord::SYSTEM_YES) { echo ConsoleColor::log('Module ' . $name . ' is system. Cannot be deleted.', 'red') . PHP_EOL; return; } if ($db_module) { $this->_service->delete($db_module); } $path = \Yii::getAlias('@common/modules/' . $name); echo ConsoleColor::log('Removing module: ', 'yellow') . ConsoleColor::log($name, 'white') . PHP_EOL; // get module manifest $manifest = require \Yii::getAlias('@common/modules/' . $name . '/manifest.php'); // revert migration echo ConsoleColor::log('Database: ', 'normal'); if (file_exists($path . '/migrations')) { shell_exec('php ' . __DIR__ . '/../../yii migrate/down 500 --migrationPath=' . $path . '/migrations --interactive=0'); } echo ConsoleColor::log('clean', 'white') . PHP_EOL; // check exists, remove if founded echo ConsoleColor::log('Module files: ', 'normal'); if (file_exists($path)) { FileHelper::removeDirectory($path); } echo ConsoleColor::log('clean', 'white') . PHP_EOL; // drop permissions echo ConsoleColor::log('Permissions: ', 'normal'); if (isset($manifest['permissions']) && is_array($manifest['permissions'])) { $this->removePermissions($manifest['permissions']); } echo ConsoleColor::log('clean', 'white') . PHP_EOL; // regenerate cp global search echo ConsoleColor::log('Search database: ', 'normal'); SearchPerformance::init(); echo ConsoleColor::log('complete', 'white') . PHP_EOL; echo ConsoleColor::log('Module ' . $name . ' successfully deleted', 'light_green') . PHP_EOL; } private function assignPermissions(array $permissions): void { foreach ($permissions as $permission => $description) { if (!$this->_permission_manager->permissionExists($permission)) { $this->_permission_manager->create($permission, $description); } } } private function removePermissions(array $permissions) { foreach ($permissions as $permission => $description) { if ($this->_permission_manager->permissionExists($permission)) { $this->_permission_manager->delete($permission); } } } }