Adjust general config form to suit the new form builder implementation

refs #5525
This commit is contained in:
Johannes Meyer 2014-07-21 14:33:52 +02:00
parent a9f0b95e51
commit a73e2ee654
2 changed files with 147 additions and 175 deletions

View File

@ -66,17 +66,25 @@ class ConfigController extends BaseConfigController
{
$this->view->messageBox = new AlertMessageBox(true);
$this->view->tabs->activate('index');
$form = new GeneralForm();
$form->setConfiguration(IcingaConfig::app());
$form->setRequest($this->_request);
if ($form->isSubmittedAndValid()) {
if (!$this->writeConfigFile($form->getConfig(), 'config')) {
return;
$request = $this->getRequest();
$currentConfig = IcingaConfig::app();
if ($request->isPost()) {
if ($form->isValid($request->getPost())) {
$formConfig = $form->getConfiguration();
$newConfig = new Zend_Config($currentConfig->toArray(), true);
$newConfig->global = $formConfig->global;
$newConfig->preferences = $formConfig->preferences;
if ($this->writeConfigFile($newConfig, 'config')) {
Notification::success($this->translate('New configuration has successfully been stored'));
$this->redirectNow('config');
}
}
Notification::success('New configuration has successfully been stored');
$form->setConfiguration(IcingaConfig::app(), true);
$this->redirectNow('config/index');
} else {
$form->setConfiguration($currentConfig);
}
$this->view->form = $form;
}

View File

@ -4,15 +4,11 @@
namespace Icinga\Form\Config;
use Icinga\Application\Config as IcingaConfig;
use Icinga\Data\ResourceFactory;
use DateTimeZone;
use Zend_Config;
use Icinga\Web\Form;
use Icinga\Util\Translator;
use Icinga\Web\Form\Validator\WritablePathValidator;
use Icinga\Web\Form\Decorator\ConditionalHidden;
use DateTimeZone;
use Zend_Form_Element_Select;
use Zend_Config;
use Icinga\Data\ResourceFactory;
/**
* Configuration form for general, application-wide settings
@ -20,74 +16,94 @@ use Zend_Config;
class GeneralForm extends Form
{
/**
* The base directory of the icingaweb configuration
*
* @var string
* Initialize this configuration form
*/
private $configDir = null;
/**
* The resources to use instead of the factory provided ones (use for testing)
*
* @var null
*/
private $resources;
/**
* Set a specific configuration directory to use for configuration specific default paths
*
* @param string $dir
*/
public function setConfigDir($dir)
public function init()
{
$this->configDir = $dir;
$this->setName('form_config_general');
}
/**
* Return the config path set for this form or the application wide config path if none is set
*
* @return string
*
* @see IcingaConfig::configDir
* @see Form::createElements()
*/
public function getConfigDir()
public function createElements(array $formData)
{
return $this->configDir === null ? IcingaConfig::$configDir : $this->configDir;
$elements = array(
$this->getLanguageSelection($formData),
$this->getTimezoneSelection($formData),
$this->getModulePathInput($formData)
);
return array_merge($elements, $this->getPreferencesElements($formData));
}
/**
* Set an alternative array of resources that should be used instead of the DBFactory resource set
* (used for testing)
*
* @param array $resources The resources to use for populating the db selection field
* @see Form::addSubmitButton()
*/
public function setResources(array $resources)
public function addSubmitButton()
{
$this->resources = $resources;
$this->addElement(
'submit',
'btn_submit',
array(
'label' => t('Save Changes')
)
);
return $this;
}
/**
* Return content of the resources.ini or previously set resources for displaying in the database selection field
* Populate this form with the given configuration
*
* @return array
* @param Zend_Config $config The configuration to populate this form with
*
* @return self
*/
public function getResources()
public function setConfiguration(Zend_Config $config)
{
if ($this->resources === null) {
return ResourceFactory::getResourceConfigs()->toArray();
} else {
return $this->resources;
$defaults = $config->get('global', new Zend_Config(array()))->toArray();
if ($config->get('preferences', new Zend_Config(array()))->type !== null) {
$defaults['preferences_type'] = $config->get('preferences')->type;
$defaults['preferences_resource'] = $config->get('preferences')->resource;
}
$this->setDefaults($defaults);
return $this;
}
/**
* Add a select field for setting the default language
* Return the configured configuration values
*
* @return Zend_Config
*/
public function getConfiguration()
{
$values = $this->getValues();
$globalData = array(
'language' => $values['language'],
'timezone' => $values['timezone'],
'modulePath' => $values['modulePath']
);
$preferencesData = array('type' => $values['preferences_type']);
if ($values['preferences_type'] === 'db') {
$preferencesData['resource'] = $values['preferences_resource'];
}
return new Zend_Config(array('global' => $globalData, 'preferences' => $preferencesData));
}
/**
* Return a select field for setting the default language
*
* Possible values are determined by Translator::getAvailableLocaleCodes.
*
* @param Zend_Config $cfg The "global" section of the config.ini
* @param array $formData The data to populate the elements with
*
* @return Zend_Form_Element
*/
private function addLanguageSelection(Zend_Config $cfg)
protected function getLanguageSelection(array $formData)
{
$languages = array();
foreach (Translator::getAvailableLocaleCodes() as $language) {
@ -95,7 +111,7 @@ class GeneralForm extends Form
}
$languages[Translator::DEFAULT_LOCALE] = Translator::DEFAULT_LOCALE;
$this->addElement(
return $this->createElement(
'select',
'language',
array(
@ -105,167 +121,115 @@ class GeneralForm extends Form
'helptext' => t(
'Select the language to use by default. Can be overwritten by a user in his preferences.'
),
'value' => $cfg->get('language', Translator::DEFAULT_LOCALE)
'value' => isset($formData['language']) ? $formData['language'] : Translator::DEFAULT_LOCALE
)
);
}
/**
* Add a select field for setting the default timezone.
* Return a select field for setting the default timezone
*
* Possible values are determined by DateTimeZone::listIdentifiers
* Possible values are determined by DateTimeZone::listIdentifiers.
*
* @param Zend_Config $cfg The "global" section of the config.ini
* @param array $formData The data to populate the elements with
*
* @return Zend_Form_Element
*/
private function addTimezoneSelection(Zend_Config $cfg)
protected function getTimezoneSelection(array $formData)
{
$tzList = array();
foreach (DateTimeZone::listIdentifiers() as $tz) {
$tzList[$tz] = $tz;
}
$helptext = 'Select the timezone to be used as the default. User\'s can set their own timezone if'
. ' they like to, but this is the timezone to be used as the default setting .';
$this->addElement(
'select',
'timezone',
array(
'label' => 'Default Application Timezone',
'required' => true,
'multiOptions' => $tzList,
'helptext' => $helptext,
'value' => $cfg->get('timezone', date_default_timezone_get())
'label' => t('Default Application Timezone'),
'required' => true,
'multiOptions' => $tzList,
'helptext' => t(
'Select the timezone to be used as the default. User\'s can set their own timezone if'
. ' they like to, but this is the timezone to be used as the default setting .'
),
'value' => isset($formData['timezone']) ? $formData['timezone'] : date_default_timezone_get()
)
);
}
/**
* Add configuration settings for module paths
* Return a input field for setting the module path
*
* @param Zend_Config $cfg The "global" section of the config.ini
* @param array $formData The data to populate the elements with
*/
private function addModuleSettings(Zend_Config $cfg)
protected function getModulePathInput(array $formData)
{
$this->addElement(
'text',
'module_path',
'modulePath',
array(
'label' => 'Module Path',
'label' => t('Module Path'),
'required' => true,
'helptext' => 'Contains the directories that will be searched for available modules, separated by ' .
' colons. Modules that don\'t exist in these directories can still be symlinked in the module ' .
' folder, but won\'t show up in the list of disabled modules.',
'value' => $cfg->get('modulePath', realpath(ICINGAWEB_APPDIR . '/../modules'))
'helptext' => t(
'Contains the directories that will be searched for available modules, separated by '
. 'colons. Modules that don\'t exist in these directories can still be symlinked in '
. 'the module folder, but won\'t show up in the list of disabled modules.'
),
'value' => isset($formData['modulePath'])
? $formData['modulePath']
: realpath(ICINGAWEB_APPDIR . '/../modules')
)
);
}
/**
* Add form elements for setting the user preference storage backend
* Return form elements for setting the user preference storage backend
*
* @param Zend_Config $cfg The Zend_config object of preference section
* @param array $formData The data to populate the elements with
*/
public function addUserPreferencesDialog(Zend_Config $cfg)
protected function getPreferencesElements(array $formData)
{
$backend = $cfg->get('type', 'ini');
if ($this->getRequest()->get('preferences_type', null) !== null) {
$backend = $this->getRequest()->get('preferences_type');
}
$this->addElement(
'select',
'preferences_type',
array(
'label' => 'User Preference Storage Type',
'required' => true,
'value' => $backend,
'multiOptions' => array(
'ini' => 'File System (INI Files)',
'db' => 'Database',
'null' => 'Don\'t Store Preferences'
$elements = array(
$this->createElement(
'select',
'preferences_type',
array(
'required' => true,
'class' => 'autosubmit',
'label' => t('User Preference Storage Type'),
'value' => isset($formData['preferences_type']) ? $formData['preferences_type'] : 'ini',
'multiOptions' => array(
'ini' => t('File System (INI Files)'),
'db' => t('Database'),
'null' => t('Don\'t Store Preferences')
)
)
)
);
$backends = array();
foreach ($this->getResources() as $name => $resource) {
if ($resource['type'] !== 'db') {
continue;
if (isset($formData['preferences_type']) && $formData['preferences_type'] === 'db') {
$backends = array();
foreach (ResourceFactory::getResourceConfigs()->toArray() as $name => $resource) {
if ($resource['type'] === 'db') {
$backends[$name] = $name;
}
}
$backends[$name] = $name;
$elements[] = $this->createElement(
'select',
'preferences_resource',
array(
'required' => true,
'multiOptions' => $backends,
'label' => t('Database Connection'),
'value' => isset($formData['preferences_resource'])
? $formData['preferences_resource']
: null
)
);
}
$txtPreferencesDbResource = new Zend_Form_Element_Select(
array(
'name' => 'preferences_db_resource',
'label' => 'Database Connection',
'required' => $backend === 'db',
'condition' => $backend === 'db',
'value' => $cfg->get('resource'),
'multiOptions' => $backends
)
);
$validator = new WritablePathValidator();
$validator->setRequireExistence();
$this->addElement($txtPreferencesDbResource);
$txtPreferencesDbResource->addDecorator(new ConditionalHidden());
$this->enableAutoSubmit(
array(
'preferences_type'
)
);
}
/**
* Create the general form, using the provided configuration
*
* @see Form::create()
*/
public function create()
{
$config = $this->getConfiguration();
$global = $config->global;
if ($global === null) {
$global = new Zend_Config(array());
}
$preferences = $config->preferences;
if ($preferences === null) {
$preferences = new Zend_Config(array());
}
$this->setName('form_config_general');
$this->addLanguageSelection($global);
$this->addTimezoneSelection($global);
$this->addModuleSettings($global);
$this->addUserPreferencesDialog($preferences);
$this->setSubmitLabel('Save Changes');
}
/**
* Return an Zend_Config object containing the configuration set in this form
*
* @return Zend_Config
*/
public function getConfig()
{
$config = $this->getConfiguration();
if ($config->global === null) {
$config->global = new Zend_Config(array(), true);
}
if ($config->preferences === null) {
$config->preferences = new Zend_Config(array(), true);
}
$values = $this->getValues();
$cfg = clone $config;
$cfg->global->language = $values['language'];
$cfg->global->timezone = $values['timezone'];
$cfg->global->modulePath = $values['module_path'];
$cfg->preferences->type = $values['preferences_type'];
if ($cfg->preferences->type === 'db') {
$cfg->preferences->resource = $values['preferences_db_resource'];
}
return $cfg;
return $elements;
}
}