summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--inc/confutils.php66
-rw-r--r--inc/init.php49
-rw-r--r--lib/plugins/config/settings/config.class.php53
-rw-r--r--lib/plugins/config/settings/config.metadata.php2
4 files changed, 113 insertions, 57 deletions
diff --git a/inc/confutils.php b/inc/confutils.php
index aeb5f6c60..77f058e0e 100644
--- a/inc/confutils.php
+++ b/inc/confutils.php
@@ -39,11 +39,7 @@ function mimetype($file){
function getMimeTypes() {
static $mime = NULL;
if ( !$mime ) {
- $mime = confToHash(DOKU_CONF.'mime.conf');
- if (@file_exists(DOKU_CONF.'mime.local.conf')) {
- $local = confToHash(DOKU_CONF.'mime.local.conf');
- $mime = array_merge($mime, $local);
- }
+ $mime = retrieveConfig('mime','confToHash');
}
return $mime;
}
@@ -56,11 +52,7 @@ function getMimeTypes() {
function getAcronyms() {
static $acronyms = NULL;
if ( !$acronyms ) {
- $acronyms = confToHash(DOKU_CONF.'acronyms.conf');
- if (@file_exists(DOKU_CONF.'acronyms.local.conf')) {
- $local = confToHash(DOKU_CONF.'acronyms.local.conf');
- $acronyms = array_merge($acronyms, $local);
- }
+ $acronyms = retrieveConfig('acronyms','confToHash');
}
return $acronyms;
}
@@ -73,11 +65,7 @@ function getAcronyms() {
function getSmileys() {
static $smileys = NULL;
if ( !$smileys ) {
- $smileys = confToHash(DOKU_CONF.'smileys.conf');
- if (@file_exists(DOKU_CONF.'smileys.local.conf')) {
- $local = confToHash(DOKU_CONF.'smileys.local.conf');
- $smileys = array_merge($smileys, $local);
- }
+ $smileys = retrieveConfig('smileys','confToHash');
}
return $smileys;
}
@@ -90,11 +78,7 @@ function getSmileys() {
function getEntities() {
static $entities = NULL;
if ( !$entities ) {
- $entities = confToHash(DOKU_CONF.'entities.conf');
- if (@file_exists(DOKU_CONF.'entities.local.conf')) {
- $local = confToHash(DOKU_CONF.'entities.local.conf');
- $entities = array_merge($entities, $local);
- }
+ $entities = retrieveConfig('entities','confToHash');
}
return $entities;
}
@@ -107,11 +91,7 @@ function getEntities() {
function getInterwiki() {
static $wikis = NULL;
if ( !$wikis ) {
- $wikis = confToHash(DOKU_CONF.'interwiki.conf',true);
- if (@file_exists(DOKU_CONF.'interwiki.local.conf')) {
- $local = confToHash(DOKU_CONF.'interwiki.local.conf');
- $wikis = array_merge($wikis, $local);
- }
+ $wikis = retrieveConfig('interwiki','confToHash');
}
//add sepecial case 'this'
$wikis['this'] = DOKU_URL.'{NAME}';
@@ -125,11 +105,7 @@ function getInterwiki() {
function getWordblocks() {
static $wordblocks = NULL;
if ( !$wordblocks ) {
- $wordblocks = file(DOKU_CONF.'wordblock.conf');
- if (@file_exists(DOKU_CONF.'wordblock.local.conf')) {
- $local = file(DOKU_CONF.'wordblock.local.conf');
- $wordblocks = array_merge($wordblocks, $local);
- }
+ $wordblocks = retrieveConfig('wordblock','file');
}
return $wordblocks;
}
@@ -138,11 +114,7 @@ function getWordblocks() {
function getSchemes() {
static $schemes = NULL;
if ( !$schemes ) {
- $schemes = file(DOKU_CONF.'scheme.conf');
- if (@file_exists(DOKU_CONF.'scheme.local.conf')) {
- $local = file(DOKU_CONF.'scheme.local.conf');
- $schemes = array_merge($schemes, $local);
- }
+ $schemes = retrieveConfig('scheme','file');
}
$schemes = array_map('trim', $schemes);
$schemes = preg_replace('/^#.*/', '', $schemes);
@@ -183,6 +155,30 @@ function confToHash($file,$lower=false) {
}
/**
+ * Retrieve the requested configuration information
+ *
+ * @author Chris Smith <chris@jalakai.co.uk>
+ *
+ * @param string $type the configuration settings to be read, must correspond to a key/array in $config_cascade
+ * @param callback $fn the function used to process the configuration file into an array
+ * @return array configuration values
+ */
+function retrieveConfig($type,$fn) {
+ global $config_cascade;
+
+ $combined = array();
+ if (!is_array($config_cascade[$type])) trigger_error('Missing config cascade for "'.$type.'"',E_USER_WARNING);
+ foreach ($config_cascade[$type] as $file) {
+ if (@file_exists($file)) {
+ $config = $fn($file);
+ $combined = array_merge($combined, $config);
+ }
+ }
+
+ return $combined;
+}
+
+/**
* check if the given action was disabled in config
*
* @author Andreas Gohr <andi@splitbrain.org>
diff --git a/inc/init.php b/inc/init.php
index 9c4baa988..9ef905d52 100644
--- a/inc/init.php
+++ b/inc/init.php
@@ -40,14 +40,55 @@
global $cache_authname; $cache_authname = array();
global $cache_metadata; $cache_metadata = array();
+ //set the configuration cascade - but only if its not already been set in preload.php
+ global $config_cascade;
+ if (empty($config_cascade)) {
+ $config_cascade = array(
+ 'main' => array(
+ 'default' => array(DOKU_CONF.'dokuwiki.php'),
+ 'local' => array(DOKU_CONF.'local.php'),
+ 'protected' => array(DOKU_CONF.'local.protected.php'),
+ ),
+ 'acronyms' => array(
+ 'default' => array(DOKU_CONF.'acronyms.php'),
+ 'local' => array(DOKU_CONF.'acronyms.local.php'),
+ ),
+ 'entities' => array(
+ 'default' => array(DOKU_CONF.'entities.php'),
+ 'local' => array(DOKU_CONF.'entities.local.php'),
+ ),
+ 'interwiki' => array(
+ 'default' => array(DOKU_CONF.'interwiki.php'),
+ 'local' => array(DOKU_CONF.'interwiki.local.php'),
+ ),
+ 'mime' => array(
+ 'default' => array(DOKU_CONF.'mime.php'),
+ 'local' => array(DOKU_CONF.'mime.local.php'),
+ ),
+ 'scheme' => array(
+ 'default' => array(DOKU_CONF.'scheme.php'),
+ 'local' => array(DOKU_CONF.'scheme.local.php'),
+ ),
+ 'smileys' => array(
+ 'default' => array(DOKU_CONF.'smileys.php'),
+ 'local' => array(DOKU_CONF.'smileys.local.php'),
+ ),
+ 'wordblock' => array(
+ 'default' => array(DOKU_CONF.'wordblock.php'),
+ 'local' => array(DOKU_CONF.'wordblock.local.php'),
+ ),
+ );
+ }
+
//prepare config array()
global $conf;
$conf = array();
- // load the config file(s)
- require_once(DOKU_CONF.'dokuwiki.php');
- if(@file_exists(DOKU_CONF.'local.php')){
- require_once(DOKU_CONF.'local.php');
+ // load the global config file(s)
+ foreach ($config_cascade['main'] as $config_group) {
+ foreach ($config_group as $config_file) {
+ @include($config_file);
+ }
}
//prepare language array
diff --git a/lib/plugins/config/settings/config.class.php b/lib/plugins/config/settings/config.class.php
index 011335913..8610f2c81 100644
--- a/lib/plugins/config/settings/config.class.php
+++ b/lib/plugins/config/settings/config.class.php
@@ -18,16 +18,18 @@ if (!class_exists('configuration')) {
var $setting = array(); // array of setting objects
var $locked = false; // configuration is considered locked if it can't be updated
- // filenames, these will be eval()'d prior to use so maintain any constants in output
- var $_default_file = '';
- var $_local_file = '';
- var $_protected_file = '';
+ // configuration filenames
+ var $_default_files = array();
+ var $_local_files = array(); // updated configuration is written to the first file
+ var $_protected_files = array();
+
+ var $_plugin_list = null;
/**
* constructor
*/
function configuration($datafile) {
- global $conf;
+ global $conf, $config_cascade;
if (!@file_exists($datafile)) {
msg('No configuration metadata found at - '.htmlspecialchars($datafile),-1);
@@ -39,9 +41,13 @@ if (!class_exists('configuration')) {
if (isset($config['format'])) $this->_format = $config['format'];
if (isset($config['heading'])) $this->_heading = $config['heading'];
- if (isset($file['default'])) $this->_default_file = $file['default'];
- if (isset($file['local'])) $this->_local_file = $file['local'];
- if (isset($file['protected'])) $this->_protected_file = $file['protected'];
+ $this->_default_files = $config_cascade['main']['default'];
+ $this->_local_files = $config_cascade['main']['local'];
+ $this->_protected_files = $config_cascade['main']['protected'];
+
+# if (isset($file['default'])) $this->_default_file = $file['default'];
+# if (isset($file['local'])) $this->_local_file = $file['local'];
+# if (isset($file['protected'])) $this->_protected_file = $file['protected'];
$this->locked = $this->_is_locked();
@@ -55,9 +61,9 @@ if (!class_exists('configuration')) {
$no_default_check = array('setting_fieldset', 'setting_undefined', 'setting_no_class');
if (!$this->_loaded) {
- $default = array_merge($this->_read_config($this->_default_file), $this->get_plugintpl_default($conf['template']));
- $local = $this->_read_config($this->_local_file);
- $protected = $this->_read_config($this->_protected_file);
+ $default = array_merge($this->get_plugintpl_default($conf['template']), $this->_read_config_group($this->_default_files));
+ $local = $this->_read_config_group($this->_local_files);
+ $protected = $this->_read_config_group($this->_protected_files);
$keys = array_merge(array_keys($this->_metadata),array_keys($default), array_keys($local), array_keys($protected));
$keys = array_unique($keys);
@@ -93,7 +99,8 @@ if (!class_exists('configuration')) {
if ($this->locked) return false;
- $file = eval('return '.$this->_local_file.';');
+# $file = eval('return '.$this->_local_file.';');
+ $file = $this->_local_files[0];
// backup current file (remove any existing backup)
if (@file_exists($file) && $backup) {
@@ -120,6 +127,15 @@ if (!class_exists('configuration')) {
fclose($fh);
return true;
}
+
+ function _read_config_group($files) {
+ $config = array();
+ foreach ($files as $file) {
+ $config = array_merge($config, $this->_read_config($file));
+ }
+
+ return $config;
+ }
/**
* return an array of config settings
@@ -129,7 +145,7 @@ if (!class_exists('configuration')) {
if (!$file) return array();
$config = array();
- $file = eval('return '.$file.';');
+# $file = eval('return '.$file.';');
if ($this->_format == 'php') {
@@ -177,9 +193,9 @@ if (!class_exists('configuration')) {
function _out_footer() {
$out = '';
if ($this->_format == 'php') {
- if ($this->_protected_file) {
- $out .= "\n@include(".$this->_protected_file.");\n";
- }
+ # if ($this->_protected_file) {
+ # $out .= "\n@include(".$this->_protected_file.");\n";
+ # }
$out .= "\n// end auto-generated content\n";
}
@@ -189,9 +205,10 @@ if (!class_exists('configuration')) {
// configuration is considered locked if there is no local settings filename
// or the directory its in is not writable or the file exists and is not writable
function _is_locked() {
- if (!$this->_local_file) return true;
+ if (!$this->_local_files) return true;
- $local = eval('return '.$this->_local_file.';');
+# $local = eval('return '.$this->_local_file.';');
+ $local = $this->_local_files[0];
if (!is_writable(dirname($local))) return true;
if (@file_exists($local) && !is_writable($local)) return true;
diff --git a/lib/plugins/config/settings/config.metadata.php b/lib/plugins/config/settings/config.metadata.php
index dbca49f84..8c856af1b 100644
--- a/lib/plugins/config/settings/config.metadata.php
+++ b/lib/plugins/config/settings/config.metadata.php
@@ -64,11 +64,13 @@ $config['varname'] = 'conf'; // name of the config variable, sans $
// this value can be overriden when calling save_settings() method
$config['heading'] = 'Dokuwiki\'s Main Configuration File - Local Settings';
+/* DEPRECATED
// ---------------[ setting files ]--------------------------------------
// these values can be string expressions, they will be eval'd before use
$file['local'] = "DOKU_CONF.'local.php'"; // mandatory (file doesn't have to exist)
$file['default'] = "DOKU_CONF.'dokuwiki.php'"; // optional
$file['protected'] = "DOKU_CONF.'local.protected.php'"; // optional
+ */
// test value (FIXME, remove before publishing)
//$meta['test'] = array('multichoice','_choices' => array(''));