FIX: make artisan install-module really work with submodules

This commit is contained in:
Michal Kváček
2016-08-15 21:39:18 +02:00
parent bd06797c24
commit aa462c2454
2 changed files with 33 additions and 13 deletions
+23 -12
View File
@@ -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
View File
@@ -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
]); ]);