* @author Ben Coburn */ use dokuwiki\plugin\config\core\Configuration; use dokuwiki\plugin\config\core\Setting\Setting; use dokuwiki\plugin\config\core\Setting\SettingFieldset; use dokuwiki\plugin\config\core\Setting\SettingHidden; /** * All DokuWiki plugins to extend the admin function * need to inherit from this class */ class admin_plugin_config extends DokuWiki_Admin_Plugin { const IMGDIR = DOKU_BASE . 'lib/plugins/config/images/'; /** @var Configuration */ protected $configuration; /** @var bool were there any errors in the submitted data? */ protected $hasErrors = false; /** @var bool have the settings translations been loaded? */ protected $promptsLocalized = false; /** * admin_plugin_config constructor. */ public function __construct() { $this->configuration = new Configuration(); } /** * handle user request */ public function handle() { global $ID, $INPUT; if(!$INPUT->bool('save') || !checkSecurityToken()) { return; } // don't go any further if the configuration is locked if($this->configuration->isLocked()) return; // update settings and redirect of successful $ok = $this->configuration->updateSettings($INPUT->arr('config')); if($ok) { // no errors try { if($this->configuration->hasChanged()) { $this->configuration->save(); } else { $this->configuration->touch(); } msg($this->getLang('updated'), 1); } catch(Exception $e) { msg($this->getLang('error'), -1); } send_redirect(wl($ID, array('do' => 'admin', 'page' => 'config'), true, '&')); } else { $this->hasErrors = true; } } /** * output appropriate html */ public function html() { $allow_debug = $GLOBALS['conf']['allowdebug']; // avoid global $conf; here. global $lang; global $ID; $this->setupLocale(true); echo $this->locale_xhtml('intro'); echo '
'; if($this->configuration->isLocked()) { echo '
' . $this->getLang('locked') . '
'; } // POST to script() instead of wl($ID) so config manager still works if // rewrite config is broken. Add $ID as hidden field to remember // current ID in most cases. echo '
'; echo '
'; formSecurityToken(); $this->printH1('dokuwiki_settings', $this->getLang('_header_dokuwiki')); $in_fieldset = false; $first_plugin_fieldset = true; $first_template_fieldset = true; foreach($this->configuration->getSettings() as $setting) { if(is_a($setting, SettingHidden::class)) { continue; } else if(is_a($setting, settingFieldset::class)) { // config setting group if($in_fieldset) { echo ''; echo '
'; echo ''; } else { $in_fieldset = true; } // fixme this should probably be a function in setting: if($first_plugin_fieldset && $setting->getType() == 'plugin') { $this->printH1('plugin_settings', $this->getLang('_header_plugin')); $first_plugin_fieldset = false; } else if($first_template_fieldset && $setting->getType() == 'template') { $this->printH1('template_settings', $this->getLang('_header_template')); $first_template_fieldset = false; } echo '
'; echo '' . $setting->prompt($this) . ''; echo '
'; echo ''; } else { // config settings list($label, $input) = $setting->html($this, $this->hasErrors); $class = $setting->isDefault() ? ' class="default"' : ($setting->isProtected() ? ' class="protected"' : ''); $error = $setting->hasError() ? ' class="value error"' : ' class="value"'; $icon = $setting->caution() ? '' : ''; echo ''; echo ''; echo '' . $input . ''; echo ''; } } echo '
'; echo '' . $setting->getPrettyKey() . ''; echo $icon . $label; echo '
'; echo '
'; if($in_fieldset) { echo '
'; } // show undefined settings list $undefined_settings = $this->configuration->getUndefined(); if($allow_debug && !empty($undefined_settings)) { /** * Callback for sorting settings * * @param Setting $a * @param Setting $b * @return int if $a is lower/equal/higher than $b */ function settingNaturalComparison($a, $b) { return strnatcmp($a->getKey(), $b->getKey()); } usort($undefined_settings, 'settingNaturalComparison'); $this->printH1('undefined_settings', $this->getLang('_header_undefined')); echo '
'; echo '
'; echo ''; $undefined_setting_match = array(); foreach($undefined_settings as $setting) { if( preg_match( '/^(?:plugin|tpl)' . Configuration::KEYMARKER . '.*?' . Configuration::KEYMARKER . '(.*)$/', $setting->getKey(), $undefined_setting_match ) ) { $undefined_setting_key = $undefined_setting_match[1]; } else { $undefined_setting_key = $setting->getKey(); } echo ''; echo '' ; echo ''; echo ''; } echo '
$' . 'conf' . '[\'' . $setting->getArrayKey() . '\']' . $this->getLang('_msg_' . get_class($setting)) . '
'; echo '
'; echo '
'; } // finish up form echo '

'; echo ''; echo ''; if(!$this->configuration->isLocked()) { echo ''; echo ''; echo ''; } echo '

'; echo ''; echo ''; } /** * @param bool $prompts */ public function setupLocale($prompts = false) { parent::setupLocale(); if(!$prompts || $this->promptsLocalized) return; $this->configuration->getLangs(); $this->promptsLocalized = true; } /** * Generates a two-level table of contents for the config plugin. * * @author Ben Coburn * * @return array */ public function getTOC() { $this->setupLocale(true); $allow_debug = $GLOBALS['conf']['allowdebug']; // avoid global $conf; here. // gather settings data into three sub arrays $toc = array('conf' => array(), 'plugin' => array(), 'template' => null); foreach($this->configuration->getSettings() as $setting) { if(is_a($setting, 'setting_fieldset')) { $toc[$setting->getType()][] = $setting; } } // build toc $t = array(); $check = false; $title = $this->getLang('_configuration_manager'); $t[] = html_mktocitem(sectionID($title, $check), $title, 1); $t[] = html_mktocitem('dokuwiki_settings', $this->getLang('_header_dokuwiki'), 1); /** @var Setting $setting */ foreach($toc['conf'] as $setting) { $name = $setting->prompt($this); $t[] = html_mktocitem($setting->getKey(), $name, 2); } if(!empty($toc['plugin'])) { $t[] = html_mktocitem('plugin_settings', $this->getLang('_header_plugin'), 1); } foreach($toc['plugin'] as $setting) { $name = $setting->prompt($this); $t[] = html_mktocitem($setting->getKey(), $name, 2); } if(isset($toc['template'])) { $t[] = html_mktocitem('template_settings', $this->getLang('_header_template'), 1); $setting = $toc['template']; $name = $setting->prompt($this); $t[] = html_mktocitem($setting->getKey(), $name, 2); } if(count($this->configuration->getUndefined()) && $allow_debug) { $t[] = html_mktocitem('undefined_settings', $this->getLang('_header_undefined'), 1); } return $t; } /** * @param string $id * @param string $text */ protected function printH1($id, $text) { echo '

' . $text . '

'; } /** * Adds a translation to this plugin's language array * * Used by some settings to set up dynamic translations * * @param string $key * @param string $value */ public function addLang($key, $value) { if(!$this->localised) $this->setupLocale(); $this->lang[$key] = $value; } }