bool)
*/
protected $addedCoreResources = array();
/**
* @var array ($regionName => bool)
*/
protected $addedCoreStyles = array();
/**
* @var string a value to append to JS/CSS URLs to coerce cache resets
*/
protected $cacheCode = NULL;
/**
* @var string the name of a setting which persistently stores the cacheCode
*/
protected $cacheCodeKey = NULL;
/**
* @var bool
*/
public $ajaxPopupsEnabled;
/**
* Get or set the single instance of CRM_Core_Resources
*
* @param $instance CRM_Core_Resources, new copy of the manager
* @return CRM_Core_Resources
*/
static public function singleton(CRM_Core_Resources $instance = NULL) {
if ($instance !== NULL) {
self::$_singleton = $instance;
}
if (self::$_singleton === NULL) {
$sys = CRM_Extension_System::singleton();
$cache = new CRM_Utils_Cache_SqlGroup(array(
'group' => 'js-strings',
'prefetch' => FALSE,
));
self::$_singleton = new CRM_Core_Resources(
$sys->getMapper(),
$cache,
CRM_Core_Config::isUpgradeMode() ? NULL : 'resCacheCode'
);
}
return self::$_singleton;
}
/**
* Construct a resource manager
*
* @param CRM_Extension_Mapper $extMapper Map extension names to their base path or URLs.
* @param CRM_Utils_Cache_Interface $cache JS-localization cache
* @param string|null $cacheCodeKey Random code to append to resource URLs; changing the code forces clients to reload resources
*/
public function __construct($extMapper, $cache, $cacheCodeKey = NULL) {
$this->extMapper = $extMapper;
$this->cache = $cache;
$this->cacheCodeKey = $cacheCodeKey;
if ($cacheCodeKey !== NULL) {
$this->cacheCode = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, $cacheCodeKey);
}
if (!$this->cacheCode) {
$this->resetCacheCode();
}
$this->ajaxPopupsEnabled = (bool) CRM_Core_BAO_Setting::getItem(
CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME, 'ajaxPopupsEnabled', NULL, TRUE
);
}
/**
* Add a JavaScript file to the current page using \n", $js);
}
/**
* Add translated string to the js CRM object.
* It can then be retrived from the client-side ts() function
* Variable substitutions can happen from client-side
*
* Note: this function rarely needs to be called directly and is mostly for internal use.
* @see CRM_Core_Resources::addScriptFile which automatically adds translated strings from js files
*
* Simple example:
* // From php:
* CRM_Core_Resources::singleton()->addString('Hello');
* // The string is now available to javascript code i.e.
* ts('Hello');
*
* Example with client-side substitutions:
* // From php:
* CRM_Core_Resources::singleton()->addString('Your %1 has been %2');
* // ts() in javascript works the same as in php, for example:
* ts('Your %1 has been %2', {1: objectName, 2: actionTaken});
*
* NOTE: This function does not work with server-side substitutions
* (as this might result in collisions and unwanted variable injections)
* Instead, use code like:
* CRM_Core_Resources::singleton()->addSetting(array('myNamespace' => array('myString' => ts('Your %1 has been %2', array(subs)))));
* And from javascript access it at CRM.myNamespace.myString
*
* @param $text string|array
* @return CRM_Core_Resources
*/
public function addString($text) {
foreach ((array) $text as $str) {
$translated = ts($str);
// We only need to push this string to client if the translation
// is actually different from the original
if ($translated != $str) {
$this->addSetting(array('strings' => array($str => $translated)));
}
}
return $this;
}
/**
* Add a CSS file to the current page using .
*
* @param $ext string, extension name; use 'civicrm' for core
* @param $file string, file path -- relative to the extension base dir
* @param $weight int, relative weight within a given region
* @param $region string, location within the file; 'html-header', 'page-header', 'page-footer'
* @return CRM_Core_Resources
*/
public function addStyleFile($ext, $file, $weight = self::DEFAULT_WEIGHT, $region = self::DEFAULT_REGION) {
return $this->addStyleUrl($this->getUrl($ext, $file, TRUE), $weight, $region);
}
/**
* Add a CSS file to the current page using .
*
* @param $url string
* @param $weight int, relative weight within a given region
* @param $region string, location within the file; 'html-header', 'page-header', 'page-footer'
* @return CRM_Core_Resources
*/
public function addStyleUrl($url, $weight = self::DEFAULT_WEIGHT, $region = self::DEFAULT_REGION) {
CRM_Core_Region::instance($region)->add(array(
'name' => $url,
'type' => 'styleUrl',
'styleUrl' => $url,
'weight' => $weight,
'region' => $region,
));
return $this;
}
/**
* Add a CSS content to the current page using