FIX: make artisan install-module really work with submodules
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+10
-1
@@ -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
|
||||
]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user