3 +--------------------------------------------------------------------+
4 | Copyright CiviCRM LLC. All rights reserved. |
6 | This work is published under the GNU AGPLv3 license with some |
7 | permitted exceptions and without any warranty. For full license |
8 | and copyright information, see https://civicrm.org/licensing |
9 +--------------------------------------------------------------------+
16 * @copyright CiviCRM LLC https://civicrm.org/licensing
20 * File contains functions used in civicrm configuration.
22 class CRM_Core_BAO_ConfigSetting
{
25 * Create civicrm settings. This is the same as add but it clears the cache and
26 * reloads the config object
28 * @param array $params
29 * Associated array of civicrm variables.
31 public static function create($params) {
33 $cache = CRM_Utils_Cache
::singleton();
34 $cache->delete('CRM_Core_Config');
35 $cache->delete('CRM_Core_Config' . CRM_Core_Config
::domainID());
36 $config = CRM_Core_Config
::singleton(TRUE, TRUE);
40 * Add civicrm settings.
42 * @param array $params
43 * Associated array of civicrm variables.
45 * This method was historically used to access civicrm_domain.config_backend.
46 * However, that has been fully replaced by the settings system since v4.7.
48 public static function add(&$params) {
49 $domain = new CRM_Core_DAO_Domain();
50 $domain->id
= CRM_Core_Config
::domainID();
52 if ($domain->config_backend
) {
53 $params = array_merge(unserialize($domain->config_backend
), $params);
56 $params = CRM_Core_BAO_ConfigSetting
::filterSkipVars($params);
58 // also skip all Dir Params, we dont need to store those in the DB!
59 foreach ($params as $name => $val) {
60 if (substr($name, -3) == 'Dir') {
61 unset($params[$name]);
65 $domain->config_backend
= serialize($params);
70 * Retrieve the settings values from db.
76 * This method was historically used to access civicrm_domain.config_backend.
77 * However, that has been fully replaced by the settings system since v4.7.
79 public static function retrieve(&$defaults) {
80 $domain = new CRM_Core_DAO_Domain();
81 $isUpgrade = CRM_Core_Config
::isUpgradeMode();
83 //we are initializing config, really can't use, CRM-7863
85 if (defined('CIVICRM_UF') && CIVICRM_UF
== 'Joomla') {
89 $hasBackend = CRM_Core_BAO_SchemaHandler
::checkIfFieldExists('civicrm_domain', 'config_backend');
90 if ($isUpgrade && $hasBackend) {
91 $domain->selectAdd('config_backend');
94 $domain->selectAdd('locales');
97 $domain->id
= CRM_Core_Config
::domainID();
99 if ($hasBackend && $domain->config_backend
) {
100 // This whole branch can probably be removed; the transitional loading
101 // is in SettingBag::loadValues(). Moreover, since 4.7.alpha1 dropped
102 // the column, anyone calling ::retrieve() has likely not gotten any data.
103 $defaults = unserialize($domain->config_backend
);
104 if ($defaults === FALSE ||
!is_array($defaults)) {
109 $skipVars = self
::skipVars();
110 foreach ($skipVars as $skip) {
111 if (array_key_exists($skip, $defaults)) {
112 unset($defaults[$skip]);
117 CRM_Core_BAO_ConfigSetting
::applyLocale(Civi
::settings($domain->id
), $domain->locales
);
122 * Activate a chosen locale.
124 * The locale is set by updating the session and global variables.
126 * When there is a choice of permitted languages (set on the "Administer" ->
127 * "Localisation" -> "Languages, Currency, Locations" screen) the locale to
128 * be applied can come from a variety of sources. The list below is the order
129 * of priority for deciding which of the sources "wins":
131 * - The request - when the "lcMessages" query variable is present in the URL.
132 * - The session - when the "lcMessages" session variable has been set.
133 * - Inherited from the CMS - when the "inheritLocale" setting is set.
134 * - CiviCRM settings - the fallback when none of the above set the locale.
136 * Single-language installs skip this and always set the default locale.
138 * @param \Civi\Core\SettingsBag $settings
139 * @param string $activatedLocales
140 * Imploded list of locales which are supported in the DB.
142 public static function applyLocale($settings, $activatedLocales) {
144 // Declare access to locale globals.
145 global $dbLocale, $tsLocale;
147 // Grab session reference.
148 $session = CRM_Core_Session
::singleton();
150 // Set flag for multi-language setup.
151 $multiLang = (bool) $activatedLocales;
153 // Initialise the default and chosen locales.
154 $defaultLocale = $settings->get('lcMessages');
155 $chosenLocale = NULL;
157 // When there is a choice of permitted languages.
158 $permittedLanguages = CRM_Core_I18n
::uiLanguages(TRUE);
159 if (count($permittedLanguages) >= 2) {
161 // Is the "lcMessages" query variable present in the URL?
162 $requestLocale = CRM_Utils_Request
::retrieve('lcMessages', 'String');
163 if (in_array($requestLocale, $permittedLanguages)) {
164 $chosenLocale = $requestLocale;
167 // Check the session if the chosen locale hasn't been set yet.
168 if (empty($chosenLocale)) {
169 $sessionLocale = $session->get('lcMessages');
170 if (in_array($sessionLocale, $permittedLanguages)) {
171 $chosenLocale = $sessionLocale;
176 * Maybe inherit the language from the CMS.
178 * If the language is specified via "lcMessages" we skip this, since the
179 * intention of the URL query var is to override all other sources.
181 if ($settings->get('inheritLocale')) {
184 * FIXME: On multi-language installs, CRM_Utils_System::getUFLocale() in
185 * many cases returns nothing if $dbLocale is not set, so set it to the
186 * default - even if it's overridden later.
188 $dbLocale = $multiLang && $defaultLocale ?
"_{$defaultLocale}" : '';
190 // Retrieve locale as reported by CMS.
191 $cmsLocale = CRM_Utils_System
::getUFLocale();
192 if (in_array($cmsLocale, $permittedLanguages)) {
193 $chosenLocale = $cmsLocale;
196 // Clear chosen locale if not activated in multi-language CiviCRM.
197 if ($activatedLocales && !in_array($chosenLocale, explode(CRM_Core_DAO
::VALUE_SEPARATOR
, $activatedLocales))) {
198 $chosenLocale = NULL;
203 // Assign the system default if the chosen locale hasn't been set.
204 if (empty($chosenLocale)) {
205 $chosenLocale = $defaultLocale;
208 // Always assign the chosen locale to the session.
209 $session->set('lcMessages', $chosenLocale);
214 // CRM-11993 - Use default when it's a single-language install.
215 $chosenLocale = $defaultLocale;
220 * Set suffix for table names in multi-language installs.
221 * Use views if more than one language.
223 $dbLocale = $multiLang && $chosenLocale ?
"_{$chosenLocale}" : '';
225 // FIXME: an ugly hack to fix CRM-4041.
226 $tsLocale = $chosenLocale;
229 * FIXME: as bad a place as any to fix CRM-5428.
230 * (to be moved to a sane location along with the above)
232 if (function_exists('mb_internal_encoding')) {
233 mb_internal_encoding('UTF-8');
239 * @param array $defaultValues
244 public static function doSiteMove($defaultValues = []) {
245 $moveStatus = ts('Beginning site move process...') . '<br />';
246 $settings = Civi
::settings();
248 foreach (array_merge(self
::getPathSettings(), self
::getUrlSettings()) as $key) {
249 $value = $settings->get($key);
250 if ($value && $value != $settings->getDefault($key)) {
251 if ($settings->getMandatory($key) === NULL) {
252 $settings->revert($key);
253 $moveStatus .= ts("WARNING: The setting (%1) has been reverted.", [
256 $moveStatus .= '<br />';
259 $moveStatus .= ts("WARNING: The setting (%1) is overridden and could not be reverted.", [
262 $moveStatus .= '<br />';
267 $config = CRM_Core_Config
::singleton();
269 // clear the template_c and upload directory also
270 $config->cleanup(3, TRUE);
271 $moveStatus .= ts('Template cache and upload directory have been cleared.') . '<br />';
274 CRM_Core_Config
::clearDBCache();
275 Civi
::cache('session')->clear();
276 $moveStatus .= ts('Database cache tables cleared.') . '<br />';
278 $resetSessionTable = CRM_Utils_Request
::retrieve('resetSessionTable',
280 CRM_Core_DAO
::$_nullArray,
284 if ($config->userSystem
->is_drupal
&&
287 db_query("DELETE FROM {sessions} WHERE 1");
288 $moveStatus .= ts('Drupal session table cleared.') . '<br />';
291 $session = CRM_Core_Session
::singleton();
293 $moveStatus .= ts('Session has been reset.') . '<br />';
300 * Takes a componentName and enables it in the config.
301 * Primarily used during unit testing
303 * @param string $componentName
304 * Name of the component to be enabled, needs to be valid.
307 * true if valid component name and enabling succeeds, else false
309 public static function enableComponent($componentName) {
310 $config = CRM_Core_Config
::singleton();
311 if (in_array($componentName, $config->enableComponents
)) {
312 // component is already enabled
316 // return if component does not exist
317 if (!array_key_exists($componentName, CRM_Core_Component
::getComponents())) {
321 // get enabled-components from DB and add to the list
322 $enabledComponents = Civi
::settings()->get('enable_components');
323 $enabledComponents[] = $componentName;
325 self
::setEnabledComponents($enabledComponents);
331 * Disable specified component.
333 * @param string $componentName
337 public static function disableComponent($componentName) {
338 $config = CRM_Core_Config
::singleton();
339 if (!in_array($componentName, $config->enableComponents
) ||
340 !array_key_exists($componentName, CRM_Core_Component
::getComponents())
342 // Post-condition is satisfied.
346 // get enabled-components from DB and add to the list
347 $enabledComponents = Civi
::settings()->get('enable_components');
348 $enabledComponents = array_diff($enabledComponents, [$componentName]);
350 self
::setEnabledComponents($enabledComponents);
356 * Set enabled components.
358 * @param array $enabledComponents
360 public static function setEnabledComponents($enabledComponents) {
361 // fix the config object. update db.
362 Civi
::settings()->set('enable_components', $enabledComponents);
364 // also force reset of component array
365 CRM_Core_Component
::getEnabledComponents(TRUE);
371 public static function skipVars() {
374 'templateCompileDir',
377 'userFrameworkBaseURL',
378 'userFrameworkClass',
380 'userPermissionClass',
381 'userPermissionTemp',
382 'userFrameworkURLVar',
383 'userFrameworkVersion',
389 'gettextResourceDir',
392 'locale_custom_strings',
393 'localeCustomStrings',
394 'autocompleteContactSearch',
395 'autocompleteContactReference',
402 * @param array $params
405 public static function filterSkipVars($params) {
406 $skipVars = self
::skipVars();
407 foreach ($skipVars as $var) {
408 unset($params[$var]);
410 foreach (array_keys($params) as $key) {
411 if (preg_match('/^_qf_/', $key)) {
412 unset($params[$key]);
421 private static function getUrlSettings() {
423 'userFrameworkResourceURL',
433 private static function getPathSettings() {
437 'customFileUploadDir',