aboutsummaryrefslogtreecommitdiff
path: root/engine/lib/configuration.php
blob: d8c11b485802d306f7ec4b71ca658aa688549e07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
<?php
/**
 * Elgg configuration procedural code.
 *
 * Includes functions for manipulating the configuration values stored in the database
 * Plugin authors should use the {@link get_config()}, {@link set_config()},
 * and {@unset_config()} functions to access or update config values.
 *
 * Elgg's configuration is split among 2 tables and 1 file:
 * - dbprefix_config
 * - dbprefix_datalists
 * - engine/settings.php (See {@link settings.example.php})
 *
 * Upon system boot, all values in dbprefix_config are read into $CONFIG.
 *
 * @package Elgg.Core
 * @subpackage Configuration
 */

/**
 * Removes a config setting.
 *
 * @internal
 * These settings are stored in the dbprefix_config table and read during system
 * boot into $CONFIG.
 *
 * @param string $name      The name of the field.
 * @param int    $site_guid Optionally, the GUID of the site (current site is assumed by default).
 *
 * @return int|false The number of affected rows or false on error.
 *
 * @see get_config()
 * @see set_config()
 */
function unset_config($name, $site_guid = 0) {
	global $CONFIG;

	$name = sanitise_string($name);
	$site_guid = (int) $site_guid;
	if ($site_guid == 0) {
		$site_guid = (int) $CONFIG->site_id;
	}

	$query = "delete from {$CONFIG->dbprefix}config where name='$name' and site_guid=$site_guid";
	return delete_data($query);
}

/**
 * Add or update a config setting.
 *
 * If the config name already exists, it will be updated to the new value.
 *
 * @internal
 * These settings are stored in the dbprefix_config table and read during system
 * boot into $CONFIG.
 *
 * @param string $name      The name of the configuration value
 * @param string $value     Its value
 * @param int    $site_guid Optionally, the GUID of the site (current site is assumed by default)
 *
 * @return 0
 * @todo The config table doens't have numeric primary keys so insert_data returns 0.
 * @todo Use "INSERT ... ON DUPLICATE KEY UPDATE" instead of trying to delete then add.
 * @see unset_config()
 * @see get_config()
 */
function set_config($name, $value, $site_guid = 0) {
	global $CONFIG;

	// Unset existing
	unset_config($name, $site_guid);

	$site_guid = (int) $site_guid;
	if ($site_guid == 0) {
		$site_guid = (int) $CONFIG->site_id;
	}
	$CONFIG->$name = $value;
	$value = sanitise_string(serialize($value));

	$query = "insert into {$CONFIG->dbprefix}config"
		. " set name = '{$name}', value = '{$value}', site_guid = {$site_guid}";
	return insert_data($query);
}

/**
 * Gets a configuration value
 *
 * @internal
 * These settings are stored in the dbprefix_config table and read during system
 * boot into $CONFIG.
 *
 * @param string $name      The name of the config value
 * @param int    $site_guid Optionally, the GUID of the site (current site is assumed by default)
 *
 * @return mixed|false
 * @see set_config()
 * @see unset_config()
 */
