From be29b8ff8fcbfbe481934ea871235f1bc47b6a25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jannis=20Mo=C3=9Fhammer?= Date: Mon, 12 Aug 2013 15:58:26 +0200 Subject: [PATCH] Make ConfigController and PreferenceController extensible by convention - Rename ConfigurationController to ConfigController - ConfigController and PreferenceController are now subclasses of BaseConfigController and BasePreferenceController - Module and Application Config/Preference Tabs are detected via the ControllerTabCollector - Moved Controller classes to Icinga/Web/Controller (this is why so many files are modified) refs #4530 --- .../controllers/AuthenticationController.php | 2 +- application/controllers/ConfigController.php | 104 +++++++++++++++ .../controllers/DashboardController.php | 2 +- application/controllers/ErrorController.php | 2 +- application/controllers/IndexController.php | 3 +- application/controllers/ModulesController.php | 107 --------------- .../controllers/PreferenceController.php | 67 ++++++++++ application/controllers/StaticController.php | 2 +- .../layouts/scripts/parts/topbar.phtml | 2 +- application/views/scripts/config/index.phtml | 12 ++ .../{modules => config/module}/overview.phtml | 23 ++-- .../{modules => config/module}/show.phtml | 0 .../views/scripts/configuration/index.phtml | 12 -- .../views/scripts/preference/index.phtml | 3 + config/menu.ini | 2 +- doc/module/configuration_and_preferences.md | 57 ++++++++ .../Icinga/Application/Modules/Manager.php | 69 ++++++++-- library/Icinga/Application/Modules/Module.php | 6 + .../Web/{ => Controller}/ActionController.php | 21 ++- .../Web/Controller/BaseConfigController.php | 65 +++++++++ .../Controller/BasePreferenceController.php | 62 +++++++++ .../Web/Controller/ControllerTabCollector.php | 125 ++++++++++++++++++ .../ModuleActionController.php | 2 +- .../controllers/CommandController.php | 2 +- .../controllers/ConfigController.php | 55 ++++---- .../controllers/ListController.php | 2 +- .../controllers/ShowController.php | 2 +- .../controllers/SoapController.php | 2 +- .../controllers/SummaryController.php | 2 +- .../php/testlib/MonitoringControllerTest.php | 4 +- public/js/icinga/components/mainDetail.js | 4 +- .../controllers/IndexControllerTest.php | 2 +- .../Icinga/Web/ActionControllerTest.php | 2 +- 33 files changed, 624 insertions(+), 203 deletions(-) create mode 100644 application/controllers/ConfigController.php delete mode 100644 application/controllers/ModulesController.php create mode 100644 application/controllers/PreferenceController.php create mode 100644 application/views/scripts/config/index.phtml rename application/views/scripts/{modules => config/module}/overview.phtml (51%) rename application/views/scripts/{modules => config/module}/show.phtml (100%) delete mode 100644 application/views/scripts/configuration/index.phtml create mode 100644 application/views/scripts/preference/index.phtml create mode 100644 doc/module/configuration_and_preferences.md rename library/Icinga/Web/{ => Controller}/ActionController.php (96%) create mode 100644 library/Icinga/Web/Controller/BaseConfigController.php create mode 100644 library/Icinga/Web/Controller/BasePreferenceController.php create mode 100644 library/Icinga/Web/Controller/ControllerTabCollector.php rename library/Icinga/Web/{ => Controller}/ModuleActionController.php (98%) rename application/controllers/ConfigurationController.php => modules/monitoring/application/controllers/ConfigController.php (54%) diff --git a/application/controllers/AuthenticationController.php b/application/controllers/AuthenticationController.php index d500f23e6..ad8603273 100644 --- a/application/controllers/AuthenticationController.php +++ b/application/controllers/AuthenticationController.php @@ -26,7 +26,7 @@ # namespace Icinga\Application\Controllers; -use Icinga\Web\ActionController; +use Icinga\Web\Controller\ActionController; use Icinga\Authentication\Credentials; use Icinga\Authentication\Manager as AuthManager; use Icinga\Form\Authentication\LoginForm; diff --git a/application/controllers/ConfigController.php b/application/controllers/ConfigController.php new file mode 100644 index 000000000..fcee6bf27 --- /dev/null +++ b/application/controllers/ConfigController.php @@ -0,0 +1,104 @@ + + * @author Icinga Development Team + */ +// {{{ICINGA_LICENSE_HEADER}}} + +use Icinga\Application\Benchmark; +use Icinga\Authentication\Manager; +use Icinga\Web\Controller\BaseConfigController; +use Icinga\Web\Widget\Tab; +use Icinga\Web\Url; +use Icinga\Web\Hook\Configuration\ConfigurationTabBuilder; +use Icinga\Application\Icinga; + + +/** + * Class ConfigController + */ +class ConfigController extends BaseConfigController +{ + public static function createProvidedTabs() + { + return array( + "index" => new Tab( + array( + "name" => "index", + "title" => "Configuration", + "iconCls" => "wrench", + "url" => Url::fromPath("/config") + ) + ), + "modules" => new Tab( + array( + "name" => "modules", + "title" => "Modules", + "iconCls" => "puzzle-piece", + "url" => Url::fromPath("/config/moduleoverview") + ) + ) + ); + + } + + /** + * Index action + */ + public function indexAction() + { + + } + + public function moduleoverviewAction() + { + $this->view->modules = Icinga::app()->getModuleManager()->select() + ->from('modules') + ->order('name'); + $this->render('module/overview'); + } + + /** + * Enable a module + */ + public function moduleenableAction() + { + $manager = Icinga::app()->getModuleManager(); + $manager->enableModule($this->_getParam('name')); + $manager->loadModule($this->_getParam('name')); + + $this->redirectNow('config/moduleoverview?_render=body'); + } + + /** + * Disable a module + */ + public function moduledisableAction() + { + $manager = Icinga::app()->getModuleManager(); + $manager->disableModule($this->_getParam('name')); + $this->redirectNow('config/moduleoverview?_render=body'); + } +} + +// @codingStandardsIgnoreEnd diff --git a/application/controllers/DashboardController.php b/application/controllers/DashboardController.php index 864eb1281..65a132890 100644 --- a/application/controllers/DashboardController.php +++ b/application/controllers/DashboardController.php @@ -27,7 +27,7 @@ */ // {{{ICINGA_LICENSE_HEADER}}} -use Icinga\Web\ActionController; +use Icinga\Web\Controller\ActionController; use Icinga\Web\Url; use Icinga\Application\Icinga; use Icinga\Web\Widget\Dashboard; diff --git a/application/controllers/ErrorController.php b/application/controllers/ErrorController.php index 42756de86..8fdfd99b8 100755 --- a/application/controllers/ErrorController.php +++ b/application/controllers/ErrorController.php @@ -26,7 +26,7 @@ # namespace Icinga\Application\Controllers; -use Icinga\Web\ActionController; +use Icinga\Web\Controller\ActionController; /** * Class ErrorController diff --git a/application/controllers/IndexController.php b/application/controllers/IndexController.php index 7b3e68ad5..9863efd09 100644 --- a/application/controllers/IndexController.php +++ b/application/controllers/IndexController.php @@ -29,7 +29,7 @@ # namespace Icinga\Application\Controllers; -use Icinga\Web\ActionController; +use Icinga\Web\Controller\ActionController; use Icinga\Application\Icinga; /** @@ -38,6 +38,7 @@ use Icinga\Application\Icinga; */ class IndexController extends ActionController { + /** * @var bool */ diff --git a/application/controllers/ModulesController.php b/application/controllers/ModulesController.php deleted file mode 100644 index fc5fdfdaf..000000000 --- a/application/controllers/ModulesController.php +++ /dev/null @@ -1,107 +0,0 @@ - - * @license http://www.gnu.org/licenses/gpl-2.0.txt GPL, version 2 - * @author Icinga Development Team - */ -// {{{ICINGA_LICENSE_HEADER}}} - - -# namespace Icinga\Application\Controllers; - -use Icinga\Web\ActionController; -use Icinga\Application\Icinga; -use Icinga\Web\Hook\Configuration\ConfigurationTabBuilder; -use Icinga\Web\Widget\Tabs; - -/** - * Handle module depending frontend actions - */ -class ModulesController extends ActionController -{ - /** - * @var ModuleManager - */ - protected $manager; - - /** - * Setup this controller - * @see ZfActionController::init - */ - public function init() - { - $this->manager = Icinga::app()->getModuleManager(); - } - - /** - * Display a list of all modules - */ - public function indexAction() - { - $tabBuilder = new ConfigurationTabBuilder(new Tabs()); - - $tabBuilder->build(); - - $this->view->tabs = $tabBuilder->getTabs(); - - $this->view->modules = $this->manager->select() - ->from('modules') - ->order('name'); - $this->render('overview'); - } - - /** - * Alias for index - * - * @see self::indexAction - */ - public function overviewAction() - { - $this->indexAction(); - - } - - /** - * Enable a module - */ - public function enableAction() - { - $this->manager->enableModule($this->_getParam('name')); - $this->manager->loadModule($this->_getParam('name')); - $this->getResponse()->setHeader('X-Icinga-Enable-Module', $this->_getParam('name')); - $this->redirectNow('modules/overview?_render=body'); - - } - - /** - * Disable a module - */ - public function disableAction() - { - $this->manager->disableModule($this->_getParam('name')); - $this->redirectNow('modules/overview?_render=body'); - } -} - -// @codingStandardsIgnoreEnd diff --git a/application/controllers/PreferenceController.php b/application/controllers/PreferenceController.php new file mode 100644 index 000000000..3844495d9 --- /dev/null +++ b/application/controllers/PreferenceController.php @@ -0,0 +1,67 @@ + + * @license http://www.gnu.org/licenses/gpl-2.0.txt GPL, version 2 + * @author Icinga Development Team + */ +// {{{ICINGA_LICENSE_HEADER}}} + +use \Icinga\Web\Controller\BasePreferenceController; +use \Icinga\Web\Widget\Tab; +use \Icinga\Web\Url; + +/** + * Application wide preference controller for user preferences + * + */ +class PreferenceController extends BasePreferenceController +{ + + /** + * @see BasePreferenceController::createProvidedTabs + * + * @return array + */ + public static function createProvidedTabs() + { + return array( + "preference" => new Tab( + array( + "name" => "preferences", + "iconCls" => "user", + "title" => "Preferences", + "url" => Url::fromPath("/preference") + ) + ) + ); + } + + /** + * @TODO: Implement User preferences (feature #5425) + * + */ + public function indexAction() + { + + } +} \ No newline at end of file diff --git a/application/controllers/StaticController.php b/application/controllers/StaticController.php index bb86e60ef..8b1007d39 100644 --- a/application/controllers/StaticController.php +++ b/application/controllers/StaticController.php @@ -27,7 +27,7 @@ */ // {{{ICINGA_LICENSE_HEADER}}} -use Icinga\Web\ActionController; +use Icinga\Web\Controller\ActionController; use Icinga\Application\Icinga, Zend_Controller_Action_Exception as ActionException; diff --git a/application/layouts/scripts/parts/topbar.phtml b/application/layouts/scripts/parts/topbar.phtml index 4fb8f41ed..049a2ab3a 100755 --- a/application/layouts/scripts/parts/topbar.phtml +++ b/application/layouts/scripts/parts/topbar.phtml @@ -17,7 +17,7 @@ diff --git a/application/views/scripts/config/index.phtml b/application/views/scripts/config/index.phtml new file mode 100644 index 000000000..ef3c458db --- /dev/null +++ b/application/views/scripts/config/index.phtml @@ -0,0 +1,12 @@ +tabs->render($this); ?> + +

