3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.7 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2015 |
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-2015
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();
92 //we are initializing config, really can't use, CRM-7863
94 if (defined('CIVICRM_UF') && CIVICRM_UF
== 'Joomla') {
98 if (CRM_Core_Config
::isUpgradeMode()) {
99 $domain->selectAdd('config_backend');
102 $domain->selectAdd('config_backend, locales');
105 $domain->id
= CRM_Core_Config
::domainID();
107 if ($domain->config_backend
) {
108 $defaults = unserialize($domain->config_backend
);
109 if ($defaults === FALSE ||
!is_array($defaults)) {
114 $skipVars = self
::skipVars();
115 foreach ($skipVars as $skip) {
116 if (array_key_exists($skip, $defaults)) {
117 unset($defaults[$skip]);
121 CRM_Core_BAO_ConfigSetting
::applyLocale(Civi
::settings($domain->id
), $domain->locales
);
126 * Evaluate locale preferences and activate a chosen locale by
127 * updating session+global variables.
129 * @param \Civi\Core\SettingsBag $settings
130 * @param string $activatedLocales
131 * Imploded list of locales which are supported in the DB.
133 public static function applyLocale($settings, $activatedLocales) {
134 // are we in a multi-language setup?
135 $multiLang = $activatedLocales ?
TRUE : FALSE;
137 // set the current language
138 $chosenLocale = NULL;
140 $session = CRM_Core_Session
::singleton();
142 // on multi-lang sites based on request and civicrm_uf_match
144 $languageLimit = array();
145 if (is_array($settings->get('languageLimit'))) {
146 $languageLimit = $settings->get('languageLimit');
149 $requestLocale = CRM_Utils_Request
::retrieve('lcMessages', 'String');
150 if (in_array($requestLocale, array_keys($languageLimit))) {
151 $chosenLocale = $requestLocale;
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');
158 $requestLocale = NULL;
161 if (!$requestLocale) {
162 $sessionLocale = $session->get('lcMessages');
163 if (in_array($sessionLocale, array_keys($languageLimit))) {
164 $chosenLocale = $sessionLocale;
167 $sessionLocale = NULL;
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;
178 $session->set('lcMessages', $chosenLocale);
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))
187 $chosenLocale = $ufm->language
;
189 $session->set('lcMessages', $chosenLocale);
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;
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}" : '';
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 = array()) {
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.", array(
241 $moveStatus .= '<br />';
244 $moveStatus .= ts("WARNING: The setting (%1) is overridden and could not be reverted.", array(
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 $moveStatus .= ts('Database cache tables cleared.') . '<br />';
262 $resetSessionTable = CRM_Utils_Request
::retrieve('resetSessionTable',
264 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, array($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',