function get_config($name, $site_guid = 0) {
	global $CONFIG;

	if (isset($CONFIG->$name)) {
		return $CONFIG->$name;
	}
	$name = sanitise_string($name);
	$site_guid = (int) $site_guid;
	if ($site_guid == 0) {
		$site_guid = (int) $CONFIG->site_id;
	}
	if ($result = get_data_row("SELECT value FROM {$CONFIG->dbprefix}config
		WHERE name = '{$name}' and site_guid = {$site_guid}")) {
		$result = $result->value;
		$result = unserialize($result->value);
		$CONFIG->$name = $result;
		return $result;
	}

	return false;
}

/**
 * Loads all configuration values from the dbprefix_config table into $CONFIG.
 *
 * @param int $site_guid Optionally, the GUID of the site (current site is assumed by default)
 *
 * @return bool
 */
function get_all_config($site_guid = 0) {
	global $CONFIG;

	$site_guid = (int) $site_guid;

	if ($site_guid == 0) {
		$site_guid = (int) $CONFIG->site_id;
	}

	if ($result = get_data("SELECT * from {$CONFIG->dbprefix}config where site_guid = {$site_guid}")) {
		foreach ($result as $r) {
			$name = $r->name;
			$value = $r->value;
			$CONFIG->$name = unserialize($value);
		}

		return true;
	}
	return false;
}

/**
 * Sets defaults for or attempts to autodetect some common config values and
 * loads them into $CONFIG.
 *
 * @return void
 */
function set_default_config() {
	global $CONFIG;

	if (empty($CONFIG->path)) {
		$CONFIG->path = str_replace("\\", "/", dirname(dirname(dirname(__FILE__)))) . "/";
	}

	if (empty($CONFIG->viewpath)) {
		$CONFIG->viewpath = $CONFIG->path . "views/";
	}

	if (empty($CONFIG->pluginspath)) {
		$CONFIG->pluginspath = $CONFIG->path . "mod/";
	}

	if (empty($CONFIG->wwwroot)) {
		/*
		$CONFIG->wwwroot = "http://" . $_SERVER['SERVER_NAME'];

		$request = $_SERVER['REQUEST_URI'];

		if (strripos($request,"/") < (strlen($request) - 1)) {
			// addressing a file directly, not a dir
			$request = substr($request, 0, strripos($request,"/")+1);
		}

		$CONFIG->wwwroot .= $request;
		*/
		$pathpart = str_replace("//", "/", str_replace($_SERVER['DOCUMENT_ROOT'], "", $CONFIG->path));
		if (substr($pathpart, 0, 1) != "/") {
			$pathpart = "/" . $pathpart;
		}
		$CONFIG->wwwroot = "http://" . $_SERVER['HTTP_HOST'] . $pathpart;
	}

	if (empty($CONFIG->url)) {
		$CONFIG->url = $CONFIG->wwwroot;
	}

	if (empty($CONFIG->sitename)) {
		$CONFIG->sitename = "New Elgg site";
	}

	if (empty($CONFIG->language)) {
		$CONFIG->language = "en";
	}
}

/**
 * Loads values into $CONFIG.
 *
 * If Elgg is installed, this function pulls all rows from dbprefix_config
 * and cherry picks some values from dbprefix_datalists.  This also extracts
 * some commonly used values from the default site object.
 *
 * @elgg_event boot system
 * @return true|null
 */
function configuration_init() {
	global $CONFIG;

	if (is_installed() || is_db_installed()) {
		$path = datalist_get('path');
		if (!empty($path)) {
			$CONFIG->path = $path;
		}
		$dataroot = datalist_get('dataroot');
		if (!empty($dataroot)) {
			$CONFIG->dataroot = $dataroot;
		}
		$simplecache_enabled = datalist_get('simplecache_enabled');
		if ($simplecache_enabled !== false) {
			$CONFIG->simplecache_enabled = $simplecache_enabled;
		} else {
			$CONFIG->simplecache_enabled = 1;
		}
		$viewpath_cache_enabled = datalist_get('viewpath_cache_enabled');
		if ($viewpath_cache_enabled !== false) {
			$CONFIG->viewpath_cache_enabled = $viewpath_cache_enabled;
		} else {
			$CONFIG->viewpath_cache_enabled = 1;
		}
		if (isset($CONFIG->site) && ($CONFIG->site instanceof ElggSite)) {
			$CONFIG->wwwroot = $CONFIG->site->url;
			$CONFIG->sitename = $CONFIG->site->name;
			$CONFIG->sitedescription = $CONFIG->site->description;
			$CONFIG->siteemail = $CONFIG->site->email;
		}
		$CONFIG->url = $CONFIG->wwwroot;

		// Load default settings from database
		get_all_config();

		return true;
	}
}

register_elgg_event_handler('boot', 'system', 'configuration_init', 10);