Configuration

+ +
+

Dear developer

+
+

+ Add shortcuts for often used configuration options so users can quickly change settings without having to + search in the tab overview +

+
\ No newline at end of file diff --git a/application/views/scripts/modules/overview.phtml b/application/views/scripts/config/module/overview.phtml similarity index 51% rename from application/views/scripts/modules/overview.phtml rename to application/views/scripts/config/module/overview.phtml index 5978530e5..a6d2a5f83 100644 --- a/application/views/scripts/modules/overview.phtml +++ b/application/views/scripts/config/module/overview.phtml @@ -1,4 +1,6 @@ modules->limit(10); $modules = $this->modules->paginate(); @@ -11,22 +13,19 @@ $modules = $this->modules->paginate(); + $module->name))->getAbsoluteUrl(); + $disableUrl = Url::fromPath('config/moduledisable/',array('name' => $module->name))->getAbsoluteUrl(); + ?>
enabled): ?> - qlink( - $module->name, - 'modules/disable', - array('name' => $module->name), - array('target'=>'body') - ) ?> + + escape($module->name); ?> + - qlink( - $module->name, - 'modules/enable', - array('name' => $module->name), - array('target'=>'body') - ) ?> + + escape($module->name); ?> (enabled diff --git a/application/views/scripts/modules/show.phtml b/application/views/scripts/config/module/show.phtml similarity index 100% rename from application/views/scripts/modules/show.phtml rename to application/views/scripts/config/module/show.phtml diff --git a/application/views/scripts/configuration/index.phtml b/application/views/scripts/configuration/index.phtml deleted file mode 100644 index e6445410a..000000000 --- a/application/views/scripts/configuration/index.phtml +++ /dev/null @@ -1,12 +0,0 @@ -tabs->render($this); ?> - -

Configuration

- -

- This is the configuration over page. Modules can register their handler to - provide own controllers for configuration. -

- -

- Many thanks for your attention! -

\ No newline at end of file diff --git a/application/views/scripts/preference/index.phtml b/application/views/scripts/preference/index.phtml new file mode 100644 index 000000000..81dc0fb8c --- /dev/null +++ b/application/views/scripts/preference/index.phtml @@ -0,0 +1,3 @@ +tabs->render($this); ?> + +

Preferences

\ No newline at end of file diff --git a/config/menu.ini b/config/menu.ini index b4e42e7b5..a1a6b1a89 100755 --- a/config/menu.ini +++ b/config/menu.ini @@ -1,4 +1,4 @@ [menu] Dashboard = "/dashboard/index" -Configuration = "/configuration/index" +Configuration = "/config/index" diff --git a/doc/module/configuration_and_preferences.md b/doc/module/configuration_and_preferences.md new file mode 100644 index 000000000..a259e524a --- /dev/null +++ b/doc/module/configuration_and_preferences.md @@ -0,0 +1,57 @@ +# Module Development: Configuration and Preferences Dialogs + +When developing modules, you might want your module's configuration and preferences dialogs to appear in the Icinga Web +Configuration/Preferences interface. This is rather easy to accomplish and should be the preferred way to allow user's +to customize your module. + +## Terminology + +When talking about 'Configuration' and 'Preference', we have a clear distinction between those words: + +- **Configurations** are application/module wide settings that affect every user when being changed. This could be + the data backend of your module or other 'global' settings that affect everyone when being changed +- **Preferences** are settings a user can set for *his* account only, like the page size of pagination, entry points, etc. + + +## Usage + +The two base classes for preferences and configurations are \Icinga\Web\Controller\BasePreferenceController for preferences and + \Icinga\Web\Controller\BaseConfigController for configurations. + +If you want to create a preference or configuration panel you have to create a ConfigController and/or PreferenceController + in your Module's a controller directory and make it a subclass of BaseConfigController or BasePreferenceController. + +Those controllers can be used like normal controllers, with two exceptions: + +- If you want your module to appear as a tab in the applications configuration/preference interface you have to implement + the static createProvidedTabs function that returns an array of tabs to be displayed +- The init() method of the base class must be called in order to make sure tabs are collected and the view's tabs variable + is populated + +## Example + +We'll just provide an example for ConfigControllers here, as PreferenceController are the same with a different name + + use \Icinga\Web\Controller\BaseConfigController; + use \Icinga\Web\Widget\Tab; + use \Icinga\Web\Url; + + class My_ConfigController extends BaseConfigController { + + static public function createProvidedTabs() + { + return array( + "myModuleTab" => new Tab(array( + "name" => "myModuleTab", // the internal name of the tab + "iconCls" => "myicon", // the icon to be displayed + "title" => "The tab title", // The title of the configuration's tab + "url" => Url::fromPath("/myModule/config") // The Url that will ne called (can also be just a path) + )) + ); + } + + public function indexAction() + { + // create the form here + } + } diff --git a/library/Icinga/Application/Modules/Manager.php b/library/Icinga/Application/Modules/Manager.php index 96a6234c8..fe668a2c4 100644 --- a/library/Icinga/Application/Modules/Manager.php +++ b/library/Icinga/Application/Modules/Manager.php @@ -2,24 +2,70 @@ namespace Icinga\Application\Modules; +use Icinga\Application\Icinga; use Icinga\Exception\ConfigurationError; use Icinga\Exception\SystemPermissionException; use Icinga\Exception\ProgrammingError; -// TODO: show whether enabling/disabling modules is allowed by checking enableDir -// perms - +/** + * Module manager that handles detecting, enabling and disabling of modules + * + * Modules can have 3 states: + * - installed Means that the module exists, but could be deactivated (see enabled and loaded) + * - enabled Means that the module is marked as being enabled and should be used + * - loaded Means that the module has been registered in the autoloader and is being used + * + */ class Manager { - protected $installedBaseDirs = null; - protected $enabledDirs = array(); - protected $loadedModules = array(); - protected $index; - protected $app; - protected $enableDir; - protected $modulePaths = array(); /** - * @param $app : The applicaiton bootstrap. This one needs a properly defined interface + * Array of all installed module's base directories + * + * null if modules haven't been scanned yet + * + * @var array|null + */ + protected $installedBaseDirs = null; + + /** + * Array of all enabled modules base dirs + * + * @var array + */ + protected $enabledDirs = array(); + + /** + * Array of all module names that have been loaded + * + * @var array + */ + protected $loadedModules = array(); + + /** + * Reference to Icinga::app + * + * @var Icinga + */ + protected $app; + + /** + * The directory that is used to detect enabled modules + * + * @var string + */ + protected $enableDir; + + /** + * All paths to look for installed modules that can be enabled + * + * @var array + */ + protected $modulePaths = array(); + + /** + * Creates a new instance of the module manager to + * + * @param $app : The applicaiton bootstrap. This one needs a properly defined interface * In order to test it correctly, the application now only requires a stdClass * @param $dir : **/ @@ -294,4 +340,5 @@ class Manager } } } + } diff --git a/library/Icinga/Application/Modules/Module.php b/library/Icinga/Application/Modules/Module.php index 40ce159b0..896eab45f 100644 --- a/library/Icinga/Application/Modules/Module.php +++ b/library/Icinga/Application/Modules/Module.php @@ -207,6 +207,11 @@ class Module return $this->basedir; } + public function getControllerDir() + { + return $this->controllerdir; + } + /** * Getter for library directory * @@ -385,4 +390,5 @@ class Module Hook::register($name, $key, $class); return $this; } + } diff --git a/library/Icinga/Web/ActionController.php b/library/Icinga/Web/Controller/ActionController.php similarity index 96% rename from library/Icinga/Web/ActionController.php rename to library/Icinga/Web/Controller/ActionController.php index 5e29ed207..2bc1b4275 100755 --- a/library/Icinga/Web/ActionController.php +++ b/library/Icinga/Web/Controller/ActionController.php @@ -25,19 +25,18 @@ * @author Icinga Development Team */ // {{{ICINGA_LICENSE_HEADER}}} +namespace Icinga\Web\Controller; -namespace Icinga\Web; - -use Icinga\Authentication\Manager as AuthManager; -use Icinga\Application\Benchmark; -use Icinga\Exception; +use \Icinga\Authentication\Manager as AuthManager; +use \Icinga\Application\Benchmark; +use \Icinga\Exception; use \Icinga\Application\Config; -use Icinga\Web\Notification; -use Zend_Layout as ZfLayout; -use Zend_Controller_Action as ZfController; -use Zend_Controller_Request_Abstract as ZfRequest; -use Zend_Controller_Response_Abstract as ZfResponse; -use Zend_Controller_Action_HelperBroker as ZfActionHelper; +use \Icinga\Web\Notification; +use \Zend_Layout as ZfLayout; +use \Zend_Controller_Action as ZfController; +use \Zend_Controller_Request_Abstract as ZfRequest; +use \Zend_Controller_Response_Abstract as ZfResponse; +use \Zend_Controller_Action_HelperBroker as ZfActionHelper; /* * @TODO(el): There was a note from tg that the following line is temporary. Ask him why. diff --git a/library/Icinga/Web/Controller/BaseConfigController.php b/library/Icinga/Web/Controller/BaseConfigController.php new file mode 100644 index 000000000..a9727f3f7 --- /dev/null +++ b/library/Icinga/Web/Controller/BaseConfigController.php @@ -0,0 +1,65 @@ + + * @license http://www.gnu.org/licenses/gpl-2.0.txt GPL, version 2 + * @author Icinga Development Team + */ +// {{{ICINGA_LICENSE_HEADER}}} + + +namespace Icinga\Web\Controller; + +use \Icinga\Application\Icinga; + +/** + * Base class for Configuration Controllers + * + * Module preferences use this class to make sure they are automatically + * added to the application's configuration dialog. If you create a subclass of + * BasePreferenceController and overwrite @see init(), make sure you call + * parent::init(), otherwise you won't have the $tabs property in your view. + * + */ +class BaseConfigController extends ActionController +{ + /* + * Return an array of tabs provided by this configuration controller. + * + * Those tabs will automatically be added to the application's configuration dialog + * + * @return array + */ + public static function createProvidedTabs() + { + return array(); + } + + /** + * @see ActionController::init + */ + public function init() + { + parent::init(); + $this->view->tabs = ControllerTabCollector::collectControllerTabs('ConfigController'); + } +} diff --git a/library/Icinga/Web/Controller/BasePreferenceController.php b/library/Icinga/Web/Controller/BasePreferenceController.php new file mode 100644 index 000000000..bdf71e4c4 --- /dev/null +++ b/library/Icinga/Web/Controller/BasePreferenceController.php @@ -0,0 +1,62 @@ + + * @license http://www.gnu.org/licenses/gpl-2.0.txt GPL, version 2 + * @author Icinga Development Team + */ +// {{{ICINGA_LICENSE_HEADER}}} + +namespace Icinga\Web\Controller; + +/** + * Base class for Preference Controllers + * + * Module preferences use this class to make sure they are automatically + * added to the general preferences dialog. If you create a subclass of + * BasePreferenceController and overwrite @see init(), make sure you call + * parent::init(), otherwise you won't have the $tabs property in your view. + * + */ +class BasePreferenceController extends ActionController +{ + /** + * Return an array of tabs provided by this preference controller. + * + * Those tabs will automatically be added to the application's preference dialog + * + * @return array + */ + public static function createProvidedTabs() + { + return array(); + } + + /** + * @see ActionController::init() + */ + public function init() + { + parent::init(); + $this->view->tabs = ControllerTabCollector::collectControllerTabs('PreferenceController'); + } +} diff --git a/library/Icinga/Web/Controller/ControllerTabCollector.php b/library/Icinga/Web/Controller/ControllerTabCollector.php new file mode 100644 index 000000000..d5d48fa4c --- /dev/null +++ b/library/Icinga/Web/Controller/ControllerTabCollector.php @@ -0,0 +1,125 @@ + + * @license http://www.gnu.org/licenses/gpl-2.0.txt GPL, version 2 + * @author Icinga Development Team + */ +// {{{ICINGA_LICENSE_HEADER}}} + +namespace Icinga\Web\Controller; + +use \Icinga\Application\Modules\Module; +use \Icinga\Application\Icinga; +use \Icinga\Web\Widget\Tabs; + +/** + * Static helper class that collects tabs provided by the 'createProvidedTabs' method + * of controllers. + * + */ +class ControllerTabCollector +{ + + /** + * Scan all controllers with the provided name + * in the application and (loaded) module folders and collects their provided tabs + * + * @param string $controller The name of the controllers to use for tab collection + * + * @return Tabs A @see Tabs instance containing the application tabs first + * followed by the tabs provided from the modules + */ + public static function collectControllerTabs($controller) + { + require_once(Icinga::app()->getApplicationDir('/controllers/'.$controller.'.php')); + + $applicationTabs = $controller::createProvidedTabs(); + $moduleTabs = self::collectModuleTabs($controller); + + $tabs = new Tabs(); + foreach ($applicationTabs as $name => $tab) { + $tabs->add($name, $tab); + } + + foreach ($moduleTabs as $name => $tab) { + // don't overwrite application tabs if the module wants to + if ($tabs->has($name)) { + continue; + } + $tabs->add($name, $tab); + } + return $tabs; + } + + /** + * Collect module tabs for all modules containing the given controller + * + * @param string $controller The controller name to use for tab collection + * + * @return array An array of Tabs objects or arrays containing Tab descriptions + */ + private static function collectModuleTabs($controller) + { + $moduleManager = Icinga::app()->getModuleManager(); + $modules = $moduleManager->listEnabledModules(); + $tabs = array(); + foreach ($modules as $module) { + $tabs += self::createModuleConfigurationTabs($controller, $moduleManager->getModule($module)); + } + + return $tabs; + } + + /** + * Collects the tabs from the createProvidedTabs() method in the configuration controller + * + * If the module doesn't have the given controller or createProvidedTabs method in the controller + * an empty array will be returned + * + * @param string $controller The name of the controller that provides tabs via createProvidedTabs + * @param Module $module The module instance that provides the controller + * + * @return array + */ + private static function createModuleConfigurationTabs($controller, Module $module) + { + $controllerDir = $module->getControllerDir(); + $name = $module->getName(); + + $controllerDir = $controllerDir . '/' . $controller . '.php'; + $controllerName = ucfirst($name) . '_' . $controller; + + if (is_readable($controllerDir)) { + require_once(realpath($controllerDir)); + if (!method_exists($controllerName, "createProvidedTabs")) { + return array(); + } + $tab = $controllerName::createProvidedTabs(); + if (!is_array($tab)) { + $tab = array($name => $tab); + } + return $tab; + } + return array(); + } +} diff --git a/library/Icinga/Web/ModuleActionController.php b/library/Icinga/Web/Controller/ModuleActionController.php similarity index 98% rename from library/Icinga/Web/ModuleActionController.php rename to library/Icinga/Web/Controller/ModuleActionController.php index f338ad803..a2fdf6c68 100644 --- a/library/Icinga/Web/ModuleActionController.php +++ b/library/Icinga/Web/Controller/ModuleActionController.php @@ -26,7 +26,7 @@ /** * Module action controller */ -namespace Icinga\Web; +namespace Icinga\Web\Controller; use \Icinga\Application\Config as IcingaConfig; use Icinga\Application\Icinga; diff --git a/modules/monitoring/application/controllers/CommandController.php b/modules/monitoring/application/controllers/CommandController.php index 651969235..8e3d9c700 100644 --- a/modules/monitoring/application/controllers/CommandController.php +++ b/modules/monitoring/application/controllers/CommandController.php @@ -35,7 +35,7 @@ use \Icinga\Application\Config; use Icinga\Application\Logger; use Icinga\Authentication\Manager; use Icinga\Web\Form; -use Icinga\Web\ModuleActionController; +use Icinga\Web\Controller\ModuleActionController; use Icinga\Protocol\Commandpipe\Comment; use Icinga\Protocol\Commandpipe\CommandPipe; use Icinga\Exception\ConfigurationError; diff --git a/application/controllers/ConfigurationController.php b/modules/monitoring/application/controllers/ConfigController.php similarity index 54% rename from application/controllers/ConfigurationController.php rename to modules/monitoring/application/controllers/ConfigController.php index 334d0a3e8..ca67aab85 100644 --- a/application/controllers/ConfigurationController.php +++ b/modules/monitoring/application/controllers/ConfigController.php @@ -1,9 +1,9 @@ - * @author Icinga Development Team + * @license http://www.gnu.org/licenses/gpl-2.0.txt GPL, version 2 + * @author Icinga Development Team */ // {{{ICINGA_LICENSE_HEADER}}} -use Icinga\Application\Benchmark; -use Icinga\Authentication\Manager; -use Icinga\Web\ActionController; -use Icinga\Web\Widget\Tabs; -use Icinga\Web\Hook\Configuration\ConfigurationTabBuilder; +use \Icinga\Web\Controller\BaseConfigController; +use \Icinga\Web\Widget\Tab; +use \Icinga\Web\Url; -/** - * Class ConfigurationController - */ -class ConfigurationController extends ActionController -{ - public function init() +class Monitoring_ConfigController extends BaseConfigController { + + static public function createProvidedTabs() { - parent::init(); - } - - - /** - * Index action - */ - public function indexAction() - { - $tabBuilder = new ConfigurationTabBuilder( - new Tabs() + return array( + "backends" => new Tab(array( + "name" => "backends", + "iconCls" => "hdd", + "title" => "Monitoring Backends", + "url" => Url::fromPath("/monitoring/config/backend") + )) ); - - $tabBuilder->build(); - $this->view->tabs = $tabBuilder->getTabs(); } -} -// @codingStandardsIgnoreEnd + public function backendAction() + { + $this->redirectNow("/config"); + } + +} \ No newline at end of file diff --git a/modules/monitoring/application/controllers/ListController.php b/modules/monitoring/application/controllers/ListController.php index 9b3313e8f..3ad951113 100644 --- a/modules/monitoring/application/controllers/ListController.php +++ b/modules/monitoring/application/controllers/ListController.php @@ -1,6 +1,6 @@