X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FCore%2FResources.php;h=744e5be721ddd58c5ca1760c8606072f9feb1c06;hb=d09edf64e678a73669cff34014a55a06604de75a;hp=7707c12652f2006ee6b58caa86cd2440829b89e9;hpb=fd7dc3f34a9605552866688ff9d3f8f75de70c3c;p=civicrm-core.git diff --git a/CRM/Core/Resources.php b/CRM/Core/Resources.php index 7707c12652..744e5be721 100644 --- a/CRM/Core/Resources.php +++ b/CRM/Core/Resources.php @@ -1,29 +1,29 @@ 'js-strings', - 'prefetch' => FALSE, - )); + 'group' => 'js-strings', + 'prefetch' => FALSE, + )); self::$_singleton = new CRM_Core_Resources( $sys->getMapper(), $cache, @@ -125,7 +125,7 @@ class CRM_Core_Resources { } /** - * Construct a resource manager + * Construct a resource manager. * * @param CRM_Extension_Mapper $extMapper * Map extension names to their base path or URLs. @@ -159,15 +159,18 @@ class CRM_Core_Resources { * relative weight within a given region. * @param string $region * location within the file; 'html-header', 'page-header', 'page-footer'. - * @param $translate , whether to parse this file for strings enclosed in ts() + * @param bool|string $translate + * Whether to load translated strings for this file. Use one of: + * - FALSE: Do not load translated strings. + * - TRUE: Load translated strings. Use the $ext's default domain. + * - string: Load translated strings. Use a specific domain. * * @return CRM_Core_Resources */ public function addScriptFile($ext, $file, $weight = self::DEFAULT_WEIGHT, $region = self::DEFAULT_REGION, $translate = TRUE) { if ($translate) { - // For each extension, maintain one cache record which - // includes parsed (translatable) strings for all its files. - $this->addString($this->strings->get($ext, $this->getPath($ext, $file), 'text/javascript')); + $domain = ($translate === TRUE) ? $ext : $translate; + $this->addString($this->strings->get($domain, $this->getPath($ext, $file), 'text/javascript'), $domain); } // Look for non-minified version if we are in debug mode if (CRM_Core_Config::singleton()->debug && strpos($file, '.min.js') !== FALSE) { @@ -191,12 +194,12 @@ class CRM_Core_Resources { */ public function addScriptUrl($url, $weight = self::DEFAULT_WEIGHT, $region = self::DEFAULT_REGION) { CRM_Core_Region::instance($region)->add(array( - 'name' => $url, - 'type' => 'scriptUrl', - 'scriptUrl' => $url, - 'weight' => $weight, - 'region' => $region, - )); + 'name' => $url, + 'type' => 'scriptUrl', + 'scriptUrl' => $url, + 'weight' => $weight, + 'region' => $region, + )); return $this; } @@ -213,12 +216,12 @@ class CRM_Core_Resources { */ public function addScript($code, $weight = self::DEFAULT_WEIGHT, $region = self::DEFAULT_REGION) { CRM_Core_Region::instance($region)->add(array( - // 'name' => automatic - 'type' => 'script', - 'script' => $code, - 'weight' => $weight, - 'region' => $region, - )); + // 'name' => automatic + 'type' => 'script', + 'script' => $code, + 'weight' => $weight, + 'region' => $region, + )); return $this; } @@ -283,7 +286,7 @@ class CRM_Core_Resources { } /** - * Helper fn for addSettingsFactory + * Helper fn for addSettingsFactory. */ public function getSettings() { $result = $this->settings; @@ -310,7 +313,7 @@ class CRM_Core_Resources { } /** - * Helper fn for addSetting + * Helper fn for addSetting. * Render JavaScript variables for the global CRM object. * * @return string @@ -354,15 +357,22 @@ class CRM_Core_Resources { * And from javascript access it at CRM.myNamespace.myString * * @param string|array $text + * @param string|NULL $domain * @return CRM_Core_Resources */ - public function addString($text) { + public function addString($text, $domain = 'civicrm') { foreach ((array) $text as $str) { - $translated = ts($str); + $translated = ts($str, array( + 'domain' => ($domain == 'civicrm') ? NULL : array($domain, NULL), + )); + // 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))); + $bucket = $domain == 'civicrm' ? 'strings' : 'strings::' . $domain; + $this->addSetting(array( + $bucket => array($str => $translated), + )); } } return $this; @@ -397,12 +407,12 @@ class 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, - )); + 'name' => $url, + 'type' => 'styleUrl', + 'styleUrl' => $url, + 'weight' => $weight, + 'region' => $region, + )); return $this; } @@ -419,28 +429,31 @@ class CRM_Core_Resources { */ public function addStyle($code, $weight = self::DEFAULT_WEIGHT, $region = self::DEFAULT_REGION) { CRM_Core_Region::instance($region)->add(array( - // 'name' => automatic - 'type' => 'style', - 'style' => $code, - 'weight' => $weight, - 'region' => $region, - )); + // 'name' => automatic + 'type' => 'style', + 'style' => $code, + 'weight' => $weight, + 'region' => $region, + )); return $this; } /** - * Determine file path of a resource provided by an extension + * Determine file path of a resource provided by an extension. * * @param string $ext * extension name; use 'civicrm' for core. - * @param string $file + * @param string|NULL $file * file path -- relative to the extension base dir. * * @return bool|string * full file path or FALSE if not found */ - public function getPath($ext, $file) { + public function getPath($ext, $file = NULL) { // TODO consider caching results + if ($file === NULL) { + return $this->extMapper->keyToBasePath($ext); + } $path = $this->extMapper->keyToBasePath($ext) . '/' . $file; if (is_file($path)) { return $path; @@ -449,7 +462,7 @@ class CRM_Core_Resources { } /** - * Determine public URL of a resource provided by an extension + * Determine public URL of a resource provided by an extension. * * @param string $ext * extension name; use 'civicrm' for core. @@ -470,6 +483,40 @@ class CRM_Core_Resources { return $this->extMapper->keyToUrl($ext) . '/' . $file; } + /** + * Evaluate a glob pattern in the context of a particular extension. + * + * @param string $ext + * Extension name; use 'civicrm' for core. + * @param string|array $patterns + * Glob pattern; e.g. "*.html". + * @param null|int $flags + * See glob(). + * @return array + * List of matching files, relative to the extension base dir. + * @see glob() + */ + public function glob($ext, $patterns, $flags = NULL) { + $path = $this->getPath($ext); + $patterns = (array) $patterns; + $files = array(); + foreach ($patterns as $pattern) { + if ($pattern{0} === '/') { + // Absolute path. + $files = array_merge($files, (array) glob($pattern, $flags)); + } + else { + // Relative path. + $files = array_merge($files, (array) glob("$path/$pattern", $flags)); + } + } + sort($files); // Deterministic order. + $files = array_unique($files); + return array_map(function ($file) use ($path) { + return CRM_Utils_File::relativize($file, "$path/"); + }, $files); + } + /** * @return string */ @@ -519,7 +566,7 @@ class CRM_Core_Resources { foreach ($this->coreResourceList() as $file) { if (substr($file, -2) == 'js') { // Don't bother looking for ts() calls in packages, there aren't any - $translate = (substr($file, 0, 9) != 'packages/'); + $translate = (substr($file, 0, 3) == 'js/'); $this->addScriptFile('civicrm', $file, $jsWeight++, $region, $translate); } else { @@ -535,7 +582,7 @@ class CRM_Core_Resources { 'config' => array( 'ajaxPopupsEnabled' => $this->ajaxPopupsEnabled, 'isFrontend' => $config->userFrameworkFrontend, - ) + ), ); // Disable profile creation if user lacks permission if (!CRM_Core_Permission::check('edit all contacts') && !CRM_Core_Permission::check('add contacts')) { @@ -577,7 +624,7 @@ class CRM_Core_Resources { } /** - * Flushes cached translated strings + * Flushes cached translated strings. * @return CRM_Core_Resources */ public function flushStrings() { @@ -593,10 +640,7 @@ class CRM_Core_Resources { } /** - * Create dynamic script for localizing js widgets - * - * @return string - * javascript content + * Create dynamic script for localizing js widgets. */ public static function outputLocalizationJS() { CRM_Core_Page_AJAX::setJsHeaders(); @@ -615,7 +659,7 @@ class CRM_Core_Resources { } /** - * List of core resources we add to every CiviCRM page + * List of core resources we add to every CiviCRM page. * * @return array */ @@ -628,10 +672,10 @@ class CRM_Core_Resources { // Scripts needed by everyone, everywhere // FIXME: This is too long; list needs finer-grained segmentation $items = array( - "packages/jquery/jquery-1.11.1$min.js", - "packages/jquery/jquery-ui/jquery-ui$min.js", - "packages/jquery/jquery-ui/jquery-ui$min.css", - "packages/backbone/lodash.compat$min.js", + "bower_components/jquery/dist/jquery.min.js", + "bower_components/jquery-ui/jquery-ui.min.js", + "bower_components/jquery-ui/themes/smoothness/jquery-ui$min.css", + "bower_components/lodash-compat/lodash.min.js", "packages/jquery/plugins/jquery.mousewheel$min.js", "packages/jquery/plugins/select2/select2$min.js", "packages/jquery/plugins/select2/select2.css", @@ -671,7 +715,7 @@ class CRM_Core_Resources { if ($config->lcMessages && $config->lcMessages != 'en_US') { // Search for i18n file in order of specificity (try fr-CA, then fr) list($lang) = explode('_', $config->lcMessages); - $path = "packages/jquery/jquery-ui/i18n"; + $path = "bower_components/jquery-ui/ui/i18n"; foreach (array(str_replace('_', '-', $config->lcMessages), $lang) as $language) { $localizationFile = "$path/datepicker-{$language}.js"; if ($this->getPath('civicrm', $localizationFile)) { @@ -695,7 +739,7 @@ class CRM_Core_Resources { return in_array(CRM_Utils_Array::value('snippet', $_REQUEST), array( CRM_Core_Smarty::PRINT_SNIPPET, CRM_Core_Smarty::PRINT_NOFORM, - CRM_Core_Smarty::PRINT_JSON + CRM_Core_Smarty::PRINT_JSON, )); } @@ -718,7 +762,7 @@ class CRM_Core_Resources { array('key' => '{"BETWEEN":["now - 3 month","now"]}', 'value' => ts('Past 3 Months')), array('key' => '{"BETWEEN":["now - 6 month","now"]}', 'value' => ts('Past 6 Months')), array('key' => '{"BETWEEN":["now - 1 year","now"]}', 'value' => ts('Past Year')), - ) + ), ), ); @@ -739,4 +783,5 @@ class CRM_Core_Resources { return $filters; } + }