root/trunk/lib/SGL/Config.php

Revision 2282, 7.6 kB (checked in by demian, 9 months ago)

implemented SGL_Config::remove, and ability for module uninstaller to remove config keys

  • Property svn:eol-style set to native
Line 
1 <?php
2
3 /* Reminder: always indent with 4 spaces (no tabs). */
4 // +---------------------------------------------------------------------------+
5 // | Copyright (c) 2006, Demian Turner                                         |
6 // | All rights reserved.                                                      |
7 // |                                                                           |
8 // | Redistribution and use in source and binary forms, with or without        |
9 // | modification, are permitted provided that the following conditions        |
10 // | are met:                                                                  |
11 // |                                                                           |
12 // | o Redistributions of source code must retain the above copyright          |
13 // |   notice, this list of conditions and the following disclaimer.           |
14 // | o Redistributions in binary form must reproduce the above copyright       |
15 // |   notice, this list of conditions and the following disclaimer in the     |
16 // |   documentation and/or other materials provided with the distribution.    |
17 // | o The names of the authors may not be used to endorse or promote          |
18 // |   products derived from this software without specific prior written      |
19 // |   permission.                                                             |
20 // |                                                                           |
21 // | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS       |
22 // | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT         |
23 // | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR     |
24 // | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT      |
25 // | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,     |
26 // | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT          |
27 // | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,     |
28 // | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     |
29 // | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       |
30 // | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE     |
31 // | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.      |
32 // |                                                                           |
33 // +---------------------------------------------------------------------------+
34 // | Seagull 0.6                                                               |
35 // +---------------------------------------------------------------------------+
36 // | Config.php                                                                |
37 // +---------------------------------------------------------------------------+
38 // | Author:   Demian Turner <demian@phpkitchen.com>                           |
39 // +---------------------------------------------------------------------------+
40 // $Id: Controller.php,v 1.49 2005/06/23 19:15:25 demian Exp $
41
42 /**
43  * Config file parsing and handling, acts as a registry for config data.
44  *
45  * @package SGL
46  * @author  Demian Turner <demian@phpkitchen.com>
47  * @version $Revision: 1.5 $
48  */
49 class SGL_Config
50 {
51     var $aProps = array();
52     var $fileName;
53
54     function SGL_Config($autoLoad = true)
55     {
56         if ($this->isEmpty() && $autoLoad) {
57             $configFile = SGL_VAR_DIR  . '/'
58                 . SGL_Task_SetupPaths::hostnameToFilename() . '.conf.php';
59             $conf = $this->load($configFile);
60             $this->fileName = $configFile;
61             $this->replace($conf);
62         }
63     }
64
65     function &singleton($autoLoad = true)
66     {
67         static $instance;
68         if (!isset($instance)) {
69             $class = __CLASS__;
70             $instance = new $class($autoLoad);
71         }
72         return $instance;
73     }
74
75     function get($key)
76     {
77         if (is_array($key)) {
78             $key1 = key($key);
79             $key2 = $key[$key1];
80             return $this->aProps[$key1][$key2];
81         } else {
82             return $this->aProps[$key];
83         }
84     }
85
86     function set($key, $value)
87     {
88         if (isset($this->aProps[$key])
89                 && is_array($this->aProps[$key])
90                 && is_array($value)) {
91             $key2 = key($value);
92             $this->aProps[$key][$key2] = $value[$key2];
93         } else {
94             $this->aProps[$key] = $value;
95         }
96     }
97
98     /**
99      * Remove a config key, save() must be used to persist changes.
100      *
101      * To remove the key $conf['site']['blocksEnabled'] = true, you would use
102      * $c->remove(array('site', 'blocksEnabled').
103      *
104      * @param array $aKey   A 2 element array: element one for the section, element
105      *                      2 for the section key.
106      * @return mixed
107      */
108     function remove($aKey)
109     {
110         if (!is_array($aKey)) {
111             return SGL::raiseError('Array arg expected',
112                 SGL_ERROR_INVALIDARGS);
113         }
114         list($key1, $key2) = $aKey;
115         unset($this->aProps[$key1][$key2]);
116         return true;
117     }
118
119     function replace($aConf)
120     {
121         $this->aProps = $aConf;
122     }
123
124     /**
125      * Return an array of all Config properties.
126      *
127      * @return array
128      */
129     function getAll()
130     {
131         return $this->aProps;
132     }
133
134     function getFileName()
135     {
136         return $this->fileName;
137     }
138
139     function load($file)
140     {
141         $ph = &SGL_ParamHandler::singleton($file);
142         $data = $ph->read();
143         if ($data !== false) {
144             return $data;
145         } else {
146             if (defined('SGL_INITIALISED')) {
147                 return SGL::raiseError('Problem reading config file',
148                     SGL_ERROR_INVALIDFILEPERMS);
149             } else {
150                 SGL::displayStaticPage('No global config file could be found');
151             }
152         }
153     }
154
155     function save($file)
156     {
157         $ph = &SGL_ParamHandler::singleton($file);
158         return $ph->write($this->aProps);
159     }
160
161     function merge($aConf)
162     {
163         $this->aProps = SGL_Array::mergeReplace($this->aProps, $aConf);
164     }
165
166     function isEmpty()
167     {
168         return count($this->aProps) ? false : true;
169     }
170
171     /**
172      * Ensures the module's config file was loaded and returns an array
173      * containing the global and modulde config.
174      *
175      * This is required when the homepage is set to custom mod/mgr/params,
176      * and the module config file loaded while initialising the request is
177      * not the file required for the custom invocation.
178      *
179      * @param string $moduleName
180      * @return mixed    array on success, PEAR_Error on failure
181      */
182     function ensureModuleConfigLoaded($moduleName)
183     {
184         if (!defined('SGL_MODULE_CONFIG_LOADED')
185                 || $this->aProps['localConfig']['moduleName'] != $moduleName) {
186             $path = SGL_MOD_DIR . '/' . $moduleName . '/conf.ini';
187             $modConfigPath = realpath($path);
188
189             if ($modConfigPath) {
190                 $aModuleConfig = $this->load($modConfigPath);
191
192                 if (PEAR::isError($aModuleConfig)) {
193                     $ret = $aModuleConfig;
194                 } else {
195                     //  merge local and global config
196                     $this->merge($aModuleConfig);
197
198                     //  set local config module name.
199                     $this->set('localConfig', array('moduleName' => $moduleName));
200
201                     //  return global & module config
202                     $ret = $this->getAll();
203                 }
204             } else {
205                 $ret = SGL::raiseError("Config file could not be found at '$path'",
206                     SGL_ERROR_NOFILE);
207             }
208         } else {
209             $ret = $this->getAll();
210         }
211         return $ret;
212     }
213 }
214 ?>
Note: See TracBrowser for help on using the browser.