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 * Evaluate locale preferences and activate a chosen locale by
123 * updating session+global variables.
125 * @param \Civi\Core\SettingsBag $settings
126 * @param string $activatedLocales
127 * Imploded list of locales which are supported in the DB.
129 public static function applyLocale($settings, $activatedLocales) {
130 // are we in a multi-language setup?
131 $multiLang = (bool) $activatedLocales;
133 // set the current language
134 $chosenLocale = NULL;
136 $session = CRM_Core_Session
::singleton();
138 $permittedLanguages = CRM_Core_I18n
::uiLanguages(TRUE);
140 // The locale to be used can come from various places:
141 // - the request (url)
143 // - civicrm_uf_match
144 // - inherited from the CMS
145 // Only look at this if there is actually a choice of permitted languages
146 if (count($permittedLanguages) >= 2) {
147 $requestLocale = CRM_Utils_Request
::retrieve('lcMessages', 'String');
148 if (in_array($requestLocale, $permittedLanguages)) {
149 $chosenLocale = $requestLocale;
151 //CRM-8559, cache navigation do not respect locale if it is changed, so reseting cache.
152 // Ed: This doesn't sound good.
153 // Civi::cache('navigation')->flush();
156 $requestLocale = NULL;
159 if (!$requestLocale) {
160 $sessionLocale = $session->get('lcMessages');
161 if (in_array($sessionLocale, $permittedLanguages)) {
162 $chosenLocale = $sessionLocale;
165 $sessionLocale = NULL;
169 if ($requestLocale) {
170 $ufm = new CRM_Core_DAO_UFMatch();
171 $ufm->contact_id
= $session->get('userID');
172 if ($ufm->find(TRUE)) {
173 $ufm->language
= $chosenLocale;
176 $session->set('lcMessages', $chosenLocale);
179 if (!$chosenLocale and $session->get('userID')) {
180 $ufm = new CRM_Core_DAO_UFMatch();
181 $ufm->contact_id
= $session->get('userID');
182 if ($ufm->find(TRUE) &&
183 in_array($ufm->language
, $permittedLanguages)
185 $chosenLocale = $ufm->language
;
187 $session->set('lcMessages', $chosenLocale);
192 // try to inherit the language from the hosting CMS
193 // If the language is specified in the session (ie. via lcMessages) we still allow it to be overridden.
194 if ($settings->get('inheritLocale') && empty($sessionLocale)) {
195 // FIXME: On multilanguage installs, CRM_Utils_System::getUFLocale() in many cases returns nothing if $dbLocale is not set
196 $lcMessages = $settings->get('lcMessages');
197 $dbLocale = $multiLang && $lcMessages ?
"_{$lcMessages}" : '';
198 $chosenLocale = CRM_Utils_System
::getUFLocale();
199 if ($activatedLocales and !in_array($chosenLocale, explode(CRM_Core_DAO
::VALUE_SEPARATOR
, $activatedLocales))) {
200 $chosenLocale = NULL;
204 if (empty($chosenLocale)) {
205 //CRM-11993 - if a single-lang site, use default
206 $chosenLocale = $settings->get('lcMessages');
209 // set suffix for table names - use views if more than one language
210 $dbLocale = $multiLang && $chosenLocale ?
"_{$chosenLocale}" : '';
212 // FIXME: an ugly hack to fix CRM-4041
214 $tsLocale = $chosenLocale;
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');
224 * @param array $defaultValues
229 public static function doSiteMove($defaultValues = []) {
230 $moveStatus = ts('Beginning site move process...') . '<br />';
231 $settings = Civi
::settings();
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.", [
241 $moveStatus .= '<br />';
244 $moveStatus .= ts("WARNING: The setting (%1) is overridden and could not be reverted.", [
247 $moveStatus .= '<br />';
252 $config = CRM_Core_Config
::singleton();
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 />';
259 CRM_Core_Config
::clearDBCache();
260 Civi
::cache('session')->clear();
261 $moveStatus .= ts('Database cache tables cleared.') . '<br />';
263 $resetSessionTable = CRM_Utils_Request
::retrieve('resetSessionTable',
265 CRM_Core_DAO
::$_nullArray,
269 if ($config->userSystem
->is_drupal
&&
272 db_query("DELETE FROM {sessions} WHERE 1");
273 $moveStatus .= ts('Drupal session table cleared.') . '<br />';
276 $session = CRM_Core_Session
::singleton();
278 $moveStatus .= ts('Session has been reset.') . '<br />';
285 * Takes a componentName and enables it in the config.
286 * Primarily used during unit testing
288 * @param string $componentName
289 * Name of the component to be enabled, needs to be valid.
292 * true if valid component name and enabling succeeds, else false
294 public static function enableComponent($componentName) {
295 $config = CRM_Core_Config
::singleton();
296 if (in_array($componentName, $config->enableComponents
)) {
297 // component is already enabled
301 // return if component does not exist
302 if (!array_key_exists($componentName, CRM_Core_Component
::getComponents())) {
306 // get enabled-components from DB and add to the list
307 $enabledComponents = Civi
::settings()->get('enable_components');
308 $enabledComponents[] = $componentName;
310 self
::setEnabledComponents($enabledComponents);
316 * Disable specified component.
318 * @param string $componentName
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())
327 // Post-condition is satisfied.
331 // get enabled-components from DB and add to the list
332 $enabledComponents = Civi
::settings()->get('enable_components');
333 $enabledComponents = array_diff($enabledComponents, [$componentName]);
335 self
::setEnabledComponents($enabledComponents);
341 * Set enabled components.
343 * @param array $enabledComponents
345 public static function setEnabledComponents($enabledComponents) {
346 // fix the config object. update db.
347 Civi
::settings()->set('enable_components', $enabledComponents);
349 // also force reset of component array
350 CRM_Core_Component
::getEnabledComponents(TRUE);
356 public static function skipVars() {
359 'templateCompileDir',
362 'userFrameworkBaseURL',
363 'userFrameworkClass',
365 'userPermissionClass',
366 'userPermissionTemp',
367 'userFrameworkURLVar',
368 'userFrameworkVersion',
374 'gettextResourceDir',
377 'locale_custom_strings',
378 'localeCustomStrings',
379 'autocompleteContactSearch',
380 'autocompleteContactReference',
387 * @param array $params
390 public static function filterSkipVars($params) {
391 $skipVars = self
::skipVars();
392 foreach ($skipVars as $var) {
393 unset($params[$var]);
395 foreach (array_keys($params) as $key) {
396 if (preg_match('/^_qf_/', $key)) {
397 unset($params[$key]);
406 private static function getUrlSettings() {
408 'userFrameworkResourceURL',
418 private static function getPathSettings() {
422 'customFileUploadDir',