diff --git a/app/Models/Module.php b/app/Models/Module.php index 0ba1491d..36fd14eb 100644 --- a/app/Models/Module.php +++ b/app/Models/Module.php @@ -15,7 +15,8 @@ class Module extends Model protected $fillable = [ 'handler', 'name', - 'description' + 'description', + 'alias' ]; protected $guarded = []; diff --git a/app/Providers/ModuleManager.php b/app/Providers/ModuleManager.php new file mode 100644 index 00000000..ee10cce5 --- /dev/null +++ b/app/Providers/ModuleManager.php @@ -0,0 +1,59 @@ +createModulesJson($module); + } + } + + /** + * Register the application services. + * + * @return void + */ + public function register() + { + } + + /** + * Read config file and merge it with module config in database. + * + * This method REQUIRES published config of given module (otherwise config(modulename) is not available)! + * + * @param Module $module + * + * @throws \ErrorException when module.json is not writable + */ + private function createModulesJson(Module $module) + { + $data = config($module->alias); + $data['active'] = $module->enabled; + + // path to module.json + $path = config('modules.paths.modules') . DIRECTORY_SEPARATOR . $data['name'] . DIRECTORY_SEPARATOR . 'module.json'; + + if (!is_writable($path)) { + throw new \ErrorException('Cannot write to ' . $path . '. Module ' . $data['name'] . ' cannot be enabled.'); + } + + // create file + file_put_contents($path, json_encode($data)); + } +} diff --git a/config/app.php b/config/app.php index 8b9aa62c..ef36a69f 100644 --- a/config/app.php +++ b/config/app.php @@ -97,8 +97,7 @@ return [ */ 'upload_url' => env('UPLOAD_URL', PHP_SAPI === 'cli' ? '' : url('uploads')), 'thumbnail_url' => env('THUMBNAIL_URL', PHP_SAPI === 'cli' ? '' : url('uploads/thumbnails')), - - 'theme' => 'default_theme', + 'theme' => 'default_theme', /* |-------------------------------------------------------------------------- | Logging Configuration @@ -150,6 +149,8 @@ return [ Illuminate\Translation\TranslationServiceProvider::class, Illuminate\Validation\ValidationServiceProvider::class, Illuminate\View\ViewServiceProvider::class, + // this class must be before ModulesServiceProvider from PingPong, because it handles files module.json + App\Providers\ModuleManager::class, Pingpong\Modules\ModulesServiceProvider::class, Pingpong\Menus\MenusServiceProvider::class, /*