3 +--------------------------------------------------------------------+
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2018 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
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. |
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. |
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 +--------------------------------------------------------------------+
32 * @copyright CiviCRM LLC (c) 2004-2018
36 * File contains functions used in civicrm configuration.
38 class CRM_Core_BAO_ConfigSetting
{
41 * Create civicrm settings. This is the same as add but it clears the cache and
42 * reloads the config object
44 * @param array $params
45 * Associated array of civicrm variables.
47 public static function create($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);
56 * Add civicrm settings.
58 * @param array $params
59 * Associated array of civicrm variables.
61 public static function add(&$params) {
62 $domain = new CRM_Core_DAO_Domain();
63 $domain->id
= CRM_Core_Config
::domainID();
65 if ($domain->config_backend
) {
66 $params = array_merge(unserialize($domain->config_backend
), $params);
69 $params = CRM_Core_BAO_ConfigSetting
::filterSkipVars($params);
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]);
78 $domain->config_backend
= serialize($params);
83 * Retrieve the settings values from db.
89 public static function retrieve(&$defaults) {
90 $domain = new CRM_Core_DAO_Domain();
91 $isUpgrade = CRM_Core_Config
::isUpgradeMode();
93 //we are initializing config, really can't use, CRM-7863
95 if (defined('CIVICRM_UF') && CIVICRM_UF
== 'Joomla') {
99 if ($isUpgrade && CRM_Core_DAO
::checkFieldExists('civicrm_domain', 'config_backend')) {
100 $domain->selectAdd('config_backend');
103 $domain->selectAdd('locales');
106 $domain->id
= CRM_Core_Config
::domainID();
108 if ($domain->config_backend
) {
109 $defaults = unserialize($domain->config_backend
);
110 if ($defaults === FALSE ||
!is_array($defaults)) {
115 $skipVars = self
::skipVars();
116 foreach ($skipVars as $skip) {
117 if (array_key_exists($skip, $defaults)) {
118 unset($defaults[$skip]);
123 CRM_Core_BAO_ConfigSetting
::applyLocale(Civi
::settings($domain->id
), $domain->locales
);
128 * Evaluate locale preferences and activate a chosen locale by
129 * updating session+global variables.
131 * @param \Civi\Core\SettingsBag $settings
132 * @param string $activatedLocales
133 * Imploded list of locales which are supported in the DB.
135 public static function applyLocale($settings, $activatedLocales) {
136 // are we in a multi-language setup?
137 $multiLang = $activatedLocales ?
TRUE : FALSE;
139 // set the current language
140 $chosenLocale = NULL;
142 $session = CRM_Core_Session
::singleton();
144 // on multi-lang sites based on request and civicrm_uf_match
146 $languageLimit = array();
147 if (is_array($settings->get('languageLimit'))) {
148 $languageLimit = $settings->get('languageLimit');
151 $requestLocale = CRM_Utils_Request
::retrieve('lcMessages', 'String');
152 if (in_array($requestLocale, array_keys($languageLimit))) {
153 $chosenLocale = $requestLocale;
155 //CRM-8559, cache navigation do not respect locale if it is changed, so reseting cache.
156 // Ed: This doesn't sound good.
157 CRM_Core_BAO_Cache
::deleteGroup('navigation');
160 $requestLocale = NULL;
163 if (!$requestLocale) {
164 $sessionLocale = $session->get('lcMessages');
165 if (in_array($sessionLocale, array_keys($languageLimit))) {
166 $chosenLocale = $sessionLocale;
169 $sessionLocale = NULL;
173 if ($requestLocale) {
174 $ufm = new CRM_Core_DAO_UFMatch();
175 $ufm->contact_id
= $session->get('userID');
176 if ($ufm->find(TRUE)) {
177 $ufm->language
= $chosenLocale;
180 $session->set('lcMessages', $chosenLocale);
183 if (!$chosenLocale and $session->get('userID')) {
184 $ufm = new CRM_Core_DAO_UFMatch();
185 $ufm->contact_id
= $session->get('userID');
186 if ($ufm->find(TRUE) &&
187 in_array($ufm->language
, array_keys($languageLimit))
189 $chosenLocale = $ufm->language
;
191 $session->set('lcMessages', $chosenLocale);
196 // try to inherit the language from the hosting CMS
197 if ($settings->get('inheritLocale')) {
198 // FIXME: On multilanguage installs, CRM_Utils_System::getUFLocale() in many cases returns nothing if $dbLocale is not set
199 $lcMessages = $settings->get('lcMessages');
200 $dbLocale = $multiLang && $lcMessages ?
"_{$lcMessages}" : '';
201 $chosenLocale = CRM_Utils_System
::getUFLocale();
202 if ($activatedLocales and !in_array($chosenLocale, explode(CRM_Core_DAO
::VALUE_SEPARATOR
, $activatedLocales))) {
203 $chosenLocale = NULL;
207 if (empty($chosenLocale)) {
208 //CRM-11993 - if a single-lang site, use default
209 $chosenLocale = $settings->get('lcMessages');
212 // set suffix for table names - use views if more than one language
213 $dbLocale = $multiLang && $chosenLocale ?
"_{$chosenLocale}" : '';
215 // FIXME: an ugly hack to fix CRM-4041
217 $tsLocale = $chosenLocale;
219 // FIXME: as bad aplace as any to fix CRM-5428
220 // (to be moved to a sane location along with the above)
221 if (function_exists('mb_internal_encoding')) {
222 mb_internal_encoding('UTF-8');
227 * @param array $defaultValues
232 public static function doSiteMove($defaultValues = array()) {
233 $moveStatus = ts('Beginning site move process...') . '<br />';
234 $settings = Civi
::settings();
236 foreach (array_merge(self
::getPathSettings(), self
::getUrlSettings()) as $key) {
237 $value = $settings->get($key);
238 if ($value && $value != $settings->getDefault($key)) {
239 if ($settings->getMandatory($key) === NULL) {
240 $settings->revert($key);
241 $moveStatus .= ts("WARNING: The setting (%1) has been reverted.", array(
244 $moveStatus .= '<br />';
247 $moveStatus .= ts("WARNING: The setting (%1) is overridden and could not be reverted.", array(
250 $moveStatus .= '<br />';
255 $config = CRM_Core_Config
::singleton();
257 // clear the template_c and upload directory also
258 $config->cleanup(3, TRUE);
259 $moveStatus .= ts('Template cache and upload directory have been cleared.') . '<br />';
262 CRM_Core_Config
::clearDBCache();
263 Civi
::cache('session')->clear();
264 $moveStatus .= ts('Database cache tables cleared.') . '<br />';
266 $resetSessionTable = CRM_Utils_Request
::retrieve('resetSessionTable',
268 CRM_Core_DAO
::$_nullArray,
273 if ($config->userSystem
->is_drupal
&&
276 db_query("DELETE FROM {sessions} WHERE 1");
277 $moveStatus .= ts('Drupal session table cleared.') . '<br />';
280 $session = CRM_Core_Session
::singleton();
282 $moveStatus .= ts('Session has been reset.') . '<br />';
289 * Takes a componentName and enables it in the config.
290 * Primarily used during unit testing
292 * @param string $componentName
293 * Name of the component to be enabled, needs to be valid.
296 * true if valid component name and enabling succeeds, else false
298 public static function enableComponent($componentName) {
299 $config = CRM_Core_Config
::singleton();
300 if (in_array($componentName, $config->enableComponents
)) {
301 // component is already enabled
305 // return if component does not exist
306 if (!array_key_exists($componentName, CRM_Core_Component
::getComponents())) {
310 // get enabled-components from DB and add to the list
311 $enabledComponents = Civi
::settings()->get('enable_components');
312 $enabledComponents[] = $componentName;
314 self
::setEnabledComponents($enabledComponents);
320 * Disable specified component.
322 * @param string $componentName
326 public static function disableComponent($componentName) {
327 $config = CRM_Core_Config
::singleton();
328 if (!in_array($componentName, $config->enableComponents
) ||
329 !array_key_exists($componentName, CRM_Core_Component
::getComponents())
331 // Post-condition is satisfied.
335 // get enabled-components from DB and add to the list
336 $enabledComponents = Civi
::settings()->get('enable_components');
337 $enabledComponents = array_diff($enabledComponents, array($componentName));
339 self
::setEnabledComponents($enabledComponents);
345 * Set enabled components.
347 * @param array $enabledComponents
349 public static function setEnabledComponents($enabledComponents) {
350 // fix the config object. update db.
351 Civi
::settings()->set('enable_components', $enabledComponents);
353 // also force reset of component array
354 CRM_Core_Component
::getEnabledComponents(TRUE);
360 public static function skipVars() {
363 'templateCompileDir',
366 'userFrameworkBaseURL',
367 'userFrameworkClass',
369 'userPermissionClass',
370 'userPermissionTemp',
371 'userFrameworkURLVar',
372 'userFrameworkVersion',
378 'gettextResourceDir',
381 'locale_custom_strings',
382 'localeCustomStrings',
383 'autocompleteContactSearch',
384 'autocompleteContactReference',
391 * @param array $params
394 public static function filterSkipVars($params) {
395 $skipVars = self
::skipVars();
396 foreach ($skipVars as $var) {
397 unset($params[$var]);
399 foreach (array_keys($params) as $key) {
400 if (preg_match('/^_qf_/', $key)) {
401 unset($params[$key]);
410 private static function getUrlSettings() {
412 'userFrameworkResourceURL',
422 private static function getPathSettings() {
426 'customFileUploadDir',