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.

113 lines
3.6 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);
// 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);
}
}
}
}