delete('CRM_Core_Config'); $cache->delete('CRM_Core_Config' . CRM_Core_Config::domainID()); $config = CRM_Core_Config::singleton(TRUE, TRUE); } /** * Add civicrm settings. * * @param array $params * Associated array of civicrm variables. * @deprecated * This method was historically used to access civicrm_domain.config_backend. * However, that has been fully replaced by the settings system since v4.7. */ public static function add(&$params) { $domain = new CRM_Core_DAO_Domain(); $domain->id = CRM_Core_Config::domainID(); $domain->find(TRUE); if ($domain->config_backend) { $params = array_merge(unserialize($domain->config_backend), $params); } $params = CRM_Core_BAO_ConfigSetting::filterSkipVars($params); // also skip all Dir Params, we dont need to store those in the DB! foreach ($params as $name => $val) { if (substr($name, -3) == 'Dir') { unset($params[$name]); } } $domain->config_backend = serialize($params); $domain->save(); } /** * Retrieve the settings values from db. * * @param $defaults * * @return array * @deprecated * This method was historically used to access civicrm_domain.config_backend. * However, that has been fully replaced by the settings system since v4.7. */ public static function retrieve(&$defaults) { $domain = new CRM_Core_DAO_Domain(); $isUpgrade = CRM_Core_Config::isUpgradeMode(); //we are initializing config, really can't use, CRM-7863 $urlVar = 'q'; if (defined('CIVICRM_UF') && CIVICRM_UF == 'Joomla') { $urlVar = 'task'; } $hasBackend = CRM_Core_BAO_SchemaHandler::checkIfFieldExists('civicrm_domain', 'config_backend'); if ($isUpgrade && $hasBackend) { $domain->selectAdd('config_backend'); } else { $domain->selectAdd('locales'); } $domain->id = CRM_Core_Config::domainID(); $domain->find(TRUE); if ($hasBackend && $domain->config_backend) { // This whole branch can probably be removed; the transitional loading // is in SettingBag::loadValues(). Moreover, since 4.7.alpha1 dropped // the column, anyone calling ::retrieve() has likely not gotten any data. $defaults = unserialize($domain->config_backend); if ($defaults === FALSE || !is_array($defaults)) { $defaults = []; return FALSE; } $skipVars = self::skipVars(); foreach ($skipVars as $skip) { if (array_key_exists($skip, $defaults)) { unset($defaults[$skip]); } } } if (!$isUpgrade) { CRM_Core_BAO_ConfigSetting::applyLocale(Civi::settings($domain->id), $domain->locales); } } /** * Activate a chosen locale. * * The locale is set by updating the session and global variables. * * When there is a choice of permitted languages (set on the "Administer" -> * "Localisation" -> "Languages, Currency, Locations" screen) the locale to * be applied can come from a variety of sources. The list below is the order * of priority for deciding which of the sources "wins": * * - The request - when the "lcMessages" query variable is present in the URL. * - The session - when the "lcMessages" session variable has been set. * - Inherited from the CMS - when the "inheritLocale" setting is set. * - CiviCRM settings - the fallback when none of the above set the locale. * * Single-language installs skip this and always set the default locale. * * @param \Civi\Core\SettingsBag $settings * @param string $activatedLocales * Imploded list of locales which are supported in the DB. */ public static function applyLocale($settings, $activatedLocales) { // Declare access to locale globals. global $dbLocale, $tsLocale; // Grab session reference. $session = CRM_Core_Session::singleton(); // Set flag for multi-language setup. $multiLang = (bool) $activatedLocales; // Initialise the default and chosen locales. $defaultLocale = $settings->get('lcMessages'); $chosenLocale = NULL; // When there is a choice of permitted languages. $permittedLanguages = CRM_Core_I18n::uiLanguages(TRUE); if (count($permittedLanguages) >= 2) { // Is the "lcMessages" query variable present in the URL? $requestLocale = CRM_Utils_Request::retrieve('lcMessages', 'String'); if (in_array($requestLocale, $permittedLanguages)) { $chosenLocale = $requestLocale; } // Check the session if the chosen locale hasn't been set yet. if (empty($chosenLocale)) { $sessionLocale = $session->get('lcMessages'); if (in_array($sessionLocale, $permittedLanguages)) { $chosenLocale = $sessionLocale; } } /* * Maybe inherit the language from the CMS. * * If the language is specified via "lcMessages" we skip this, since the * intention of the URL query var is to override all other sources. */ if ($settings->get('inheritLocale') && empty($chosenLocale)) { /* * FIXME: On multi-language installs, CRM_Utils_System::getUFLocale() in * many cases returns nothing if $dbLocale is not set, so set it to the * default - even if it's overridden later. */ $dbLocale = $multiLang && $defaultLocale ? "_{$defaultLocale}" : ''; // Retrieve locale as reported by CMS. $cmsLocale = CRM_Utils_System::getUFLocale(); if (in_array($cmsLocale, $permittedLanguages)) { $chosenLocale = $cmsLocale; } // Clear chosen locale if not activated in multi-language CiviCRM. if ($activatedLocales && !in_array($chosenLocale, explode(CRM_Core_DAO::VALUE_SEPARATOR, $activatedLocales))) { $chosenLocale = NULL; } } // Assign the system default if the chosen locale hasn't been set. if (empty($chosenLocale)) { $chosenLocale = $defaultLocale; } // Always assign the chosen locale to the session. $session->set('lcMessages', $chosenLocale); } else { // CRM-11993 - Use default when it's a single-language install. $chosenLocale = $defaultLocale; } /* * Set suffix for table names in multi-language installs. * Use views if more than one language. */ $dbLocale = $multiLang && $chosenLocale ? "_{$chosenLocale}" : ''; // FIXME: an ugly hack to fix CRM-4041. $tsLocale = $chosenLocale; /* * FIXME: as bad a place as any to fix CRM-5428. * (to be moved to a sane location along with the above) */ if (function_exists('mb_internal_encoding')) { mb_internal_encoding('UTF-8'); } } /** * @param array $defaultValues * * @return string * @throws Exception */ public static function doSiteMove($defaultValues = []) { $moveStatus = ts('Beginning site move process...') . '
'; $settings = Civi::settings(); foreach (array_merge(self::getPathSettings(), self::getUrlSettings()) as $key) { $value = $settings->get($key); if ($value && $value != $settings->getDefault($key)) { if ($settings->getMandatory($key) === NULL) { $settings->revert($key); $moveStatus .= ts("WARNING: The setting (%1) has been reverted.", [ 1 => $key, ]); $moveStatus .= '
'; } else { $moveStatus .= ts("WARNING: The setting (%1) is overridden and could not be reverted.", [ 1 => $key, ]); $moveStatus .= '
'; } } } $config = CRM_Core_Config::singleton(); // clear the template_c and upload directory also $config->cleanup(3, TRUE); $moveStatus .= ts('Template cache and upload directory have been cleared.') . '
'; // clear all caches CRM_Core_Config::clearDBCache(); Civi::cache('session')->clear(); $moveStatus .= ts('Database cache tables cleared.') . '
'; $resetSessionTable = CRM_Utils_Request::retrieve('resetSessionTable', 'Boolean', CRM_Core_DAO::$_nullArray, FALSE, FALSE ); if ($config->userSystem->is_drupal && $resetSessionTable ) { db_query("DELETE FROM {sessions} WHERE 1"); $moveStatus .= ts('Drupal session table cleared.') . '
'; } else { $session = CRM_Core_Session::singleton(); $session->reset(2); $moveStatus .= ts('Session has been reset.') . '
'; } return $moveStatus; } /** * Takes a componentName and enables it in the config. * Primarily used during unit testing * * @param string $componentName * Name of the component to be enabled, needs to be valid. * * @return bool * true if valid component name and enabling succeeds, else false */ public static function enableComponent($componentName) { $config = CRM_Core_Config::singleton(); if (in_array($componentName, $config->enableComponents)) { // component is already enabled return TRUE; } // return if component does not exist if (!array_key_exists($componentName, CRM_Core_Component::getComponents())) { return FALSE; } // get enabled-components from DB and add to the list $enabledComponents = Civi::settings()->get('enable_components'); $enabledComponents[] = $componentName; self::setEnabledComponents($enabledComponents); return TRUE; } /** * Disable specified component. * * @param string $componentName * * @return bool */ public static function disableComponent($componentName) { $config = CRM_Core_Config::singleton(); if (!in_array($componentName, $config->enableComponents) || !array_key_exists($componentName, CRM_Core_Component::getComponents()) ) { // Post-condition is satisfied. return TRUE; } // get enabled-components from DB and add to the list $enabledComponents = Civi::settings()->get('enable_components'); $enabledComponents = array_diff($enabledComponents, [$componentName]); self::setEnabledComponents($enabledComponents); return TRUE; } /** * Set enabled components. * * @param array $enabledComponents */ public static function setEnabledComponents($enabledComponents) { // fix the config object. update db. Civi::settings()->set('enable_components', $enabledComponents); // also force reset of component array CRM_Core_Component::getEnabledComponents(TRUE); } /** * @return array */ public static function skipVars() { return [ 'dsn', 'templateCompileDir', 'userFrameworkDSN', 'userFramework', 'userFrameworkBaseURL', 'userFrameworkClass', 'userHookClass', 'userPermissionClass', 'userPermissionTemp', 'userFrameworkURLVar', 'userFrameworkVersion', 'newBaseURL', 'newBaseDir', 'newSiteName', 'configAndLogDir', 'qfKey', 'gettextResourceDir', 'cleanURL', 'entryURL', 'locale_custom_strings', 'localeCustomStrings', 'autocompleteContactSearch', 'autocompleteContactReference', 'checksumTimeout', 'checksum_timeout', ]; } /** * @param array $params * @return array */ public static function filterSkipVars($params) { $skipVars = self::skipVars(); foreach ($skipVars as $var) { unset($params[$var]); } foreach (array_keys($params) as $key) { if (preg_match('/^_qf_/', $key)) { unset($params[$key]); } } return $params; } /** * @return array */ private static function getUrlSettings() { return [ 'userFrameworkResourceURL', 'imageUploadURL', 'customCSSURL', 'extensionsURL', ]; } /** * @return array */ private static function getPathSettings() { return [ 'uploadDir', 'imageUploadDir', 'customFileUploadDir', 'customTemplateDir', 'customPHPPathDir', 'extensionsDir', ]; } }