CRM-16373 - CRM_Core_BAO_ConfigSetting - Fix enableComponent
[civicrm-core.git] / CRM / Core / BAO / ConfigSetting.php
... / ...
CommitLineData
1<?php
2/*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.7 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2015 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13 | |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
26 */
27
28/**
29 *
30 *
31 * @package CRM
32 * @copyright CiviCRM LLC (c) 2004-2015
33 */
34
35/**
36 * File contains functions used in civicrm configuration.
37 */
38class CRM_Core_BAO_ConfigSetting {
39
40 /**
41 * Create civicrm settings. This is the same as add but it clears the cache and
42 * reloads the config object
43 *
44 * @param array $params
45 * Associated array of civicrm variables.
46 */
47 public static function create($params) {
48 self::add($params);
49 $cache = CRM_Utils_Cache::singleton();
50 $cache->delete('CRM_Core_Config');
51 $cache->delete('CRM_Core_Config' . CRM_Core_Config::domainID());
52 $config = CRM_Core_Config::singleton(TRUE, TRUE);
53 }
54
55 /**
56 * Add civicrm settings.
57 *
58 * @param array $params
59 * Associated array of civicrm variables.
60 */
61 public static function add(&$params) {
62 $domain = new CRM_Core_DAO_Domain();
63 $domain->id = CRM_Core_Config::domainID();
64 $domain->find(TRUE);
65 if ($domain->config_backend) {
66 $params = array_merge(unserialize($domain->config_backend), $params);
67 }
68
69 $params = CRM_Core_BAO_ConfigSetting::filterSkipVars($params);
70
71 // also skip all Dir Params, we dont need to store those in the DB!
72 foreach ($params as $name => $val) {
73 if (substr($name, -3) == 'Dir') {
74 unset($params[$name]);
75 }
76 }
77
78 $domain->config_backend = serialize($params);
79 $domain->save();
80 }
81
82 /**
83 * Retrieve the settings values from db.
84 *
85 * @param $defaults
86 *
87 * @return array
88 */
89 public static function retrieve(&$defaults) {
90 $domain = new CRM_Core_DAO_Domain();
91
92 //we are initializing config, really can't use, CRM-7863
93 $urlVar = 'q';
94 if (defined('CIVICRM_UF') && CIVICRM_UF == 'Joomla') {
95 $urlVar = 'task';
96 }
97
98 if (CRM_Core_Config::isUpgradeMode()) {
99 $domain->selectAdd('config_backend');
100 }
101 else {
102 $domain->selectAdd('config_backend, locales');
103 }
104
105 $domain->id = CRM_Core_Config::domainID();
106 $domain->find(TRUE);
107 if ($domain->config_backend) {
108 $defaults = unserialize($domain->config_backend);
109 if ($defaults === FALSE || !is_array($defaults)) {
110 $defaults = array();
111 return FALSE;
112 }
113
114 $skipVars = self::skipVars();
115 foreach ($skipVars as $skip) {
116 if (array_key_exists($skip, $defaults)) {
117 unset($defaults[$skip]);
118 }
119 }
120
121 CRM_Core_BAO_ConfigSetting::applyLocale(Civi::settings($domain->id), $domain->locales);
122 }
123 }
124
125 /**
126 * Evaluate locale preferences and activate a chosen locale by
127 * updating session+global variables.
128 *
129 * @param \Civi\Core\SettingsBag $settings
130 * @param string $activatedLocales
131 * Imploded list of locales which are supported in the DB.
132 */
133 public static function applyLocale($settings, $activatedLocales) {
134 // are we in a multi-language setup?
135 $multiLang = $activatedLocales ? TRUE : FALSE;
136
137 // set the current language
138 $chosenLocale = NULL;
139
140 $session = CRM_Core_Session::singleton();
141
142 // on multi-lang sites based on request and civicrm_uf_match
143 if ($multiLang) {
144 $languageLimit = array();
145 if (is_array($settings->get('languageLimit'))) {
146 $languageLimit = $settings->get('languageLimit');
147 }
148
149 $requestLocale = CRM_Utils_Request::retrieve('lcMessages', 'String');
150 if (in_array($requestLocale, array_keys($languageLimit))) {
151 $chosenLocale = $requestLocale;
152
153 //CRM-8559, cache navigation do not respect locale if it is changed, so reseting cache.
154 // Ed: This doesn't sound good.
155 CRM_Core_BAO_Cache::deleteGroup('navigation');
156 }
157 else {
158 $requestLocale = NULL;
159 }
160
161 if (!$requestLocale) {
162 $sessionLocale = $session->get('lcMessages');
163 if (in_array($sessionLocale, array_keys($languageLimit))) {
164 $chosenLocale = $sessionLocale;
165 }
166 else {
167 $sessionLocale = NULL;
168 }
169 }
170
171 if ($requestLocale) {
172 $ufm = new CRM_Core_DAO_UFMatch();
173 $ufm->contact_id = $session->get('userID');
174 if ($ufm->find(TRUE)) {
175 $ufm->language = $chosenLocale;
176 $ufm->save();
177 }
178 $session->set('lcMessages', $chosenLocale);
179 }
180
181 if (!$chosenLocale and $session->get('userID')) {
182 $ufm = new CRM_Core_DAO_UFMatch();
183 $ufm->contact_id = $session->get('userID');
184 if ($ufm->find(TRUE) &&
185 in_array($ufm->language, array_keys($languageLimit))
186 ) {
187 $chosenLocale = $ufm->language;
188 }
189 $session->set('lcMessages', $chosenLocale);
190 }
191 }
192 global $dbLocale;
193
194 // try to inherit the language from the hosting CMS
195 if ($settings->get('inheritLocale')) {
196 // FIXME: On multilanguage installs, CRM_Utils_System::getUFLocale() in many cases returns nothing if $dbLocale is not set
197 $dbLocale = $multiLang ? ("_" . $settings->get('lcMessages')) : '';
198 $chosenLocale = CRM_Utils_System::getUFLocale();
199 if ($activatedLocales and !in_array($chosenLocale, explode(CRM_Core_DAO::VALUE_SEPARATOR, $activatedLocales))) {
200 $chosenLocale = NULL;
201 }
202 }
203
204 if (empty($chosenLocale)) {
205 //CRM-11993 - if a single-lang site, use default
206 $chosenLocale = $settings->get('lcMessages');
207 }
208
209 // set suffix for table names - use views if more than one language
210 $dbLocale = $multiLang ? "_{$chosenLocale}" : '';
211
212 // FIXME: an ugly hack to fix CRM-4041
213 global $tsLocale;
214 $tsLocale = $chosenLocale;
215
216 // FIXME: as bad aplace as any to fix CRM-5428
217 // (to be moved to a sane location along with the above)
218 if (function_exists('mb_internal_encoding')) {
219 mb_internal_encoding('UTF-8');
220 }
221 }
222
223 /**
224 * @param array $defaultValues
225 *
226 * @return string
227 * @throws Exception
228 */
229 public static function doSiteMove($defaultValues = array()) {
230 $moveStatus = ts('Beginning site move process...') . '<br />';
231 $settings = Civi::settings();
232
233 foreach (array_merge(self::getPathSettings(), self::getUrlSettings()) as $key) {
234 $value = $settings->get($key);
235 if ($value && $value != $settings->getDefault($key)) {
236 if ($settings->getMandatory($key) === NULL) {
237 $settings->revert($key);
238 $moveStatus .= ts("WARNING: The setting (%1) has been reverted.", array(
239 1 => $key,
240 ));
241 $moveStatus .= '<br />';
242 }
243 else {
244 $moveStatus .= ts("WARNING: The setting (%1) is overridden and could not be reverted.", array(
245 1 => $key,
246 ));
247 $moveStatus .= '<br />';
248 }
249 }
250 }
251
252 $config = CRM_Core_Config::singleton();
253
254 // clear the template_c and upload directory also
255 $config->cleanup(3, TRUE);
256 $moveStatus .= ts('Template cache and upload directory have been cleared.') . '<br />';
257
258 // clear all caches
259 CRM_Core_Config::clearDBCache();
260 $moveStatus .= ts('Database cache tables cleared.') . '<br />';
261
262 $resetSessionTable = CRM_Utils_Request::retrieve('resetSessionTable',
263 'Boolean',
264 CRM_Core_DAO::$_nullArray,
265 FALSE,
266 FALSE,
267 'REQUEST'
268 );
269 if ($config->userSystem->is_drupal &&
270 $resetSessionTable
271 ) {
272 db_query("DELETE FROM {sessions} WHERE 1");
273 $moveStatus .= ts('Drupal session table cleared.') . '<br />';
274 }
275 else {
276 $session = CRM_Core_Session::singleton();
277 $session->reset(2);
278 $moveStatus .= ts('Session has been reset.') . '<br />';
279 }
280
281 return $moveStatus;
282 }
283
284 /**
285 * Takes a componentName and enables it in the config.
286 * Primarily used during unit testing
287 *
288 * @param string $componentName
289 * Name of the component to be enabled, needs to be valid.
290 *
291 * @return bool
292 * true if valid component name and enabling succeeds, else false
293 */
294 public static function enableComponent($componentName) {
295 $config = CRM_Core_Config::singleton();
296 if (in_array($componentName, $config->enableComponents)) {
297 // component is already enabled
298 return TRUE;
299 }
300
301 // return if component does not exist
302 if (!array_key_exists($componentName, CRM_Core_Component::getComponents())) {
303 return FALSE;
304 }
305
306 // get enabled-components from DB and add to the list
307 $enabledComponents = Civi::settings()->get('enable_components');
308 $enabledComponents[] = $componentName;
309
310 self::setEnabledComponents($enabledComponents);
311
312 return TRUE;
313 }
314
315 /**
316 * Disable specified component.
317 *
318 * @param string $componentName
319 *
320 * @return bool
321 */
322 public static function disableComponent($componentName) {
323 $config = CRM_Core_Config::singleton();
324 if (!in_array($componentName, $config->enableComponents) ||
325 !array_key_exists($componentName, CRM_Core_Component::getComponents())
326 ) {
327 // Post-condition is satisfied.
328 return TRUE;
329 }
330
331 // get enabled-components from DB and add to the list
332 $enabledComponents = Civi::settings()->get('enable_components');
333 $enabledComponents = array_diff($enabledComponents, array($componentName));
334
335 self::setEnabledComponents($enabledComponents);
336
337 return TRUE;
338 }
339
340 /**
341 * Set enabled components.
342 *
343 * @param array $enabledComponents
344 */
345 public static function setEnabledComponents($enabledComponents) {
346 // fix the config object. update db.
347 Civi::settings()->set('enable_components', $enabledComponents);
348
349 // also force reset of component array
350 CRM_Core_Component::getEnabledComponents(TRUE);
351 }
352
353 /**
354 * @return array
355 */
356 public static function skipVars() {
357 return array(
358 'dsn',
359 'templateCompileDir',
360 'userFrameworkDSN',
361 'userFramework',
362 'userFrameworkBaseURL',
363 'userFrameworkClass',
364 'userHookClass',
365 'userPermissionClass',
366 'userPermissionTemp',
367 'userFrameworkURLVar',
368 'userFrameworkVersion',
369 'newBaseURL',
370 'newBaseDir',
371 'newSiteName',
372 'configAndLogDir',
373 'qfKey',
374 'gettextResourceDir',
375 'cleanURL',
376 'entryURL',
377 'locale_custom_strings',
378 'localeCustomStrings',
379 'autocompleteContactSearch',
380 'autocompleteContactReference',
381 'checksumTimeout',
382 'checksum_timeout',
383 );
384 }
385
386 /**
387 * @param array $params
388 * @return array
389 */
390 public static function filterSkipVars($params) {
391 $skipVars = self::skipVars();
392 foreach ($skipVars as $var) {
393 unset($params[$var]);
394 }
395 foreach (array_keys($params) as $key) {
396 if (preg_match('/^_qf_/', $key)) {
397 unset($params[$key]);
398 }
399 }
400 return $params;
401 }
402
403 /**
404 * @return array
405 */
406 private static function getUrlSettings() {
407 return array(
408 'userFrameworkResourceURL',
409 'imageUploadURL',
410 'customCSSURL',
411 'extensionsURL',
412 );
413 }
414
415 /**
416 * @return array
417 */
418 private static function getPathSettings() {
419 return array(
420 'uploadDir',
421 'imageUploadDir',
422 'customFileUploadDir',
423 'customTemplateDir',
424 'customPHPPathDir',
425 'extensionsDir',
426 );
427 }
428
429}