Commit | Line | Data |
---|---|---|
6a488035 TO |
1 | <?php |
2 | ||
3 | /** | |
4 | * Maintain a set of markup/templates to inject inside various regions | |
5 | */ | |
060617e9 | 6 | class CRM_Core_Region implements CRM_Core_Resources_CollectionInterface, CRM_Core_Resources_CollectionAdderInterface { |
6a488035 TO |
7 | |
8 | /** | |
d09edf64 | 9 | * Obtain the content for a given region. |
6a488035 TO |
10 | * |
11 | * @param string $name | |
6a0b768e TO |
12 | * @param bool $autocreate |
13 | * Whether to automatically create an empty region. | |
6a488035 TO |
14 | * @return CRM_Core_Region |
15 | */ | |
00be9182 | 16 | public static function &instance($name, $autocreate = TRUE) { |
832eb60a TO |
17 | if ($autocreate && !isset(Civi::$statics[__CLASS__][$name])) { |
18 | Civi::$statics[__CLASS__][$name] = new CRM_Core_Region($name); | |
6a488035 | 19 | } |
832eb60a | 20 | return Civi::$statics[__CLASS__][$name]; |
6a488035 TO |
21 | } |
22 | ||
060617e9 | 23 | use CRM_Core_Resources_CollectionTrait; |
8dbd7691 | 24 | |
6a488035 TO |
25 | /** |
26 | * Symbolic name of this region | |
27 | * | |
28 | * @var string | |
29 | */ | |
518fa0ee | 30 | public $_name; |
6a488035 | 31 | |
a0ee3941 | 32 | /** |
100fef9d | 33 | * @param string $name |
a0ee3941 | 34 | */ |
6a488035 | 35 | public function __construct($name) { |
6a488035 | 36 | $this->_name = $name; |
bac2c5e4 | 37 | $this->types = ['markup', 'template', 'callback', 'scriptFile', 'scriptUrl', 'script', 'jquery', 'settings', 'style', 'styleFile', 'styleUrl']; |
8dbd7691 | 38 | $this->defaults['region'] = $name; |
6a488035 TO |
39 | |
40 | // Placeholder which represents any of the default content generated by the main Smarty template | |
be2fb01f | 41 | $this->add([ |
6a488035 TO |
42 | 'name' => 'default', |
43 | 'type' => 'markup', | |
44 | 'markup' => '', | |
45 | 'weight' => 0, | |
be2fb01f | 46 | ]); |
6a488035 TO |
47 | } |
48 | ||
49 | /** | |
d09edf64 | 50 | * Render all the snippets in a region. |
6a488035 | 51 | * |
6a0b768e TO |
52 | * @param string $default |
53 | * HTML, the initial content of the region. | |
54 | * @param bool $allowCmsOverride | |
55 | * Allow CMS to override rendering of region. | |
6a488035 TO |
56 | * @return string, HTML |
57 | */ | |
58 | public function render($default, $allowCmsOverride = TRUE) { | |
59 | // $default is just another part of the region | |
8dbd7691 TO |
60 | if (is_array($this->snippets['default'])) { |
61 | $this->snippets['default']['markup'] = $default; | |
6a488035 | 62 | } |
6a488035 | 63 | |
8dbd7691 | 64 | $this->sort(); |
6a488035 | 65 | |
b41dbde6 | 66 | $cms = CRM_Core_Config::singleton()->userSystem; |
6a488035 TO |
67 | $smarty = CRM_Core_Smarty::singleton(); |
68 | $html = ''; | |
b41dbde6 TO |
69 | |
70 | $renderSnippet = function($snippet) use (&$html, $smarty, $cms, $allowCmsOverride, &$renderSnippet) { | |
22e263ad | 71 | switch ($snippet['type']) { |
6a488035 TO |
72 | case 'markup': |
73 | $html .= $snippet['markup']; | |
74 | break; | |
2aa397bc | 75 | |
6a488035 TO |
76 | case 'template': |
77 | $tmp = $smarty->get_template_vars('snippet'); | |
78 | $smarty->assign('snippet', $snippet); | |
79 | $html .= $smarty->fetch($snippet['template']); | |
80 | $smarty->assign('snippet', $tmp); | |
81 | break; | |
2aa397bc | 82 | |
6a488035 | 83 | case 'callback': |
2e1f50d6 | 84 | $args = $snippet['arguments'] ?? array(&$snippet, &$html); |
6a488035 TO |
85 | $html .= call_user_func_array($snippet['callback'], $args); |
86 | break; | |
2aa397bc | 87 | |
6a488035 TO |
88 | case 'scriptUrl': |
89 | if (!$allowCmsOverride || !$cms->addScriptUrl($snippet['scriptUrl'], $this->_name)) { | |
90 | $html .= sprintf("<script type=\"text/javascript\" src=\"%s\">\n</script>\n", $snippet['scriptUrl']); | |
91 | } | |
92 | break; | |
2aa397bc | 93 | |
6a488035 | 94 | case 'jquery': |
b41dbde6 TO |
95 | $renderSnippet([ |
96 | 'type' => 'script', | |
97 | 'script' => sprintf("CRM.\$(function(\$) {\n%s\n});", $snippet['jquery']), | |
98 | ]); | |
99 | break; | |
100 | ||
bac2c5e4 TO |
101 | case 'scriptFile': |
102 | foreach ($snippet['scriptFileUrls'] as $url) { | |
103 | $html .= $renderSnippet(['type' => 'scriptUrl', 'scriptUrl' => $url] + $snippet); | |
104 | } | |
105 | break; | |
106 | ||
6a488035 TO |
107 | case 'script': |
108 | if (!$allowCmsOverride || !$cms->addScript($snippet['script'], $this->_name)) { | |
109 | $html .= sprintf("<script type=\"text/javascript\">\n%s\n</script>\n", $snippet['script']); | |
110 | } | |
111 | break; | |
2aa397bc | 112 | |
bac2c5e4 TO |
113 | case 'styleFile': |
114 | foreach ($snippet['styleFileUrls'] as $url) { | |
115 | $html .= $renderSnippet(['type' => 'styleUrl', 'styleUrl' => $url] + $snippet); | |
116 | } | |
117 | break; | |
118 | ||
6a488035 TO |
119 | case 'styleUrl': |
120 | if (!$allowCmsOverride || !$cms->addStyleUrl($snippet['styleUrl'], $this->_name)) { | |
121 | $html .= sprintf("<link href=\"%s\" rel=\"stylesheet\" type=\"text/css\"/>\n", $snippet['styleUrl']); | |
122 | } | |
123 | break; | |
2aa397bc | 124 | |
6a488035 TO |
125 | case 'style': |
126 | if (!$allowCmsOverride || !$cms->addStyle($snippet['style'], $this->_name)) { | |
127 | $html .= sprintf("<style type=\"text/css\">\n%s\n</style>\n", $snippet['style']); | |
128 | } | |
129 | break; | |
2aa397bc | 130 | |
832eb60a | 131 | case 'settings': |
f55f8f17 | 132 | $settingsData = json_encode($this->getSettings(), JSON_UNESCAPED_SLASHES); |
832eb60a TO |
133 | $js = "(function(vars) { |
134 | if (window.CRM) CRM.$.extend(true, CRM, vars); else window.CRM = vars; | |
135 | })($settingsData)"; | |
136 | $html .= sprintf("<script type=\"text/javascript\">\n%s\n</script>\n", $js); | |
137 | break; | |
138 | ||
6a488035 | 139 | default: |
79e11805 | 140 | throw new CRM_Core_Exception(ts('Snippet type %1 is unrecognized', |
be2fb01f | 141 | [1 => $snippet['type']])); |
6a488035 | 142 | } |
b41dbde6 TO |
143 | }; |
144 | ||
145 | foreach ($this->snippets as $snippet) { | |
146 | if (empty($snippet['disabled'])) { | |
147 | $renderSnippet($snippet); | |
148 | } | |
6a488035 TO |
149 | } |
150 | return $html; | |
151 | } | |
152 | ||
6a488035 | 153 | } |