You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							114 lines
						
					
					
						
							3.7 KiB
						
					
					
				
			
		
		
	
	
							114 lines
						
					
					
						
							3.7 KiB
						
					
					
				<?php | 
						|
/** | 
						|
 * Created by Error202 | 
						|
 * Date: 04.09.2018 | 
						|
 */ | 
						|
 | 
						|
namespace console\controllers; | 
						|
 | 
						|
use console\components\ConsoleColor; | 
						|
use core\components\SearchPerformance; | 
						|
use core\entities\ModuleRecord; | 
						|
use core\services\ModuleService; | 
						|
use core\services\PermissionManager; | 
						|
use yii\console\Controller; | 
						|
 | 
						|
/** | 
						|
 * Modules management from console | 
						|
 * Class ModuleController | 
						|
 * @package console\controllers | 
						|
 */ | 
						|
class ModuleController extends Controller | 
						|
{ | 
						|
    /** | 
						|
     * @var ModuleService Modules management service | 
						|
     */ | 
						|
    private $_service; | 
						|
 | 
						|
    /** | 
						|
     * @var PermissionManager Manage permissions | 
						|
     */ | 
						|
    private $_permission_manager; | 
						|
 | 
						|
    public function __construct(string $id, $module, ModuleService $service, PermissionManager $permission_manager, array $config = []) | 
						|
    { | 
						|
        parent::__construct($id, $module, $config); | 
						|
        $this->_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 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; | 
						|
    } | 
						|
 | 
						|
    private function assignPermissions(array $permissions): void | 
						|
    { | 
						|
        foreach ($permissions as $permission => $description) { | 
						|
            if (!$this->_permission_manager->permissionExists($permission)) { | 
						|
                $this->_permission_manager->create($permission, $description); | 
						|
            } | 
						|
        } | 
						|
    } | 
						|
}
 | 
						|
 |