Loading app/Config/Autoload.php +1 −1 Original line number Diff line number Diff line Loading @@ -109,7 +109,7 @@ class Autoload extends AutoloadConfig * * @var list<string> */ public $helpers = ['auth', 'setting', 'icons']; public $helpers = ['auth', 'setting', 'icons', 'plugins']; public function __construct() { Loading modules/Admin/Language/en/EpisodeNavigation.php +1 −0 Original line number Diff line number Diff line Loading @@ -20,4 +20,5 @@ return [ 'video-clips-create' => 'New video clip', 'soundbites-list' => 'Soundbites', 'soundbites-create' => 'New soundbite', 'plugins' => 'Plugins', ]; modules/Admin/Language/en/PodcastNavigation.php +1 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ return [ 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', 'plugins' => 'Plugins', 'analytics' => 'Analytics', 'podcast-analytics' => 'Audience overview', 'podcast-analytics-webpages' => 'Web pages visits', Loading modules/Plugins/BasePlugin.php +15 −15 Original line number Diff line number Diff line Loading @@ -22,7 +22,7 @@ use RuntimeException; * @property string[] $keywords * @property string[] $hooks * @property string $iconSrc * @property array{settings:array{key:string,name:string,description:string}[],podcast:array{key:string,name:string,description:string}[],episode:array{key:string,name:string,description:string}[]} $options * @property array{general:array{key:string,name:string,description:string}[],podcast:array{key:string,name:string,description:string}[],episode:array{key:string,name:string,description:string}[]} $settings */ abstract class BasePlugin implements PluginInterface { Loading Loading @@ -147,24 +147,24 @@ abstract class BasePlugin implements PluginInterface $validation = service('validation'); if (array_key_exists('options', $manifest)) { $optionRules = [ if (array_key_exists('settings', $manifest)) { $fieldRules = [ 'key' => 'required|alpha_numeric', 'name' => 'required|max_length[32]', 'description' => 'permit_empty|max_length[128]', ]; $defaultOption = [ $defaultField = [ 'key' => '', 'name' => '', 'description' => '', ]; $validation->setRules($optionRules); foreach ($manifest['options'] as $key => $options) { foreach ($options as $key2 => $option) { $manifest['options'][$key][$key2] = array_merge($defaultOption, $option); $validation->setRules($fieldRules); foreach ($manifest['settings'] as $key => $settings) { foreach ($settings as $key2 => $fields) { $manifest['settings'][$key][$key2] = array_merge($defaultField, $fields); if (! $validation->run($manifest['options'][$key][$key2])) { dd($this->key, $manifest['options'][$key][$key2], $validation->getErrors()); if (! $validation->run($manifest['settings'][$key][$key2])) { dd($this->key, $manifest['settings'][$key][$key2], $validation->getErrors()); } } } Loading @@ -183,7 +183,7 @@ abstract class BasePlugin implements PluginInterface 'website' => 'valid_url_strict', 'keywords.*' => 'permit_empty|in_list[seo,podcasting20,analytics]', 'hooks.*' => 'permit_empty|in_list[' . implode(',', Plugins::HOOKS) . ']', 'options' => 'permit_empty', 'settings' => 'permit_empty', ]; $validation->setRules($rules); Loading @@ -200,8 +200,8 @@ abstract class BasePlugin implements PluginInterface 'website' => '', 'hooks' => [], 'keywords' => [], 'options' => [ 'settings' => [], 'settings' => [ 'general' => [], 'podcast' => [], 'episode' => [], ], Loading modules/Plugins/Config/Routes.php +27 −7 Original line number Diff line number Diff line Loading @@ -13,26 +13,46 @@ $routes->group( ], static function ($routes): void { $routes->group('plugins', static function ($routes): void { $routes->get('/', 'PluginsController::installed', [ $routes->get('/', 'PluginController::installed', [ 'as' => 'plugins-installed', 'filter' => 'permission:plugins.manage', ]); $routes->get('(:segment)', 'PluginsController::settings/$1', [ 'as' => 'plugins-settings', $routes->get('(:segment)', 'PluginController::generalSettings/$1', [ 'as' => 'plugins-general-settings', 'filter' => 'permission:plugins.manage', ]); $routes->post('(:segment)', 'PluginsController::settingsAction/$1', [ 'as' => 'plugins-settings-action', $routes->post('(:segment)', 'PluginController::generalSettingsAction/$1', [ 'as' => 'plugins-general-settings-action', 'filter' => 'permission:plugins.manage', ]); $routes->post('activate/(:segment)', 'PluginsController::activate/$1', [ $routes->post('activate/(:segment)', 'PluginController::activate/$1', [ 'as' => 'plugins-activate', 'filter' => 'permission:plugins.manage', ]); $routes->post('deactivate/(:segment)', 'PluginsController::deactivate/$1', [ $routes->post('deactivate/(:segment)', 'PluginController::deactivate/$1', [ 'as' => 'plugins-deactivate', 'filter' => 'permission:plugins.manage', ]); }); $routes->group('podcasts/(:num)/plugins', static function ($routes): void { $routes->get('(:segment)', 'PluginController::podcastSettings/$1/$2', [ 'as' => 'plugins-podcast-settings', 'filter' => 'permission:podcast#.edit', ]); $routes->post('(:segment)', 'PluginController::podcastSettingsAction/$1/$2', [ 'as' => 'plugins-podcast-settings-action', 'filter' => 'permission:podcast#.edit', ]); }); $routes->group('podcasts/(:num)/episodes/(:num)/plugins', static function ($routes): void { $routes->get('(:segment)', 'PluginController::episodeSettings/$1/$2/$3', [ 'as' => 'plugins-episode-settings', 'filter' => 'permission:podcast#.edit', ]); $routes->post('(:segment)', 'PluginController::episodeSettingsAction/$1/$2/$3', [ 'as' => 'plugins-episode-settings-action', 'filter' => 'permission:podcast#.edit', ]); }); } ); Loading
app/Config/Autoload.php +1 −1 Original line number Diff line number Diff line Loading @@ -109,7 +109,7 @@ class Autoload extends AutoloadConfig * * @var list<string> */ public $helpers = ['auth', 'setting', 'icons']; public $helpers = ['auth', 'setting', 'icons', 'plugins']; public function __construct() { Loading
modules/Admin/Language/en/EpisodeNavigation.php +1 −0 Original line number Diff line number Diff line Loading @@ -20,4 +20,5 @@ return [ 'video-clips-create' => 'New video clip', 'soundbites-list' => 'Soundbites', 'soundbites-create' => 'New soundbite', 'plugins' => 'Plugins', ];
modules/Admin/Language/en/PodcastNavigation.php +1 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ return [ 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', 'plugins' => 'Plugins', 'analytics' => 'Analytics', 'podcast-analytics' => 'Audience overview', 'podcast-analytics-webpages' => 'Web pages visits', Loading
modules/Plugins/BasePlugin.php +15 −15 Original line number Diff line number Diff line Loading @@ -22,7 +22,7 @@ use RuntimeException; * @property string[] $keywords * @property string[] $hooks * @property string $iconSrc * @property array{settings:array{key:string,name:string,description:string}[],podcast:array{key:string,name:string,description:string}[],episode:array{key:string,name:string,description:string}[]} $options * @property array{general:array{key:string,name:string,description:string}[],podcast:array{key:string,name:string,description:string}[],episode:array{key:string,name:string,description:string}[]} $settings */ abstract class BasePlugin implements PluginInterface { Loading Loading @@ -147,24 +147,24 @@ abstract class BasePlugin implements PluginInterface $validation = service('validation'); if (array_key_exists('options', $manifest)) { $optionRules = [ if (array_key_exists('settings', $manifest)) { $fieldRules = [ 'key' => 'required|alpha_numeric', 'name' => 'required|max_length[32]', 'description' => 'permit_empty|max_length[128]', ]; $defaultOption = [ $defaultField = [ 'key' => '', 'name' => '', 'description' => '', ]; $validation->setRules($optionRules); foreach ($manifest['options'] as $key => $options) { foreach ($options as $key2 => $option) { $manifest['options'][$key][$key2] = array_merge($defaultOption, $option); $validation->setRules($fieldRules); foreach ($manifest['settings'] as $key => $settings) { foreach ($settings as $key2 => $fields) { $manifest['settings'][$key][$key2] = array_merge($defaultField, $fields); if (! $validation->run($manifest['options'][$key][$key2])) { dd($this->key, $manifest['options'][$key][$key2], $validation->getErrors()); if (! $validation->run($manifest['settings'][$key][$key2])) { dd($this->key, $manifest['settings'][$key][$key2], $validation->getErrors()); } } } Loading @@ -183,7 +183,7 @@ abstract class BasePlugin implements PluginInterface 'website' => 'valid_url_strict', 'keywords.*' => 'permit_empty|in_list[seo,podcasting20,analytics]', 'hooks.*' => 'permit_empty|in_list[' . implode(',', Plugins::HOOKS) . ']', 'options' => 'permit_empty', 'settings' => 'permit_empty', ]; $validation->setRules($rules); Loading @@ -200,8 +200,8 @@ abstract class BasePlugin implements PluginInterface 'website' => '', 'hooks' => [], 'keywords' => [], 'options' => [ 'settings' => [], 'settings' => [ 'general' => [], 'podcast' => [], 'episode' => [], ], Loading
modules/Plugins/Config/Routes.php +27 −7 Original line number Diff line number Diff line Loading @@ -13,26 +13,46 @@ $routes->group( ], static function ($routes): void { $routes->group('plugins', static function ($routes): void { $routes->get('/', 'PluginsController::installed', [ $routes->get('/', 'PluginController::installed', [ 'as' => 'plugins-installed', 'filter' => 'permission:plugins.manage', ]); $routes->get('(:segment)', 'PluginsController::settings/$1', [ 'as' => 'plugins-settings', $routes->get('(:segment)', 'PluginController::generalSettings/$1', [ 'as' => 'plugins-general-settings', 'filter' => 'permission:plugins.manage', ]); $routes->post('(:segment)', 'PluginsController::settingsAction/$1', [ 'as' => 'plugins-settings-action', $routes->post('(:segment)', 'PluginController::generalSettingsAction/$1', [ 'as' => 'plugins-general-settings-action', 'filter' => 'permission:plugins.manage', ]); $routes->post('activate/(:segment)', 'PluginsController::activate/$1', [ $routes->post('activate/(:segment)', 'PluginController::activate/$1', [ 'as' => 'plugins-activate', 'filter' => 'permission:plugins.manage', ]); $routes->post('deactivate/(:segment)', 'PluginsController::deactivate/$1', [ $routes->post('deactivate/(:segment)', 'PluginController::deactivate/$1', [ 'as' => 'plugins-deactivate', 'filter' => 'permission:plugins.manage', ]); }); $routes->group('podcasts/(:num)/plugins', static function ($routes): void { $routes->get('(:segment)', 'PluginController::podcastSettings/$1/$2', [ 'as' => 'plugins-podcast-settings', 'filter' => 'permission:podcast#.edit', ]); $routes->post('(:segment)', 'PluginController::podcastSettingsAction/$1/$2', [ 'as' => 'plugins-podcast-settings-action', 'filter' => 'permission:podcast#.edit', ]); }); $routes->group('podcasts/(:num)/episodes/(:num)/plugins', static function ($routes): void { $routes->get('(:segment)', 'PluginController::episodeSettings/$1/$2/$3', [ 'as' => 'plugins-episode-settings', 'filter' => 'permission:podcast#.edit', ]); $routes->post('(:segment)', 'PluginController::episodeSettingsAction/$1/$2/$3', [ 'as' => 'plugins-episode-settings-action', 'filter' => 'permission:podcast#.edit', ]); }); } );