FIX: make artisan install-module really work with submodules
This commit is contained in:
@@ -16,7 +16,7 @@ class InstallModule extends Command
|
|||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
protected $signature = 'install-module {name}';
|
protected $signature = 'install-module {name} {parentModuleId?}';
|
||||||
/**
|
/**
|
||||||
* The console command description.
|
* The console command description.
|
||||||
*
|
*
|
||||||
@@ -24,6 +24,7 @@ class InstallModule extends Command
|
|||||||
*/
|
*/
|
||||||
protected $description = 'Custom installation of CMS module. Name given as directory name in /modules.';
|
protected $description = 'Custom installation of CMS module. Name given as directory name in /modules.';
|
||||||
protected $moduleName;
|
protected $moduleName;
|
||||||
|
protected $parentModuleId;
|
||||||
protected $modulesPath;
|
protected $modulesPath;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -45,6 +46,7 @@ class InstallModule extends Command
|
|||||||
public function handle()
|
public function handle()
|
||||||
{
|
{
|
||||||
$this->moduleName = $name = $this->argument('name');
|
$this->moduleName = $name = $this->argument('name');
|
||||||
|
$this->parentModuleId = $this->argument('parentModuleId');
|
||||||
|
|
||||||
// invalid module name provided
|
// invalid module name provided
|
||||||
if (!is_dir($this->modulesPath . DIRECTORY_SEPARATOR . $name)) {
|
if (!is_dir($this->modulesPath . DIRECTORY_SEPARATOR . $name)) {
|
||||||
@@ -128,15 +130,19 @@ class InstallModule extends Command
|
|||||||
$providers = isset($config['providers']) ? $config['providers'] : [];
|
$providers = isset($config['providers']) ? $config['providers'] : [];
|
||||||
|
|
||||||
// check if module is not installed yet
|
// check if module is not installed yet
|
||||||
$exists = Module::where('handler', $handler)
|
$module = Module::where('name', $name);
|
||||||
->where('name', $config['name'])
|
|
||||||
->exists();
|
|
||||||
|
|
||||||
if (!isset($config['hasSubmodules']) || !$config['hasSubmodules']) {
|
if ($handler) {
|
||||||
if ($exists) {
|
$module = $module->where('handler', $handler);
|
||||||
throw new \Exception('Module ' . $config['name'] . ' already exists in database.');
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
$module = $module->first();
|
||||||
|
|
||||||
|
if ($module && (!isset($config['hasSubmodules']) || !$config['hasSubmodules'])) {
|
||||||
|
throw new \Exception('Module ' . $config['name'] . ' already exists in database.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$module) {
|
||||||
// insert module into database
|
// insert module into database
|
||||||
$settings = [
|
$settings = [
|
||||||
'staticName' => $this->moduleName,
|
'staticName' => $this->moduleName,
|
||||||
@@ -146,12 +152,12 @@ class InstallModule extends Command
|
|||||||
'files' => isset($config['files']) ? $config['files'] : []
|
'files' => isset($config['files']) ? $config['files'] : []
|
||||||
];
|
];
|
||||||
|
|
||||||
$module = Module::install($name, $alias, $description, $handler, $settings);
|
$module = Module::install($name, $alias, $description, $handler, $this->parentModuleId, $settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
// try to install submodules
|
// try to install submodules
|
||||||
if (isset($config['hasSubmodules']) && $config['hasSubmodules']) {
|
if (isset($config['hasSubmodules']) && $config['hasSubmodules']) {
|
||||||
$this->installSubmodules($this->modulesPath . DIRECTORY_SEPARATOR . $this->moduleName);
|
$this->installSubmodules($this->modulesPath . DIRECTORY_SEPARATOR . $this->moduleName, $module);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,15 +165,20 @@ class InstallModule extends Command
|
|||||||
* Crawl all subdirectories in module and try to install submodules
|
* Crawl all subdirectories in module and try to install submodules
|
||||||
*
|
*
|
||||||
* @param $path string path to module base directory
|
* @param $path string path to module base directory
|
||||||
|
* @param $parentModule
|
||||||
*/
|
*/
|
||||||
private function installSubmodules($path)
|
private function installSubmodules($path, Module $parentModule)
|
||||||
{
|
{
|
||||||
$submodules = File::directories($path);
|
$submodules = File::directories($path);
|
||||||
|
|
||||||
foreach ($submodules as $submodulePath) {
|
foreach ($submodules as $submodulePath) {
|
||||||
$submodule = str_replace($this->modulesPath . DIRECTORY_SEPARATOR, '', $submodulePath);
|
$submodule = str_replace($this->modulesPath . DIRECTORY_SEPARATOR, '', $submodulePath);
|
||||||
|
|
||||||
$this->call('install-module', ['name' => $submodule]);
|
try {
|
||||||
|
$this->call('install-module', ['name' => $submodule, 'parentModuleId' => $parentModule->id]);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$this->error($e->getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-1
@@ -13,6 +13,7 @@ class Module extends Model
|
|||||||
public $timestamps = false;
|
public $timestamps = false;
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'handler',
|
'handler',
|
||||||
|
'parent_id',
|
||||||
'name',
|
'name',
|
||||||
'description',
|
'description',
|
||||||
'alias',
|
'alias',
|
||||||
@@ -30,12 +31,13 @@ class Module extends Model
|
|||||||
* @param $alias
|
* @param $alias
|
||||||
* @param string $description
|
* @param string $description
|
||||||
* @param null $handler
|
* @param null $handler
|
||||||
|
* @param $parentModuleId
|
||||||
* @param array $settings
|
* @param array $settings
|
||||||
*
|
*
|
||||||
* @return Module
|
* @return Module
|
||||||
* @throws \ErrorException
|
* @throws \ErrorException
|
||||||
*/
|
*/
|
||||||
public static function install($name, $alias, $description, $handler, $settings)
|
public static function install($name, $alias, $description, $handler, $parentModuleId, $settings)
|
||||||
{
|
{
|
||||||
// check if user does not want to install module in runtime
|
// check if user does not want to install module in runtime
|
||||||
if (!App::runningInConsole()) {
|
if (!App::runningInConsole()) {
|
||||||
@@ -45,6 +47,12 @@ class Module extends Model
|
|||||||
$managesContent = $handler ? in_array('App\Handlers\Contracts\AppHandler', class_implements($handler)) : false;
|
$managesContent = $handler ? in_array('App\Handlers\Contracts\AppHandler', class_implements($handler)) : false;
|
||||||
$supportCategories = $managesContent ? call_user_func([$handler, 'supportCategories']) : false;
|
$supportCategories = $managesContent ? call_user_func([$handler, 'supportCategories']) : false;
|
||||||
|
|
||||||
|
if ($parentModuleId) {
|
||||||
|
$parentModule = Module::findOrFail($parentModuleId);
|
||||||
|
$parentModule->has_submodules = true;
|
||||||
|
$parentModule->save();
|
||||||
|
}
|
||||||
|
|
||||||
// insert module into database
|
// insert module into database
|
||||||
$module = Module::create([
|
$module = Module::create([
|
||||||
'name' => $name,
|
'name' => $name,
|
||||||
@@ -54,6 +62,7 @@ class Module extends Model
|
|||||||
'support_categories' => $supportCategories,
|
'support_categories' => $supportCategories,
|
||||||
'alias' => $alias,
|
'alias' => $alias,
|
||||||
'module_settings' => json_encode($settings),
|
'module_settings' => json_encode($settings),
|
||||||
|
'parent_id' => $parentModuleId,
|
||||||
'enabled' => 1
|
'enabled' => 1
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user