3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.6 |
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 +--------------------------------------------------------------------+
29 * Config handles all the run time configuration changes that the system needs to deal with.
30 * Typically we'll have different values for a user's sandbox, a qa sandbox and a production area.
31 * The default values in general, should reflect production values (minimizes chances of screwing up)
34 * @copyright CiviCRM LLC (c) 2004-2015
39 require_once 'Log.php';
40 require_once 'Mail.php';
42 require_once 'api/api.php';
45 * Class CRM_Core_Config
47 class CRM_Core_Config
extends CRM_Core_Config_Variables
{
49 /// BASE SYSTEM PROPERTIES (CIVICRM.SETTINGS.PHP)
53 * The dsn of the database connection
60 * The name of user framework
64 public $userFramework = 'Drupal';
67 * The name of user framework url variable name
71 public $userFrameworkURLVar = 'q';
74 * The dsn of the database connection for user framework
78 public $userFrameworkDSN = NULL;
81 * The connector module for the CMS/UF
82 * @todo Introduce an interface.
84 * @var CRM_Utils_System_Base
86 public $userSystem = NULL;
89 * @var CRM_Core_Permission_Base
91 public $userPermissionClass;
94 * The root directory where Smarty should store compiled files.
98 public $templateCompileDir = './templates_c/en_US/';
103 public $configAndLogDir = NULL;
105 // END: BASE SYSTEM PROPERTIES (CIVICRM.SETTINGS.PHP)
108 /// BEGIN HELPER CLASS PROPERTIES
112 * Are we initialized and in a proper state
116 public $initialized = 0;
121 public $customPHPPathDir;
124 * The factory class used to instantiate our DB objects
128 private $DAOFactoryClass = 'CRM_Contact_DAO_Factory';
131 * The handle to the log that we are using
134 private static $_log = NULL;
137 * The handle on the mail handler that we are using
141 public static $_mail = NULL;
144 * We only need one instance of this object. So we use the singleton
145 * pattern and cache the instance in this variable
147 * @var CRM_Core_Config
149 private static $_singleton = NULL;
152 * @var CRM_Core_Component
154 public $componentRegistry = NULL;
157 /// END HELPER CLASS PROPERTIES
161 /// RUNTIME SET CLASS PROPERTIES
166 * TRUE, if the call is CiviCRM.
167 * FALSE, if the call is from the CMS.
169 public $inCiviCRM = FALSE;
172 /// END: RUNTIME SET CLASS PROPERTIES
178 public $recaptchaPublicKey;
181 * The constructor. Sets domain id if defined, otherwise assumes
182 * single instance installation.
184 private function __construct() {
188 * Singleton function used to manage this object.
190 * @param bool $loadFromDB
191 * whether to load from the database.
193 * whether to force a reconstruction.
195 * @return CRM_Core_Config
197 public static function &singleton($loadFromDB = TRUE, $force = FALSE) {
198 if (self
::$_singleton === NULL ||
$force) {
199 // goto a simple error handler
200 $GLOBALS['civicrm_default_error_scope'] = CRM_Core_TemporaryErrorScope
::create(array('CRM_Core_Error', 'handle'));
201 $errorScope = CRM_Core_TemporaryErrorScope
::create(array('CRM_Core_Error', 'simpleHandler'));
203 // lets ensure we set E_DEPRECATED to minimize errors
205 if (defined('E_DEPRECATED')) {
206 error_reporting(error_reporting() & ~E_DEPRECATED
);
209 // first, attempt to get configuration object from cache
210 $cache = CRM_Utils_Cache
::singleton();
211 self
::$_singleton = $cache->get('CRM_Core_Config' . CRM_Core_Config
::domainID());
212 // if not in cache, fire off config construction
213 if (!self
::$_singleton) {
214 self
::$_singleton = new CRM_Core_Config();
215 self
::$_singleton->_initialize($loadFromDB);
217 //initialize variables. for gencode we cannot load from the
218 //db since the db might not be initialized
220 // initialize stuff from the settings file
221 self
::$_singleton->setCoreVariables();
223 self
::$_singleton->_initVariables();
225 // I don't think we need to do this twice
226 // however just keeping this commented for now in 4.4
227 // in case we hit any issues - CRM-13064
228 // We can safely delete this once we release 4.4.4
229 // self::$_singleton->setCoreVariables();
231 $cache->set('CRM_Core_Config' . CRM_Core_Config
::domainID(), self
::$_singleton);
234 // we retrieve the object from memcache, so we now initialize the objects
235 self
::$_singleton->_initialize($loadFromDB);
237 // CRM-9803, NYSS-4822
238 // this causes various settings to be reset and hence we should
239 // only use the config object that we retrieved from memcache
242 self
::$_singleton->initialized
= 1;
244 if (isset(self
::$_singleton->customPHPPathDir
) &&
245 self
::$_singleton->customPHPPathDir
247 $include_path = self
::$_singleton->customPHPPathDir
. PATH_SEPARATOR
. get_include_path();
248 set_include_path($include_path);
251 // set the callback at the very very end, to avoid an infinite loop
252 // set the error callback
255 // call the hook so other modules can add to the config
256 // again doing this at the very very end
257 CRM_Utils_Hook
::config(self
::$_singleton);
259 // make sure session is always initialised
260 $session = CRM_Core_Session
::singleton();
262 // for logging purposes, pass the userID to the db
263 $userID = $session->get('userID');
265 CRM_Core_DAO
::executeQuery('SET @civicrm_user_id = %1',
266 array(1 => array($userID, 'Integer'))
270 // initialize authentication source
271 self
::$_singleton->initAuthSrc();
273 return self
::$_singleton;
277 * @param string $userFramework
278 * One of 'Drupal', 'Joomla', etc.
280 private function _setUserFrameworkConfig($userFramework) {
282 $this->userFrameworkClass
= 'CRM_Utils_System_' . $userFramework;
283 $this->userHookClass
= 'CRM_Utils_Hook_' . $userFramework;
284 $userPermissionClass = 'CRM_Core_Permission_' . $userFramework;
285 $this->userPermissionClass
= new $userPermissionClass();
287 $class = $this->userFrameworkClass
;
288 // redundant with _initVariables
289 $this->userSystem
= new $class();
291 if ($userFramework == 'Joomla') {
292 $this->userFrameworkURLVar
= 'task';
295 if (defined('CIVICRM_UF_BASEURL')) {
296 $this->userFrameworkBaseURL
= CRM_Utils_File
::addTrailingSlash(CIVICRM_UF_BASEURL
, '/');
298 //format url for language negotiation, CRM-7803
299 $this->userFrameworkBaseURL
= CRM_Utils_System
::languageNegotiationURL($this->userFrameworkBaseURL
);
301 if (CRM_Utils_System
::isSSL()) {
302 $this->userFrameworkBaseURL
= str_replace('http://', 'https://',
303 $this->userFrameworkBaseURL
308 if (defined('CIVICRM_UF_DSN')) {
309 $this->userFrameworkDSN
= CIVICRM_UF_DSN
;
312 // this is dynamically figured out in the civicrm.settings.php file
313 if (defined('CIVICRM_CLEANURL')) {
314 $this->cleanURL
= CIVICRM_CLEANURL
;
320 $this->userFrameworkVersion
= $this->userSystem
->getVersion();
322 if ($userFramework == 'Joomla') {
323 /** @var object|null $mainframe */
325 $dbprefix = $mainframe ?
$mainframe->getCfg('dbprefix') : 'jos_';
326 $this->userFrameworkUsersTableName
= $dbprefix . 'users';
328 elseif ($userFramework == 'WordPress') {
330 $dbprefix = $wpdb ?
$wpdb->prefix
: '';
331 $this->userFrameworkUsersTableName
= $dbprefix . 'users';
336 * Initializes the entire application.
337 * Reads constants defined in civicrm.settings.php and
338 * stores them in config properties.
340 * @param bool $loadFromDB
342 private function _initialize($loadFromDB = TRUE) {
344 // following variables should be set in CiviCRM settings and
345 // as crucial ones, are defined upon initialisation
346 // instead of in CRM_Core_Config_Defaults
347 if (defined('CIVICRM_DSN')) {
348 $this->dsn
= CIVICRM_DSN
;
350 elseif ($loadFromDB) {
351 // bypass when calling from gencode
352 echo 'You need to define CIVICRM_DSN in civicrm.settings.php';
356 if (defined('CIVICRM_TEMPLATE_COMPILEDIR')) {
357 $this->templateCompileDir
= CRM_Utils_File
::addTrailingSlash(CIVICRM_TEMPLATE_COMPILEDIR
);
359 // also make sure we create the config directory within this directory
360 // the below statement will create both the templates directory and the config and log directory
361 $this->configAndLogDir
362 = CRM_Utils_File
::baseFilePath($this->templateCompileDir
) .
363 'ConfigAndLog' . DIRECTORY_SEPARATOR
;
364 CRM_Utils_File
::createDir($this->configAndLogDir
);
365 CRM_Utils_File
::restrictAccess($this->configAndLogDir
);
367 // we're automatically prefixing compiled templates directories with country/language code
369 if (!empty($tsLocale)) {
370 $this->templateCompileDir
.= CRM_Utils_File
::addTrailingSlash($tsLocale);
372 elseif (!empty($this->lcMessages
)) {
373 $this->templateCompileDir
.= CRM_Utils_File
::addTrailingSlash($this->lcMessages
);
376 CRM_Utils_File
::createDir($this->templateCompileDir
);
377 CRM_Utils_File
::restrictAccess($this->templateCompileDir
);
379 elseif ($loadFromDB) {
380 echo 'You need to define CIVICRM_TEMPLATE_COMPILEDIR in civicrm.settings.php';
386 if (defined('CIVICRM_UF')) {
387 $this->userFramework
= CIVICRM_UF
;
388 $this->_setUserFrameworkConfig($this->userFramework
);
391 echo 'You need to define CIVICRM_UF in civicrm.settings.php';
395 // also initialize the logger
396 self
::$_log = Log
::singleton('display');
398 // initialize component registry early to avoid "race"
399 // between CRM_Core_Config and CRM_Core_Component (they
401 $this->componentRegistry
= new CRM_Core_Component();
405 * Initialize the DataObject framework.
409 private function _initDAO() {
410 CRM_Core_DAO
::init($this->dsn
);
412 $factoryClass = $this->DAOFactoryClass
;
413 require_once str_replace('_', DIRECTORY_SEPARATOR
, $factoryClass) . '.php';
414 CRM_Core_DAO
::setFactory(new $factoryClass());
415 if (CRM_Utils_Constant
::value('CIVICRM_MYSQL_STRICT', CRM_Utils_System
::isDevelopment())) {
416 CRM_Core_DAO
::executeQuery('SET SESSION sql_mode = STRICT_TRANS_TABLES');
421 * Returns the singleton logger for the application.
427 static public function &getLog() {
428 if (!isset(self
::$_log)) {
429 self
::$_log = Log
::singleton('display');
436 * Initialize the config variables.
440 private function _initVariables() {
441 // retrieve serialised settings
442 $variables = array();
443 CRM_Core_BAO_ConfigSetting
::retrieve($variables);
445 // if settings are not available, go down the full path
446 if (empty($variables)) {
447 // Step 1. get system variables with their hardcoded defaults
448 $variables = get_object_vars($this);
450 // Step 2. get default values (with settings file overrides if
451 // available - handled in CRM_Core_Config_Defaults)
452 CRM_Core_Config_Defaults
::setValues($variables);
454 // retrieve directory and url preferences also
455 CRM_Core_BAO_Setting
::retrieveDirectoryAndURLPreferences($variables);
457 // add component specific settings
458 $this->componentRegistry
->addConfig($this);
460 // serialise settings
461 $settings = $variables;
462 CRM_Core_BAO_ConfigSetting
::add($settings);
465 $urlArray = array('userFrameworkResourceURL', 'imageUploadURL');
466 $dirArray = array('uploadDir', 'customFileUploadDir');
468 foreach ($variables as $key => $value) {
469 if (in_array($key, $urlArray)) {
470 $value = CRM_Utils_File
::addTrailingSlash($value, '/');
472 elseif (in_array($key, $dirArray)) {
474 $value = CRM_Utils_File
::addTrailingSlash($value);
476 if (empty($value) ||
(CRM_Utils_File
::createDir($value, FALSE) === FALSE)) {
477 // seems like we could not create the directories
478 // settings might have changed, lets suppress a message for now
479 // so we can make some more progress and let the user fix their settings
480 // for now we assign it to a know value
482 $value = $this->templateCompileDir
;
483 $url = CRM_Utils_System
::url('civicrm/admin/setting/path', 'reset=1');
484 CRM_Core_Session
::setStatus(ts('%1 has an incorrect directory path. Please go to the <a href="%2">path setting page</a> and correct it.', array(
487 )), ts('Check Settings'), 'alert');
490 elseif ($key == 'lcMessages') {
491 // reset the templateCompileDir to locale-specific and make sure it exists
492 if (substr($this->templateCompileDir
, -1 * strlen($value) - 1, -1) != $value) {
493 $this->templateCompileDir
.= CRM_Utils_File
::addTrailingSlash($value);
494 CRM_Utils_File
::createDir($this->templateCompileDir
);
495 CRM_Utils_File
::restrictAccess($this->templateCompileDir
);
499 $this->$key = $value;
502 if ($this->userFrameworkResourceURL
) {
503 // we need to do this here so all blocks also load from an ssl server
504 if (CRM_Utils_System
::isSSL()) {
505 CRM_Utils_System
::mapConfigToSSL();
507 $rrb = parse_url($this->userFrameworkResourceURL
);
508 // don't use absolute path if resources are stored on a different server
510 $this->resourceBase
= $this->userFrameworkResourceURL
;
511 if (isset($_SERVER['HTTP_HOST']) &&
514 $this->resourceBase
= ($rrb['host'] == $_SERVER['HTTP_HOST']) ?
$rrb['path'] : $this->userFrameworkResourceURL
;
518 if (!$this->customFileUploadDir
) {
519 $this->customFileUploadDir
= $this->uploadDir
;
522 if ($this->geoProvider
) {
523 $this->geocodeMethod
= 'CRM_Utils_Geocode_' . $this->geoProvider
;
525 elseif ($this->mapProvider
) {
526 $this->geocodeMethod
= 'CRM_Utils_Geocode_' . $this->mapProvider
;
529 require_once str_replace('_', DIRECTORY_SEPARATOR
, $this->userFrameworkClass
) . '.php';
530 $class = $this->userFrameworkClass
;
531 // redundant with _setUserFrameworkConfig
532 $this->userSystem
= new $class();
536 * Retrieve a mailer to send any mail from the application.
538 * @param bool $persist
539 * Open a persistent smtp connection, should speed up mailings.
542 public static function &getMailer($persist = FALSE) {
543 if (!isset(self
::$_mail)) {
544 $mailingInfo = CRM_Core_BAO_Setting
::getItem(CRM_Core_BAO_Setting
::MAILING_PREFERENCES_NAME
,
548 if ($mailingInfo['outBound_option'] == CRM_Mailing_Config
::OUTBOUND_OPTION_REDIRECT_TO_DB ||
549 (defined('CIVICRM_MAILER_SPOOL') && CIVICRM_MAILER_SPOOL
)
551 self
::$_mail = self
::_createMailer('CRM_Mailing_BAO_Spool', array());
553 elseif ($mailingInfo['outBound_option'] == CRM_Mailing_Config
::OUTBOUND_OPTION_SMTP
) {
554 if ($mailingInfo['smtpServer'] == '' ||
!$mailingInfo['smtpServer']) {
555 CRM_Core_Error
::debug_log_message(ts('There is no valid smtp server setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the SMTP Server.', array(1 => CRM_Utils_System
::url('civicrm/admin/setting/smtp', 'reset=1'))));
556 CRM_Core_Error
::fatal(ts('There is no valid smtp server setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the SMTP Server.', array(1 => CRM_Utils_System
::url('civicrm/admin/setting/smtp', 'reset=1'))));
559 $params['host'] = $mailingInfo['smtpServer'] ?
$mailingInfo['smtpServer'] : 'localhost';
560 $params['port'] = $mailingInfo['smtpPort'] ?
$mailingInfo['smtpPort'] : 25;
562 if ($mailingInfo['smtpAuth']) {
563 $params['username'] = $mailingInfo['smtpUsername'];
564 $params['password'] = CRM_Utils_Crypt
::decrypt($mailingInfo['smtpPassword']);
565 $params['auth'] = TRUE;
568 $params['auth'] = FALSE;
571 // set the localhost value, CRM-3153
572 $params['localhost'] = CRM_Utils_Array
::value('SERVER_NAME', $_SERVER, 'localhost');
574 // also set the timeout value, lets set it to 30 seconds
576 $params['timeout'] = 30;
579 $params['persist'] = $persist;
581 self
::$_mail = self
::_createMailer('smtp', $params);
583 elseif ($mailingInfo['outBound_option'] == CRM_Mailing_Config
::OUTBOUND_OPTION_SENDMAIL
) {
584 if ($mailingInfo['sendmail_path'] == '' ||
585 !$mailingInfo['sendmail_path']
587 CRM_Core_Error
::debug_log_message(ts('There is no valid sendmail path setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the sendmail server.', array(1 => CRM_Utils_System
::url('civicrm/admin/setting/smtp', 'reset=1'))));
588 CRM_Core_Error
::fatal(ts('There is no valid sendmail path setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the sendmail server.', array(1 => CRM_Utils_System
::url('civicrm/admin/setting/smtp', 'reset=1'))));
590 $params['sendmail_path'] = $mailingInfo['sendmail_path'];
591 $params['sendmail_args'] = $mailingInfo['sendmail_args'];
593 self
::$_mail = self
::_createMailer('sendmail', $params);
595 elseif ($mailingInfo['outBound_option'] == CRM_Mailing_Config
::OUTBOUND_OPTION_MAIL
) {
596 self
::$_mail = self
::_createMailer('mail', array());
598 elseif ($mailingInfo['outBound_option'] == CRM_Mailing_Config
::OUTBOUND_OPTION_MOCK
) {
599 self
::$_mail = self
::_createMailer('mock', array());
601 elseif ($mailingInfo['outBound_option'] == CRM_Mailing_Config
::OUTBOUND_OPTION_DISABLED
) {
602 CRM_Core_Error
::debug_log_message(ts('Outbound mail has been disabled. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the OutBound Email.', array(1 => CRM_Utils_System
::url('civicrm/admin/setting/smtp', 'reset=1'))));
603 CRM_Core_Session
::setStatus(ts('Outbound mail has been disabled. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the OutBound Email.', array(1 => CRM_Utils_System
::url('civicrm/admin/setting/smtp', 'reset=1'))));
606 CRM_Core_Error
::debug_log_message(ts('There is no valid SMTP server Setting Or SendMail path setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the OutBound Email.', array(1 => CRM_Utils_System
::url('civicrm/admin/setting/smtp', 'reset=1'))));
607 CRM_Core_Session
::setStatus(ts('There is no valid SMTP server Setting Or sendMail path setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the OutBound Email.', array(1 => CRM_Utils_System
::url('civicrm/admin/setting/smtp', 'reset=1'))));
608 CRM_Core_Error
::debug_var('mailing_info', $mailingInfo);
615 * Create a new instance of a PEAR Mail driver.
617 * @param string $driver
618 * 'CRM_Mailing_BAO_Spool' or a name suitable for Mail::factory().
619 * @param array $params
621 * More specifically, a class which implements the "send()" function
623 public static function _createMailer($driver, $params) {
624 if ($driver == 'CRM_Mailing_BAO_Spool') {
625 $mailer = new CRM_Mailing_BAO_Spool($params);
628 $mailer = Mail
::factory($driver, $params);
630 CRM_Utils_Hook
::alterMail($mailer, $driver, $params);
635 * Deletes the web server writable directories.
638 * 1: clean templates_c, 2: clean upload, 3: clean both
641 public function cleanup($value, $rmdir = TRUE) {
642 $value = (int ) $value;
646 CRM_Utils_File
::cleanDir($this->templateCompileDir
, $rmdir);
647 CRM_Utils_File
::createDir($this->templateCompileDir
);
651 CRM_Utils_File
::cleanDir($this->uploadDir
);
652 CRM_Utils_File
::createDir($this->uploadDir
);
655 // Whether we delete/create or simply preserve directories, we should
656 // certainly make sure the restrictions are enforced.
658 $this->templateCompileDir
,
660 $this->configAndLogDir
,
661 $this->customFileUploadDir
,
663 if ($dir && is_dir($dir)) {
664 CRM_Utils_File
::restrictAccess($dir);
670 * Verify that the needed parameters are not null in the config.
672 * @param CRM_Core_Config $config (reference) the system config object
673 * @param array $required (reference) the parameters that need a value
677 public static function check(&$config, &$required) {
678 foreach ($required as $name) {
679 if (CRM_Utils_System
::isNull($config->$name)) {
687 * Reset the serialized array and recompute.
690 public function reset() {
691 $query = "UPDATE civicrm_domain SET config_backend = null";
692 CRM_Core_DAO
::executeQuery($query);
696 * This method should initialize auth sources.
698 public function initAuthSrc() {
699 $session = CRM_Core_Session
::singleton();
700 if ($session->get('userID') && !$session->get('authSrc')) {
701 $session->set('authSrc', CRM_Core_Permission
::AUTH_SRC_LOGIN
);
705 CRM_Contact_BAO_Contact_Permission
::initChecksumAuthSrc();
709 * One function to get domain ID.
711 public static function domainID($domainID = NULL, $reset = FALSE) {
716 if ($reset ||
empty($domain)) {
717 $domain = defined('CIVICRM_DOMAIN_ID') ? CIVICRM_DOMAIN_ID
: 1;
724 * Do general cleanup of caches, temp directories and temp tables
727 public function cleanupCaches($sessionReset = TRUE) {
728 // cleanup templates_c directory
729 $this->cleanup(1, FALSE);
732 self
::clearDBCache();
735 $session = CRM_Core_Session
::singleton();
741 * Do general cleanup of module permissions.
743 public function cleanupPermissions() {
744 $module_files = CRM_Extension_System
::singleton()->getMapper()->getActiveModuleFiles();
745 if ($this->userPermissionClass
->isModulePermissionSupported()) {
746 // Can store permissions -- so do it!
747 $this->userPermissionClass
->upgradePermissions(
748 CRM_Core_Permission
::basicPermissions()
752 // Cannot store permissions -- warn if any modules require them
753 $modules_with_perms = array();
754 foreach ($module_files as $module_file) {
755 $perms = $this->userPermissionClass
->getModulePermissions($module_file['prefix']);
756 if (!empty($perms)) {
757 $modules_with_perms[] = $module_file['prefix'];
760 if (!empty($modules_with_perms)) {
761 CRM_Core_Session
::setStatus(
762 ts('Some modules define permissions, but the CMS cannot store them: %1', array(1 => implode(', ', $modules_with_perms))),
763 ts('Permission Error'),
771 * Flush information about loaded modules.
773 public function clearModuleList() {
774 CRM_Extension_System
::singleton()->getCache()->flush();
775 CRM_Utils_Hook
::singleton(TRUE);
776 CRM_Core_PseudoConstant
::getModuleExtensions(TRUE);
777 CRM_Core_Module
::getAll(TRUE);
783 public static function clearDBCache() {
785 'TRUNCATE TABLE civicrm_acl_cache',
786 'TRUNCATE TABLE civicrm_acl_contact_cache',
787 'TRUNCATE TABLE civicrm_cache',
788 'TRUNCATE TABLE civicrm_prevnext_cache',
789 'UPDATE civicrm_group SET cache_date = NULL',
790 'TRUNCATE TABLE civicrm_group_contact_cache',
791 'TRUNCATE TABLE civicrm_menu',
792 'UPDATE civicrm_setting SET value = NULL WHERE name="navigation" AND contact_id IS NOT NULL',
793 'DELETE FROM civicrm_setting WHERE name="modulePaths"', // CRM-10543
796 foreach ($queries as $query) {
797 CRM_Core_DAO
::executeQuery($query);
800 // also delete all the import and export temp tables
801 self
::clearTempTables();
805 * Clear leftover temporary tables.
807 * This is called on upgrade, during tests and site move, from the cron and via clear caches in the UI.
809 * Currently the UI clear caches does not pass a time interval - which may need review as it does risk
810 * ripping the tables out from underneath a current action. This was considered but
811 * out-of-scope for CRM-16167
813 * @param string|bool $timeInterval
814 * Optional time interval for mysql date function.g '2 day'. This can be used to prevent
815 * tables created recently from being deleted.
817 public static function clearTempTables($timeInterval = FALSE) {
819 $dao = new CRM_Core_DAO();
821 SELECT TABLE_NAME as tableName
822 FROM INFORMATION_SCHEMA.TABLES
823 WHERE TABLE_SCHEMA = %1
825 TABLE_NAME LIKE 'civicrm_import_job_%'
826 OR TABLE_NAME LIKE 'civicrm_export_temp%'
827 OR TABLE_NAME LIKE 'civicrm_task_action_temp%'
828 OR TABLE_NAME LIKE 'civicrm_report_temp%'
832 $query .= " AND CREATE_TIME < DATE_SUB(NOW(), INTERVAL {$timeInterval})";
835 $tableDAO = CRM_Core_DAO
::executeQuery($query, array(1 => array($dao->database(), 'String')));
837 while ($tableDAO->fetch()) {
838 $tables[] = $tableDAO->tableName
;
840 if (!empty($tables)) {
841 $table = implode(',', $tables);
842 // drop leftover temporary tables
843 CRM_Core_DAO
::executeQuery("DROP TABLE $table");
848 * Check if running in upgrade mode.
850 public static function isUpgradeMode($path = NULL) {
851 if (defined('CIVICRM_UPGRADE_ACTIVE')) {
856 // note: do not re-initialize config here, since this function is part of
857 // config initialization itself
859 if (defined('CIVICRM_UF') && CIVICRM_UF
== 'Joomla') {
863 $path = CRM_Utils_Array
::value($urlVar, $_GET);
866 if ($path && preg_match('/^civicrm\/upgrade(\/.*)?$/', $path)) {
874 * Wrapper function to allow unit tests to switch user framework on the fly.
876 public function setUserFramework($userFramework = NULL) {
877 $this->userFramework
= $userFramework;
878 $this->_setUserFrameworkConfig($userFramework);
882 * Is back office credit card processing enabled for this site - ie are there any installed processors that support
884 * This function is used for determining whether to show the submit credit card link, not for determining which processors to show, hence
888 public static function isEnabledBackOfficeCreditCardPayments() {
889 return CRM_Financial_BAO_PaymentProcessor
::hasPaymentProcessorSupporting(array('BackOffice'));
893 * Resets the singleton, so that the next call to CRM_Core_Config::singleton()
894 * reloads completely.
896 * While normally we could call the singleton function with $force = TRUE,
897 * this function addresses a very specific use-case in the CiviCRM installer,
898 * where we cannot yet force a reload, but we want to make sure that the next
899 * call to this object gets a fresh start (ex: to initialize the DAO).
901 public function free() {
902 self
::$_singleton = NULL;