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.
		
		
		
		
		
			
		
			
				
					
					
						
							106 lines
						
					
					
						
							3.0 KiB
						
					
					
				
			
		
		
	
	
							106 lines
						
					
					
						
							3.0 KiB
						
					
					
				<?php | 
						|
/** | 
						|
 * Created by Error202 | 
						|
 * Date: 20.08.2018 | 
						|
 */ | 
						|
 | 
						|
namespace core\components\modules; | 
						|
 | 
						|
use core\entities\ModuleRecord; | 
						|
use core\services\ModuleService; | 
						|
use Yii; | 
						|
use yii\helpers\ArrayHelper; | 
						|
use yii\helpers\FileHelper; | 
						|
 | 
						|
class ModuleManager | 
						|
{ | 
						|
    public $moduleNames = []; | 
						|
    public $modules = []; | 
						|
 | 
						|
    private $_service; | 
						|
 | 
						|
    public function __construct(ModuleService $service) | 
						|
    { | 
						|
        $this->_service = $service; | 
						|
    } | 
						|
 | 
						|
    public function appendToMigrationTable($name) | 
						|
    { | 
						|
        $time       = time(); | 
						|
        $connection = Yii::$app->getDb(); | 
						|
        $command    = $connection->createCommand("INSERT INTO migration (version, apply_time) VALUE ('$name', '$time')"); | 
						|
        $command->execute(); | 
						|
    } | 
						|
 | 
						|
    public function removeFromMigrationTable($name) | 
						|
    { | 
						|
        $connection = Yii::$app->getDb(); | 
						|
        $command    = $connection->createCommand("DELETE FROM migration WHERE version = '$name'"); | 
						|
        $command->execute(); | 
						|
    } | 
						|
 | 
						|
    public function getModules() : array | 
						|
    { | 
						|
        $modules      = []; | 
						|
        $localModules = $this->getLocalModules(); | 
						|
        foreach ($localModules as $local_module) { | 
						|
            $db_module = ModuleRecord::find()->andWhere(['name' => $local_module['name']])->one(); | 
						|
            if ($this->isTableExist('modules') && !$db_module) { | 
						|
                $db_module              = $this->_service->create($local_module['name'], 'common\\modules\\' . $local_module['name'] . '\\' . $local_module['module']); | 
						|
                $db_module->description = $local_module['description']; | 
						|
                $modules[]              = $db_module; | 
						|
            } else { | 
						|
                $db_module->description = $local_module['description']; | 
						|
                $modules[]              = $db_module; | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        return $modules; | 
						|
    } | 
						|
 | 
						|
    public function getLocalModules() | 
						|
    { | 
						|
        $this->getLocalModulesNames(); | 
						|
 | 
						|
        if (empty($this->modules)) { | 
						|
            foreach ($this->moduleNames as $module_name) { | 
						|
                $manifest = Yii::getAlias('@common/modules/' . $module_name . '/manifest.php'); | 
						|
                if (file_exists($manifest)) { | 
						|
                    $this->modules[] = require $manifest; | 
						|
                } | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        return $this->modules; | 
						|
    } | 
						|
 | 
						|
    public function isExists($name): bool | 
						|
    { | 
						|
        $this->getLocalModules(); | 
						|
        $modules = ArrayHelper::getColumn($this->modules, 'name'); | 
						|
        return in_array($name, $modules); | 
						|
    } | 
						|
 | 
						|
    private function getLocalModulesNames(): void | 
						|
    { | 
						|
        if (!empty($this->moduleNames)) { | 
						|
            return; | 
						|
        } | 
						|
 | 
						|
        $names      = []; | 
						|
        $modulePath = Yii::getAlias('@common/modules'); | 
						|
        $modules    = file_exists($modulePath) ? FileHelper::findDirectories($modulePath, [ | 
						|
            'recursive' => false, | 
						|
        ]) : []; | 
						|
        foreach ($modules as $module) { | 
						|
            $module  = basename($module); | 
						|
            $names[] = $module; | 
						|
        } | 
						|
        $this->moduleNames = $names; | 
						|
    } | 
						|
 | 
						|
    public function isTableExist($name): bool | 
						|
    { | 
						|
        return Yii::$app->db->schema->getTableSchema($name) !== null; | 
						|
    } | 
						|
}
 | 
						|
 |