0190895d30dcde012161748275eb88a63d9a4d41
3 namespace Civi\Angular\Page
;
6 * This page aggregates data from Angular modules.
8 * Example: Aggregate metadata about all modules in JSON format.
9 * civicrm/ajax/angular-modules?format=json
11 * Example: Aggregate metadata for crmUi and crmUtil modules.
12 * civicrm/ajax/angular-modules?format=json&modules=crmUi,crmUtil
14 * Example: Aggregate *.js files for all modules.
15 * civicrm/ajax/angular-modules?format=js
17 * Example: Aggregate *.css files for all modules.
18 * civicrm/ajax/angular-modules?format=css
20 class Modules
extends \CRM_Core_Page
{
23 * See class description.
25 public function run() {
27 * @var \Civi\Angular\Manager $angular
29 $angular = \Civi\Core\Container
::singleton()->get('angular');
30 $moduleNames = $this->parseModuleNames(\CRM_Utils_Request
::retrieve('modules', 'String'), $angular);
32 switch (\CRM_Utils_Request
::retrieve('format', 'String')) {
36 'application/javascript',
37 json_encode($this->getMetadata($moduleNames, $angular))
43 'application/javascript',
44 $this->digestJs($angular->getResources($moduleNames, 'js', 'path'))
51 \CRM_Utils_File
::concat($angular->getResources($moduleNames, 'css', 'path'), "\n")
56 \CRM_Core_Error
::fatal("Unrecognized format");
59 \CRM_Utils_System
::civiExit();
67 public function digestJs($files) {
69 foreach ($files as $file) {
70 $scripts[] = file_get_contents($file);
72 $scripts = \CRM_Utils_JS
::dedupeClosures(
74 array('angular', '$', '_'),
75 array('angular', 'CRM.$', 'CRM._')
77 // This impl of stripComments currently adds 10-20ms and cuts ~7%
78 return \CRM_Utils_JS
::stripComments(implode("\n", $scripts));
82 * @param string $modulesExpr
83 * Comma-separated list of module names.
84 * @param \Civi\Angular\Manager $angular
86 * Any well-formed module names. All if moduleExpr is blank.
88 public function parseModuleNames($modulesExpr, $angular) {
90 $moduleNames = preg_grep(
91 '/^[a-zA-Z0-9\-_\.]+$/',
92 explode(',', $modulesExpr)
97 $moduleNames = array_keys($angular->getModules());
103 * @param array $moduleNames
104 * List of module names.
105 * @param \Civi\Angular\Manager $angular
108 public function getMetadata($moduleNames, $angular) {
109 $modules = $angular->getModules();
111 foreach ($moduleNames as $moduleName) {
112 if (isset($modules[$moduleName])) {
113 $result[$moduleName] = array();
114 $result[$moduleName]['domain'] = $modules[$moduleName]['ext'];
115 $result[$moduleName]['js'] = $angular->getResources($moduleName, 'js', 'rawUrl');
116 $result[$moduleName]['css'] = $angular->getResources($moduleName, 'css', 'rawUrl');
117 $result[$moduleName]['partials'] = $angular->getPartials($moduleName);
118 $result[$moduleName]['strings'] = $angular->getTranslatedStrings($moduleName);
127 * @param string $type
129 * @param string $data
132 public function send($type, $data) {
133 // Encourage browsers to cache for a long time - 1 year
134 $ttl = 60 * 60 * 24 * 364;
135 header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', time() +
$ttl));
136 header("Content-Type: $type");
137 header("Cache-Control: max-age=$ttl, public");