16850fd4aSAndreas Gohr<?php 26850fd4aSAndreas Gohr 36850fd4aSAndreas Gohrnamespace dokuwiki\plugin\config\core; 46850fd4aSAndreas Gohr 5*cbb44eabSAndreas Gohruse dokuwiki\Extension\Event; 6*cbb44eabSAndreas Gohr 76850fd4aSAndreas Gohr/** 86850fd4aSAndreas Gohr * Configuration loader 96850fd4aSAndreas Gohr * 106850fd4aSAndreas Gohr * Loads configuration meta data and settings from the various files. Honors the 116850fd4aSAndreas Gohr * configuration cascade and installed plugins. 126850fd4aSAndreas Gohr */ 136850fd4aSAndreas Gohrclass Loader { 146850fd4aSAndreas Gohr /** @var ConfigParser */ 156850fd4aSAndreas Gohr protected $parser; 166850fd4aSAndreas Gohr 176850fd4aSAndreas Gohr /** @var string[] list of enabled plugins */ 186850fd4aSAndreas Gohr protected $plugins; 196850fd4aSAndreas Gohr /** @var string current template */ 206850fd4aSAndreas Gohr protected $template; 216850fd4aSAndreas Gohr 226850fd4aSAndreas Gohr /** 236850fd4aSAndreas Gohr * Loader constructor. 246850fd4aSAndreas Gohr * @param ConfigParser $parser 2580302b1fSAndreas Gohr * @triggers PLUGIN_CONFIG_PLUGINLIST 266850fd4aSAndreas Gohr */ 276850fd4aSAndreas Gohr public function __construct(ConfigParser $parser) { 286850fd4aSAndreas Gohr global $conf; 296850fd4aSAndreas Gohr $this->parser = $parser; 306850fd4aSAndreas Gohr $this->plugins = plugin_list(); 316850fd4aSAndreas Gohr $this->template = $conf['template']; 3280302b1fSAndreas Gohr // allow plugins to remove configurable plugins 33*cbb44eabSAndreas Gohr Event::createAndTrigger('PLUGIN_CONFIG_PLUGINLIST', $this->plugins); 346850fd4aSAndreas Gohr } 356850fd4aSAndreas Gohr 366850fd4aSAndreas Gohr /** 376850fd4aSAndreas Gohr * Read the settings meta data 386850fd4aSAndreas Gohr * 396850fd4aSAndreas Gohr * Reads the main file, plugins and template settings meta data 406850fd4aSAndreas Gohr * 416850fd4aSAndreas Gohr * @return array 426850fd4aSAndreas Gohr */ 436850fd4aSAndreas Gohr public function loadMeta() { 446850fd4aSAndreas Gohr // load main file 456850fd4aSAndreas Gohr $meta = array(); 466850fd4aSAndreas Gohr include DOKU_PLUGIN . 'config/settings/config.metadata.php'; 476850fd4aSAndreas Gohr 486850fd4aSAndreas Gohr // plugins 496850fd4aSAndreas Gohr foreach($this->plugins as $plugin) { 5091109d52SAndreas Gohr $meta = array_merge( 516850fd4aSAndreas Gohr $meta, 526850fd4aSAndreas Gohr $this->loadExtensionMeta( 5391109d52SAndreas Gohr DOKU_PLUGIN . $plugin . '/conf/metadata.php', 546850fd4aSAndreas Gohr 'plugin', 556850fd4aSAndreas Gohr $plugin 566850fd4aSAndreas Gohr ) 576850fd4aSAndreas Gohr ); 586850fd4aSAndreas Gohr } 596850fd4aSAndreas Gohr 606850fd4aSAndreas Gohr // current template 6191109d52SAndreas Gohr $meta = array_merge( 626850fd4aSAndreas Gohr $meta, 636850fd4aSAndreas Gohr $this->loadExtensionMeta( 6491109d52SAndreas Gohr tpl_incdir() . '/conf/metadata.php', 656850fd4aSAndreas Gohr 'tpl', 666850fd4aSAndreas Gohr $this->template 676850fd4aSAndreas Gohr ) 686850fd4aSAndreas Gohr ); 696850fd4aSAndreas Gohr 706850fd4aSAndreas Gohr return $meta; 716850fd4aSAndreas Gohr } 726850fd4aSAndreas Gohr 736850fd4aSAndreas Gohr /** 746850fd4aSAndreas Gohr * Read the default values 756850fd4aSAndreas Gohr * 766850fd4aSAndreas Gohr * Reads the main file, plugins and template defaults 776850fd4aSAndreas Gohr * 786850fd4aSAndreas Gohr * @return array 796850fd4aSAndreas Gohr */ 806850fd4aSAndreas Gohr public function loadDefaults() { 816850fd4aSAndreas Gohr // load main files 826850fd4aSAndreas Gohr global $config_cascade; 836850fd4aSAndreas Gohr $conf = $this->loadConfigs($config_cascade['main']['default']); 846850fd4aSAndreas Gohr 856850fd4aSAndreas Gohr // plugins 866850fd4aSAndreas Gohr foreach($this->plugins as $plugin) { 8791109d52SAndreas Gohr $conf = array_merge( 886850fd4aSAndreas Gohr $conf, 896850fd4aSAndreas Gohr $this->loadExtensionConf( 906850fd4aSAndreas Gohr DOKU_PLUGIN . $plugin . '/conf/default.php', 916850fd4aSAndreas Gohr 'plugin', 926850fd4aSAndreas Gohr $plugin 936850fd4aSAndreas Gohr ) 946850fd4aSAndreas Gohr ); 956850fd4aSAndreas Gohr } 966850fd4aSAndreas Gohr 976850fd4aSAndreas Gohr // current template 9891109d52SAndreas Gohr $conf = array_merge( 996850fd4aSAndreas Gohr $conf, 1006850fd4aSAndreas Gohr $this->loadExtensionConf( 1016850fd4aSAndreas Gohr tpl_incdir() . '/conf/default.php', 1026850fd4aSAndreas Gohr 'tpl', 1036850fd4aSAndreas Gohr $this->template 1046850fd4aSAndreas Gohr ) 1056850fd4aSAndreas Gohr ); 1066850fd4aSAndreas Gohr 1076850fd4aSAndreas Gohr return $conf; 1086850fd4aSAndreas Gohr } 1096850fd4aSAndreas Gohr 1106850fd4aSAndreas Gohr /** 1115675a07cSAndreas Gohr * Reads the language strings 1125675a07cSAndreas Gohr * 1135675a07cSAndreas Gohr * Only reads extensions, main one is loaded the usual way 1145675a07cSAndreas Gohr * 1155675a07cSAndreas Gohr * @return array 1165675a07cSAndreas Gohr */ 1175675a07cSAndreas Gohr public function loadLangs() { 1185675a07cSAndreas Gohr $lang = array(); 1195675a07cSAndreas Gohr 1205675a07cSAndreas Gohr // plugins 1215675a07cSAndreas Gohr foreach($this->plugins as $plugin) { 12291109d52SAndreas Gohr $lang = array_merge( 1235675a07cSAndreas Gohr $lang, 1245675a07cSAndreas Gohr $this->loadExtensionLang( 1255675a07cSAndreas Gohr DOKU_PLUGIN . $plugin . '/', 1265675a07cSAndreas Gohr 'plugin', 1275675a07cSAndreas Gohr $plugin 1285675a07cSAndreas Gohr ) 1295675a07cSAndreas Gohr ); 1305675a07cSAndreas Gohr } 1315675a07cSAndreas Gohr 1325675a07cSAndreas Gohr // current template 13391109d52SAndreas Gohr $lang = array_merge( 1345675a07cSAndreas Gohr $lang, 13591109d52SAndreas Gohr $this->loadExtensionLang( 1365675a07cSAndreas Gohr tpl_incdir() . '/', 1375675a07cSAndreas Gohr 'tpl', 1385675a07cSAndreas Gohr $this->template 1395675a07cSAndreas Gohr ) 1405675a07cSAndreas Gohr ); 1415675a07cSAndreas Gohr 1425675a07cSAndreas Gohr return $lang; 1435675a07cSAndreas Gohr } 1445675a07cSAndreas Gohr 1455675a07cSAndreas Gohr /** 1466850fd4aSAndreas Gohr * Read the local settings 1476850fd4aSAndreas Gohr * 1486850fd4aSAndreas Gohr * @return array 1496850fd4aSAndreas Gohr */ 1506850fd4aSAndreas Gohr public function loadLocal() { 1516850fd4aSAndreas Gohr global $config_cascade; 1526850fd4aSAndreas Gohr return $this->loadConfigs($config_cascade['main']['local']); 1536850fd4aSAndreas Gohr } 1546850fd4aSAndreas Gohr 1556850fd4aSAndreas Gohr /** 1566850fd4aSAndreas Gohr * Read the protected settings 1576850fd4aSAndreas Gohr * 1586850fd4aSAndreas Gohr * @return array 1596850fd4aSAndreas Gohr */ 1606850fd4aSAndreas Gohr public function loadProtected() { 1616850fd4aSAndreas Gohr global $config_cascade; 1626850fd4aSAndreas Gohr return $this->loadConfigs($config_cascade['main']['protected']); 1636850fd4aSAndreas Gohr } 1646850fd4aSAndreas Gohr 1656850fd4aSAndreas Gohr /** 1666850fd4aSAndreas Gohr * Read the config values from the given files 1676850fd4aSAndreas Gohr * 1686850fd4aSAndreas Gohr * @param string[] $files paths to config php's 1696850fd4aSAndreas Gohr * @return array 1706850fd4aSAndreas Gohr */ 1716850fd4aSAndreas Gohr protected function loadConfigs($files) { 1726850fd4aSAndreas Gohr $conf = array(); 1736850fd4aSAndreas Gohr foreach($files as $file) { 1746850fd4aSAndreas Gohr $conf = array_merge($conf, $this->parser->parse($file)); 1756850fd4aSAndreas Gohr } 1766850fd4aSAndreas Gohr return $conf; 1776850fd4aSAndreas Gohr } 1786850fd4aSAndreas Gohr 1796850fd4aSAndreas Gohr /** 1806850fd4aSAndreas Gohr * Read settings file from an extension 1816850fd4aSAndreas Gohr * 1826850fd4aSAndreas Gohr * This is used to read the settings.php files of plugins and templates 1836850fd4aSAndreas Gohr * 1846850fd4aSAndreas Gohr * @param string $file php file to read 1856850fd4aSAndreas Gohr * @param string $type should be 'plugin' or 'tpl' 1866850fd4aSAndreas Gohr * @param string $extname name of the extension 1876850fd4aSAndreas Gohr * @return array 1886850fd4aSAndreas Gohr */ 1896850fd4aSAndreas Gohr protected function loadExtensionMeta($file, $type, $extname) { 1906850fd4aSAndreas Gohr if(!file_exists($file)) return array(); 1916850fd4aSAndreas Gohr $prefix = $type . Configuration::KEYMARKER . $extname . Configuration::KEYMARKER; 1926850fd4aSAndreas Gohr 1936850fd4aSAndreas Gohr // include file 1946850fd4aSAndreas Gohr $meta = array(); 1956850fd4aSAndreas Gohr include $file; 1966850fd4aSAndreas Gohr if(empty($meta)) return array(); 1976850fd4aSAndreas Gohr 1986850fd4aSAndreas Gohr // read data 1996850fd4aSAndreas Gohr $data = array(); 2006850fd4aSAndreas Gohr $data[$prefix . $type . '_settings_name'] = ['fieldset']; 2016850fd4aSAndreas Gohr foreach($meta as $key => $value) { 2026850fd4aSAndreas Gohr if($value[0] == 'fieldset') continue; //plugins only get one fieldset 2036850fd4aSAndreas Gohr $data[$prefix . $key] = $value; 2046850fd4aSAndreas Gohr } 2056850fd4aSAndreas Gohr 2066850fd4aSAndreas Gohr return $data; 2076850fd4aSAndreas Gohr } 2086850fd4aSAndreas Gohr 2096850fd4aSAndreas Gohr /** 2106850fd4aSAndreas Gohr * Read a default file from an extension 2116850fd4aSAndreas Gohr * 2126850fd4aSAndreas Gohr * This is used to read the default.php files of plugins and templates 2136850fd4aSAndreas Gohr * 2146850fd4aSAndreas Gohr * @param string $file php file to read 2156850fd4aSAndreas Gohr * @param string $type should be 'plugin' or 'tpl' 2166850fd4aSAndreas Gohr * @param string $extname name of the extension 2176850fd4aSAndreas Gohr * @return array 2186850fd4aSAndreas Gohr */ 2196850fd4aSAndreas Gohr protected function loadExtensionConf($file, $type, $extname) { 2206850fd4aSAndreas Gohr if(!file_exists($file)) return array(); 2216850fd4aSAndreas Gohr $prefix = $type . Configuration::KEYMARKER . $extname . Configuration::KEYMARKER; 2226850fd4aSAndreas Gohr 2236850fd4aSAndreas Gohr // parse file 2246850fd4aSAndreas Gohr $conf = $this->parser->parse($file); 2256850fd4aSAndreas Gohr if(empty($conf)) return array(); 2266850fd4aSAndreas Gohr 2276850fd4aSAndreas Gohr // read data 2286850fd4aSAndreas Gohr $data = array(); 2296850fd4aSAndreas Gohr foreach($conf as $key => $value) { 2306850fd4aSAndreas Gohr $data[$prefix . $key] = $value; 2316850fd4aSAndreas Gohr } 2326850fd4aSAndreas Gohr 2336850fd4aSAndreas Gohr return $data; 2346850fd4aSAndreas Gohr } 2355675a07cSAndreas Gohr 2365675a07cSAndreas Gohr /** 2375675a07cSAndreas Gohr * Read the language file of an extension 2385675a07cSAndreas Gohr * 2395675a07cSAndreas Gohr * @param string $dir directory of the extension 2405675a07cSAndreas Gohr * @param string $type should be 'plugin' or 'tpl' 2415675a07cSAndreas Gohr * @param string $extname name of the extension 2425675a07cSAndreas Gohr * @return array 2435675a07cSAndreas Gohr */ 2445675a07cSAndreas Gohr protected function loadExtensionLang($dir, $type, $extname) { 2455675a07cSAndreas Gohr global $conf; 2465675a07cSAndreas Gohr $ll = $conf['lang']; 2475675a07cSAndreas Gohr $prefix = $type . Configuration::KEYMARKER . $extname . Configuration::KEYMARKER; 2485675a07cSAndreas Gohr 2495675a07cSAndreas Gohr // include files 2505675a07cSAndreas Gohr $lang = array(); 2515675a07cSAndreas Gohr if(file_exists($dir . 'lang/en/settings.php')) { 2525675a07cSAndreas Gohr include $dir . 'lang/en/settings.php'; 2535675a07cSAndreas Gohr } 2545675a07cSAndreas Gohr if($ll != 'en' && file_exists($dir . 'lang/' . $ll . '/settings.php')) { 2555675a07cSAndreas Gohr include $dir . 'lang/' . $ll . '/settings.php'; 2565675a07cSAndreas Gohr } 2575675a07cSAndreas Gohr 2585675a07cSAndreas Gohr // set up correct keys 2595675a07cSAndreas Gohr $strings = array(); 2605675a07cSAndreas Gohr foreach($lang as $key => $val) { 2615675a07cSAndreas Gohr $strings[$prefix . $key] = $val; 2625675a07cSAndreas Gohr } 2635675a07cSAndreas Gohr 2645675a07cSAndreas Gohr // add fieldset key 265d6fc72e1SAndreas Gohr $strings[$prefix . $type . '_settings_name'] = ucwords(str_replace('_', ' ', $extname)); 2665675a07cSAndreas Gohr 2675675a07cSAndreas Gohr return $strings; 2685675a07cSAndreas Gohr } 2696850fd4aSAndreas Gohr} 270