diff --git a/app/Http/Controllers/PluginController.php b/app/Http/Controllers/PluginController.php index 7bf8983a..6dc65708 100644 --- a/app/Http/Controllers/PluginController.php +++ b/app/Http/Controllers/PluginController.php @@ -11,8 +11,14 @@ class PluginController extends Controller public function config(PluginManager $plugins, $name) { $plugin = $plugins->get($name); - if ($plugin && $plugin->isEnabled() && $plugin->hasConfigView()) { - return $plugin->getConfigView(); + if ($plugin && $plugin->isEnabled()) { + if ($plugin->hasConfigClass()) { + return app()->call($plugin->getConfigClass().'@render'); + } elseif ($plugin->hasConfigView()) { + return $plugin->getConfigView(); + } else { + return abort(404, trans('admin.plugins.operations.no-config-notice')); + } } else { return abort(404, trans('admin.plugins.operations.no-config-notice')); } @@ -89,7 +95,7 @@ class PluginController extends Controller 'version' => $plugin->version, 'url' => $plugin->url, 'enabled' => $plugin->isEnabled(), - 'config' => $plugin->hasConfigView(), + 'config' => $plugin->hasConfig(), 'dependencies' => [ 'all' => $plugin->require, 'unsatisfied' => $plugins->getUnsatisfied($plugin), diff --git a/app/Http/View/Composers/SideMenuComposer.php b/app/Http/View/Composers/SideMenuComposer.php index c0d18d23..232c63e7 100644 --- a/app/Http/View/Composers/SideMenuComposer.php +++ b/app/Http/View/Composers/SideMenuComposer.php @@ -75,7 +75,7 @@ class SideMenuComposer $pluginConfigs = resolve(PluginManager::class) ->getEnabledPlugins() ->filter(function ($plugin) { - return $plugin->hasConfigView(); + return $plugin->hasConfig(); }) ->map(function ($plugin) { return [ diff --git a/app/Services/Plugin.php b/app/Services/Plugin.php index 0207b258..cd062dfb 100644 --- a/app/Services/Plugin.php +++ b/app/Services/Plugin.php @@ -58,6 +58,23 @@ class Plugin return "$baseUrl/{$this->name}/assets/$relativeUri?v=".$this->version; } + public function hasConfig(): bool + { + return $this->hasConfigClass() || $this->hasConfigView(); + } + + public function hasConfigClass(): bool + { + return Arr::has($this->manifest, 'enchants.config'); + } + + public function getConfigClass() + { + $name = Arr::get($this->manifest, 'enchants.config'); + + return Str::start($name, $this->manifest['namespace'].'\\'); + } + public function getViewPath(string $filename): string { return $this->path."/views/$filename"; diff --git a/tests/HttpTest/ControllersTest/PluginControllerTest.php b/tests/HttpTest/ControllersTest/PluginControllerTest.php index 48b95a41..dab4bc6b 100644 --- a/tests/HttpTest/ControllersTest/PluginControllerTest.php +++ b/tests/HttpTest/ControllersTest/PluginControllerTest.php @@ -50,15 +50,25 @@ class PluginControllerTest extends TestCase ->with('fake4') ->once() ->andReturn($plugin); + + $plugin = new Plugin(resource_path(''), [ + 'namespace' => 'App\\Services', + 'enchants' => [ + 'config' => 'OptionForm', + ], + ]); + $plugin->setEnabled(true); + $mock->shouldReceive('get') + ->with('fake5') + ->once() + ->andReturn($plugin); }); // No such plugin. - $this->get('/admin/plugins/config/fake1') - ->assertNotFound(); + $this->get('/admin/plugins/config/fake1')->assertNotFound(); // Plugin is disabled - $this->get('/admin/plugins/config/fake2') - ->assertNotFound(); + $this->get('/admin/plugins/config/fake2')->assertNotFound(); // Plugin is enabled but it doesn't have config view $this->get('/admin/plugins/config/fake3') @@ -66,8 +76,14 @@ class PluginControllerTest extends TestCase ->assertNotFound(); // Plugin has config view - $this->get('/admin/plugins/config/fake4') - ->assertSuccessful(); + $this->get('/admin/plugins/config/fake4')->assertSuccessful(); + + // Plugin has config class + app()->instance( + \App\Services\OptionForm::class, + new \App\Services\OptionForm('t') + ); + $this->get('/admin/plugins/config/fake5')->assertSee('card'); option(['plugins_enabled' => '[]']); }