diff --git a/app/Console/Commands/InstallModule.php b/app/Console/Commands/InstallModule.php index 477ffb3c..2a9a0c7c 100644 --- a/app/Console/Commands/InstallModule.php +++ b/app/Console/Commands/InstallModule.php @@ -16,7 +16,7 @@ class InstallModule extends Command * * @var string */ - protected $signature = 'install-module {name}'; + protected $signature = 'install-module {name} {parentModuleId?}'; /** * 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 $moduleName; + protected $parentModuleId; protected $modulesPath; /** @@ -45,6 +46,7 @@ class InstallModule extends Command public function handle() { $this->moduleName = $name = $this->argument('name'); + $this->parentModuleId = $this->argument('parentModuleId'); // invalid module name provided if (!is_dir($this->modulesPath . DIRECTORY_SEPARATOR . $name)) { @@ -128,15 +130,19 @@ class InstallModule extends Command $providers = isset($config['providers']) ? $config['providers'] : []; // check if module is not installed yet - $exists = Module::where('handler', $handler) - ->where('name', $config['name']) - ->exists(); + $module = Module::where('name', $name); - if (!isset($config['hasSubmodules']) || !$config['hasSubmodules']) { - if ($exists) { - throw new \Exception('Module ' . $config['name'] . ' already exists in database.'); - } + if ($handler) { + $module = $module->where('handler', $handler); + } + $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 $settings = [ 'staticName' => $this->moduleName, @@ -146,12 +152,12 @@ class InstallModule extends Command '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 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 * * @param $path string path to module base directory + * @param $parentModule */ - private function installSubmodules($path) + private function installSubmodules($path, Module $parentModule) { $submodules = File::directories($path); foreach ($submodules as $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()); + } } } } diff --git a/app/Models/Module.php b/app/Models/Module.php index 0a8300a8..d782c2d9 100644 --- a/app/Models/Module.php +++ b/app/Models/Module.php @@ -13,6 +13,7 @@ class Module extends Model public $timestamps = false; protected $fillable = [ 'handler', + 'parent_id', 'name', 'description', 'alias', @@ -30,12 +31,13 @@ class Module extends Model * @param $alias * @param string $description * @param null $handler + * @param $parentModuleId * @param array $settings * * @return Module * @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 if (!App::runningInConsole()) { @@ -45,6 +47,12 @@ class Module extends Model $managesContent = $handler ? in_array('App\Handlers\Contracts\AppHandler', class_implements($handler)) : 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 $module = Module::create([ 'name' => $name, @@ -54,6 +62,7 @@ class Module extends Model 'support_categories' => $supportCategories, 'alias' => $alias, 'module_settings' => json_encode($settings), + 'parent_id' => $parentModuleId, 'enabled' => 1 ]);