FEATURE: use module_settings field instaed of config().
This way should be more reliable, because config() is available only after publishing module, however I can't publish module when it does not have config (module.json). In this way I can select all modules from database and generate module.json for each of them.
This commit is contained in:
@@ -87,4 +87,11 @@ interface AppHandler
|
|||||||
* @param User $user model of logged user
|
* @param User $user model of logged user
|
||||||
*/
|
*/
|
||||||
public static function registerAdminMenu(User $user);
|
public static function registerAdminMenu(User $user);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Install module
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public static function install();
|
||||||
}
|
}
|
||||||
+30
-30
@@ -65,16 +65,6 @@ abstract class Handler implements AppHandler
|
|||||||
|
|
||||||
// create instance of main menu
|
// create instance of main menu
|
||||||
\Menu::create('mainMenu', function ($menu) {
|
\Menu::create('mainMenu', function ($menu) {
|
||||||
/**
|
|
||||||
* @var $menu \Pingpong\Menus\MenuBuilder
|
|
||||||
*/
|
|
||||||
|
|
||||||
// create menu entries
|
|
||||||
|
|
||||||
/*
|
|
||||||
* WARNING: MenuBuilder::route() does not seem to work,
|
|
||||||
* nor route() helper function. We need to use action() helper instaed.
|
|
||||||
*/
|
|
||||||
$menu->route('admin.dashboard', trans('admin/mainMenu.dashboard'), [], 10, ['icon' => 'fa fa-dashboard']);
|
$menu->route('admin.dashboard', trans('admin/mainMenu.dashboard'), [], 10, ['icon' => 'fa fa-dashboard']);
|
||||||
$menu->dropdown(trans('admin/mainMenu.userManagement'), function ($sub) {
|
$menu->dropdown(trans('admin/mainMenu.userManagement'), function ($sub) {
|
||||||
$sub->route('users.new', trans('admin/mainMenu.newUser'), [], 10, ['icon' => 'fa fa-user-plus']);
|
$sub->route('users.new', trans('admin/mainMenu.newUser'), [], 10, ['icon' => 'fa fa-user-plus']);
|
||||||
@@ -82,26 +72,32 @@ abstract class Handler implements AppHandler
|
|||||||
$sub->route('users.overview', trans('admin/mainMenu.usersOverview'), [], 30, ['icon' => 'fa fa-users']);
|
$sub->route('users.overview', trans('admin/mainMenu.usersOverview'), [], 30, ['icon' => 'fa fa-users']);
|
||||||
}, 20, ['icon' => 'fa fa-users']);
|
}, 20, ['icon' => 'fa fa-users']);
|
||||||
$menu->dropdown(trans('admin/mainMenu.contentPages'), function ($sub) {
|
$menu->dropdown(trans('admin/mainMenu.contentPages'), function ($sub) {
|
||||||
|
$modules = ModuleNamesWithIds::getWithTranslations();
|
||||||
|
|
||||||
$sub->dropdown(trans('admin/mainMenu.newContentPage'), function ($sub) {
|
if (!empty($modules)) {
|
||||||
$i = 1;
|
$sub->dropdown(trans('admin/mainMenu.newContentPage'), function ($sub) use ($modules) {
|
||||||
$modules = ModuleNamesWithIds::getWithTranslations();
|
$i = 1;
|
||||||
foreach ($modules as $module => $name) {
|
foreach ($modules as $module => $name) {
|
||||||
$sub->route('content.new', trans($name), ['moduleId' => $module], $i++);
|
$sub->route('content.new', trans($name), ['moduleId' => $module], $i++);
|
||||||
}
|
}
|
||||||
}, 10, ['icon' => 'fa fa-plus']);
|
}, 10, ['icon' => 'fa fa-plus']);
|
||||||
|
}
|
||||||
|
|
||||||
$sub->route('content.overview', trans('admin/mainMenu.contentPageOverview'), [], 20, ['icon' => 'fa fa-list']);
|
$sub->route('content.overview', trans('admin/mainMenu.contentPageOverview'), [], 20, ['icon' => 'fa fa-list']);
|
||||||
}, 15, ['icon' => 'fa fa-database']);
|
}, 15, ['icon' => 'fa fa-database']);
|
||||||
$menu->route('upload.overview', trans('admin/mainMenu.fileManager'), [], 30, ['icon' => 'fa fa-folder']);
|
$menu->route('upload.overview', trans('admin/mainMenu.fileManager'), [], 30, ['icon' => 'fa fa-folder']);
|
||||||
$menu->dropdown(trans('admin/mainMenu.widgets'), function ($sub) {
|
$menu->dropdown(trans('admin/mainMenu.widgets'), function ($sub) {
|
||||||
// create list of all widget types
|
// create list of all widget types
|
||||||
$sub->dropdown(trans('admin/mainMenu.newWidget'), function ($sub) {
|
$widgets = WidgetTypes::getWithTranslations();
|
||||||
$i = 1;
|
|
||||||
foreach (WidgetTypes::getWithTranslations() as $type => $name) {
|
if (!empty($widgets)) {
|
||||||
$sub->route('widgets.new', $name, ['type' => $type], $i++);
|
$sub->dropdown(trans('admin/mainMenu.newWidget'), function ($sub) use ($widgets) {
|
||||||
}
|
$i = 1;
|
||||||
}, 10, ['icon' => 'fa fa-plus']);
|
foreach ($widgets as $type => $name) {
|
||||||
|
$sub->route('widgets.new', $name, ['type' => $type], $i++);
|
||||||
|
}
|
||||||
|
}, 10, ['icon' => 'fa fa-plus']);
|
||||||
|
}
|
||||||
|
|
||||||
$sub->route('widgets.overview', trans('admin/mainMenu.widgetsOverview'), [], 20, ['icon' => 'fa fa-list']);
|
$sub->route('widgets.overview', trans('admin/mainMenu.widgetsOverview'), [], 20, ['icon' => 'fa fa-list']);
|
||||||
|
|
||||||
@@ -111,13 +107,17 @@ abstract class Handler implements AppHandler
|
|||||||
$sub->route('widgetareas.overview', trans('admin/mainMenu.widgetAreaOverview'), [], 2, ['icon' => 'fa fa-list']);
|
$sub->route('widgetareas.overview', trans('admin/mainMenu.widgetAreaOverview'), [], 2, ['icon' => 'fa fa-list']);
|
||||||
}, 50, ['icon' => 'fa fa-object-group']);
|
}, 50, ['icon' => 'fa fa-object-group']);
|
||||||
}, 28, ['icon' => 'fa fa-gears']);
|
}, 28, ['icon' => 'fa fa-gears']);
|
||||||
$menu->dropdown(trans('admin/mainMenu.templates'), function ($sub) {
|
|
||||||
$i = 1;
|
$templatePaths = TemplatePathsHumanReadableRootOnly::getWithTranslations();
|
||||||
$templatePaths = TemplatePathsHumanReadableRootOnly::getWithTranslations();
|
|
||||||
foreach ($templatePaths as $id => $name) {
|
if (!empty($templatePaths)) {
|
||||||
$sub->route('templates.overview', $name, ['id' => $id], $i++);
|
$menu->dropdown(trans('admin/mainMenu.templates'), function ($sub) use ($templatePaths) {
|
||||||
}
|
$i = 1;
|
||||||
}, 29, ['icon' => 'fa fa-folder-open']);
|
foreach ($templatePaths as $id => $name) {
|
||||||
|
$sub->route('templates.overview', $name, ['id' => $id], $i++);
|
||||||
|
}
|
||||||
|
}, 29, ['icon' => 'fa fa-folder-open']);
|
||||||
|
}
|
||||||
$menu->dropdown(trans('admin/mainMenu.customFields'), function ($sub) {
|
$menu->dropdown(trans('admin/mainMenu.customFields'), function ($sub) {
|
||||||
$sub->route('customfields.new', trans('admin/mainMenu.customFieldsNew'), [], 10, ['icon' => 'fa fa-code']);
|
$sub->route('customfields.new', trans('admin/mainMenu.customFieldsNew'), [], 10, ['icon' => 'fa fa-code']);
|
||||||
$sub->route('customfields.overview', trans('admin/mainMenu.customFieldsOverview'), [], 50, ['icon' => 'fa fa-code-fork']);
|
$sub->route('customfields.overview', trans('admin/mainMenu.customFieldsOverview'), [], 50, ['icon' => 'fa fa-code-fork']);
|
||||||
|
|||||||
+38
-5
@@ -3,23 +3,56 @@
|
|||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Support\Facades\App;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Module
|
* Class Module
|
||||||
*/
|
*/
|
||||||
class Module extends Model
|
class Module extends Model
|
||||||
{
|
{
|
||||||
|
|
||||||
public $timestamps = false;
|
public $timestamps = false;
|
||||||
|
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'handler',
|
'handler',
|
||||||
'name',
|
'name',
|
||||||
'description',
|
'description',
|
||||||
'alias'
|
'alias',
|
||||||
|
'module_settings',
|
||||||
|
'enabled'
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $guarded = [];
|
protected $guarded = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create new module in database
|
||||||
|
*
|
||||||
|
* @param $name
|
||||||
|
* @param $alias
|
||||||
|
* @param string $description
|
||||||
|
* @param null $handler
|
||||||
|
* @param array $settings
|
||||||
|
*
|
||||||
|
* @return Module
|
||||||
|
* @throws \ErrorException
|
||||||
|
*/
|
||||||
|
public static function install($name, $alias, $description, $handler, $settings)
|
||||||
|
{
|
||||||
|
// check if user does not want to install module in runtime
|
||||||
|
if (!App::runningInConsole()) {
|
||||||
|
throw new \ErrorException('Modules can be installed only via Artisan!');
|
||||||
|
}
|
||||||
|
|
||||||
|
// insert module into database
|
||||||
|
$module = Module::create([
|
||||||
|
'name' => $name,
|
||||||
|
'description' => $description,
|
||||||
|
'handler' => $handler,
|
||||||
|
'alias' => $alias,
|
||||||
|
'module_settings' => json_encode($settings),
|
||||||
|
'enabled' => 1
|
||||||
|
]);
|
||||||
|
|
||||||
|
// install something module-specific
|
||||||
|
call_user_func([$handler, 'install']);
|
||||||
|
|
||||||
|
return $module;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -43,16 +43,31 @@ class ModuleManager extends ServiceProvider
|
|||||||
*/
|
*/
|
||||||
private function createModulesJson(Module $module)
|
private function createModulesJson(Module $module)
|
||||||
{
|
{
|
||||||
$data = config($module->alias);
|
$config = json_decode($module->module_settings);
|
||||||
$data['active'] = $module->enabled;
|
|
||||||
|
if (is_null($config)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// path to module.json
|
// path to module.json
|
||||||
$path = config('modules.paths.modules') . DIRECTORY_SEPARATOR . $data['name'] . DIRECTORY_SEPARATOR . 'module.json';
|
$path = config('modules.paths.modules') . DIRECTORY_SEPARATOR . $config->staticName . DIRECTORY_SEPARATOR . 'module.json';
|
||||||
|
|
||||||
|
// check if module config is writable
|
||||||
if (!is_writable($path)) {
|
if (!is_writable($path)) {
|
||||||
throw new \ErrorException('Cannot write to ' . $path . '. Module ' . $data['name'] . ' cannot be enabled.');
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set enabled/disabled status for this module
|
||||||
|
$data = new \stdClass();
|
||||||
|
$data->name = $config->staticName;
|
||||||
|
$data->description = $module->description;
|
||||||
|
$data->alias = $module->alias;
|
||||||
|
$data->providers = $config->providers;
|
||||||
|
$data->aliases = $config->aliases;
|
||||||
|
$data->order = $config->order;
|
||||||
|
$data->files = $config->files;
|
||||||
|
$data->active = $module->enabled;
|
||||||
|
|
||||||
// create file
|
// create file
|
||||||
file_put_contents($path, json_encode($data));
|
file_put_contents($path, json_encode($data));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user