xref: /dokuwiki/lib/plugins/config/core/Loader.php (revision 4667676ba003110a7962f4c0611a71c0d627b581)
1<?php
2
3namespace dokuwiki\plugin\config\core;
4
5/**
6 * Configuration loader
7 *
8 * Loads configuration meta data and settings from the various files. Honors the
9 * configuration cascade and installed plugins.
10 */
11class Loader {
12    /** @var ConfigParser */
13    protected $parser;
14
15    /** @var string[] list of enabled plugins */
16    protected $plugins;
17    /** @var string current template */
18    protected $template;
19
20    /**
21     * Loader constructor.
22     * @param ConfigParser $parser
23     * @triggers PLUGIN_CONFIG_PLUGINLIST
24     */
25    public function __construct(ConfigParser $parser) {
26        global $conf;
27        $this->parser = $parser;
28        $this->plugins = plugin_list();
29        $this->template = $conf['template'];
30        // allow plugins to remove configurable plugins
31        trigger_event('PLUGIN_CONFIG_PLUGINLIST', $this->plugins);
32    }
33
34    /**
35     * Read the settings meta data
36     *
37     * Reads the main file, plugins and template settings meta data
38     *
39     * @return array
40     */
41    public function loadMeta() {
42        // load main file
43        $meta = array();
44        include DOKU_PLUGIN . 'config/settings/config.metadata.php';
45
46        // plugins
47        foreach($this->plugins as $plugin) {
48            $meta = array_merge(
49                $meta,
50                $this->loadExtensionMeta(
51                    DOKU_PLUGIN . $plugin . '/conf/metadata.php',
52                    'plugin',
53                    $plugin
54                )
55            );
56        }
57
58        // current template
59        $meta = array_merge(
60            $meta,
61            $this->loadExtensionMeta(
62                tpl_incdir() . '/conf/metadata.php',
63                'tpl',
64                $this->template
65            )
66        );
67
68        return $meta;
69    }
70
71    /**
72     * Read the default values
73     *
74     * Reads the main file, plugins and template defaults
75     *
76     * @return array
77     */
78    public function loadDefaults() {
79        // load main files
80        global $config_cascade;
81        $conf = $this->loadConfigs($config_cascade['main']['default']);
82
83        // plugins
84        foreach($this->plugins as $plugin) {
85            $conf = array_merge(
86                $conf,
87                $this->loadExtensionConf(
88                    DOKU_PLUGIN . $plugin . '/conf/default.php',
89                    'plugin',
90                    $plugin
91                )
92            );
93        }
94
95        // current template
96        $conf = array_merge(
97            $conf,
98            $this->loadExtensionConf(
99                tpl_incdir() . '/conf/default.php',
100                'tpl',
101                $this->template
102            )
103        );
104
105        return $conf;
106    }
107
108    /**
109     * Reads the language strings
110     *
111     * Only reads extensions, main one is loaded the usual way
112     *
113     * @return array
114     */
115    public function loadLangs() {
116        $lang = array();
117
118        // plugins
119        foreach($this->plugins as $plugin) {
120            $lang = array_merge(
121                $lang,
122                $this->loadExtensionLang(
123                    DOKU_PLUGIN . $plugin . '/',
124                    'plugin',
125                    $plugin
126                )
127            );
128        }
129
130        // current template
131        $lang = array_merge(
132            $lang,
133            $this->loadExtensionLang(
134                tpl_incdir() . '/',
135                'tpl',
136                $this->template
137            )
138        );
139
140        return $lang;
141    }
142
143    /**
144     * Read the local settings
145     *
146     * @return array
147     */
148    public function loadLocal() {
149        global $config_cascade;
150        return $this->loadConfigs($config_cascade['main']['local']);
151    }
152
153    /**
154     * Read the protected settings
155     *
156     * @return array
157     */
158    public function loadProtected() {
159        global $config_cascade;
160        return $this->loadConfigs($config_cascade['main']['protected']);
161    }
162
163    /**
164     * Read the config values from the given files
165     *
166     * @param string[] $files paths to config php's
167     * @return array
168     */
169    protected function loadConfigs($files) {
170        $conf = array();
171        foreach($files as $file) {
172            $conf = array_merge($conf, $this->parser->parse($file));
173        }
174        return $conf;
175    }
176
177    /**
178     * Read settings file from an extension
179     *
180     * This is used to read the settings.php files of plugins and templates
181     *
182     * @param string $file php file to read
183     * @param string $type should be 'plugin' or 'tpl'
184     * @param string $extname name of the extension
185     * @return array
186     */
187    protected function loadExtensionMeta($file, $type, $extname) {
188        if(!file_exists($file)) return array();
189        $prefix = $type . Configuration::KEYMARKER . $extname . Configuration::KEYMARKER;
190
191        // include file
192        $meta = array();
193        include $file;
194        if(empty($meta)) return array();
195
196        // read data
197        $data = array();
198        $data[$prefix . $type . '_settings_name'] = ['fieldset'];
199        foreach($meta as $key => $value) {
200            if($value[0] == 'fieldset') continue; //plugins only get one fieldset
201            $data[$prefix . $key] = $value;
202        }
203
204        return $data;
205    }
206
207    /**
208     * Read a default file from an extension
209     *
210     * This is used to read the default.php files of plugins and templates
211     *
212     * @param string $file php file to read
213     * @param string $type should be 'plugin' or 'tpl'
214     * @param string $extname name of the extension
215     * @return array
216     */
217    protected function loadExtensionConf($file, $type, $extname) {
218        if(!file_exists($file)) return array();
219        $prefix = $type . Configuration::KEYMARKER . $extname . Configuration::KEYMARKER;
220
221        // parse file
222        $conf = $this->parser->parse($file);
223        if(empty($conf)) return array();
224
225        // read data
226        $data = array();
227        foreach($conf as $key => $value) {
228            $data[$prefix . $key] = $value;
229        }
230
231        return $data;
232    }
233
234    /**
235     * Read the language file of an extension
236     *
237     * @param string $dir directory of the extension
238     * @param string $type should be 'plugin' or 'tpl'
239     * @param string $extname name of the extension
240     * @return array
241     */
242    protected function loadExtensionLang($dir, $type, $extname) {
243        global $conf;
244        $ll = $conf['lang'];
245        $prefix = $type . Configuration::KEYMARKER . $extname . Configuration::KEYMARKER;
246
247        // include files
248        $lang = array();
249        if(file_exists($dir . 'lang/en/settings.php')) {
250            include $dir . 'lang/en/settings.php';
251        }
252        if($ll != 'en' && file_exists($dir . 'lang/' . $ll . '/settings.php')) {
253            include $dir . 'lang/' . $ll . '/settings.php';
254        }
255
256        // set up correct keys
257        $strings = array();
258        foreach($lang as $key => $val) {
259            $strings[$prefix . $key] = $val;
260        }
261
262        // add fieldset key
263        $strings[$prefix . $type . '_settings_name'] = ucwords(str_replace('_', ' ', $extname));
264
265        return $strings;
266    }
267}
268