Commit | Line | Data |
---|---|---|
6a488035 TO |
1 | <?php |
2 | ||
3 | /** | |
4 | * Base class for UF system integrations | |
5 | */ | |
6 | abstract class CRM_Utils_System_Base { | |
4caaa696 | 7 | /** |
100fef9d | 8 | * Deprecated property to check if this is a drupal install. The correct method is to have functions on the UF classes for all UF specific |
4caaa696 | 9 | * functions and leave the codebase oblivious to the type of CMS |
7cdf0f5b | 10 | * |
4caaa696 EM |
11 | * @deprecated |
12 | * @var bool | |
7cdf0f5b | 13 | * TRUE, if the CMS is Drupal. |
4caaa696 | 14 | */ |
6a488035 | 15 | var $is_drupal = FALSE; |
4caaa696 EM |
16 | |
17 | /** | |
100fef9d | 18 | * Deprecated property to check if this is a joomla install. The correct method is to have functions on the UF classes for all UF specific |
4caaa696 | 19 | * functions and leave the codebase oblivious to the type of CMS |
7cdf0f5b | 20 | * |
4caaa696 EM |
21 | * @deprecated |
22 | * @var bool | |
7cdf0f5b | 23 | * TRUE, if the CMS is Joomla!. |
4caaa696 | 24 | */ |
6a488035 | 25 | var $is_joomla = FALSE; |
4caaa696 | 26 | |
7cdf0f5b AH |
27 | /** |
28 | * deprecated property to check if this is a wordpress install. The correct method is to have functions on the UF classes for all UF specific | |
29 | * functions and leave the codebase oblivious to the type of CMS | |
30 | * | |
31 | * @deprecated | |
32 | * @var bool | |
33 | * TRUE, if the CMS is WordPress. | |
34 | */ | |
6a488035 TO |
35 | var $is_wordpress = FALSE; |
36 | ||
e0dd98a5 EM |
37 | /** |
38 | * Does this CMS / UF support a CMS specific logging mechanism? | |
39 | * @todo - we should think about offering up logging mechanisms in a way that is also extensible by extensions | |
40 | * @var bool | |
41 | */ | |
42 | var $supports_UF_Logging = FALSE; | |
43 | ||
7cdf0f5b AH |
44 | /** |
45 | * @var bool | |
46 | * TRUE, if the CMS allows CMS forms to be extended by hooks. | |
6a488035 TO |
47 | */ |
48 | var $supports_form_extensions = FALSE; | |
49 | ||
50 | /** | |
100fef9d | 51 | * If we are using a theming system, invoke theme, else just print the |
6a488035 TO |
52 | * content |
53 | * | |
77855840 TO |
54 | * @param string $content |
55 | * The content that will be themed. | |
56 | * @param bool $print | |
57 | * Are we displaying to the screen or bypassing theming?. | |
58 | * @param bool $maintenance | |
59 | * For maintenance mode. | |
6a488035 | 60 | * |
7cdf0f5b AH |
61 | * @throws Exception |
62 | * @return string|null | |
63 | * NULL, If $print is FALSE, and some other criteria match up. | |
64 | * The themed string, otherwise. | |
26659f0c AH |
65 | * |
66 | * @todo The return value is inconsistent. | |
67 | * @todo Better to always return, and never print. | |
6a488035 | 68 | */ |
00be9182 | 69 | public function theme(&$content, $print = FALSE, $maintenance = FALSE) { |
6a488035 TO |
70 | $ret = FALSE; |
71 | ||
72 | // TODO: Split up; this was copied verbatim from CiviCRM 4.0's multi-UF theming function | |
73 | // but the parts should be copied into cleaner subclass implementations | |
1e305b0b DL |
74 | $config = CRM_Core_Config::singleton(); |
75 | if ( | |
76 | $config->userSystem->is_drupal && | |
77 | function_exists('theme') && | |
78 | ||
79 | ) { | |
6a488035 TO |
80 | if ($maintenance) { |
81 | drupal_set_breadcrumb(''); | |
82 | drupal_maintenance_theme(); | |
10221f8a TO |
83 | if ($region = CRM_Core_Region::instance('html-header', FALSE)) { |
84 | CRM_Utils_System::addHTMLHead($region->render('')); | |
85 | } | |
6a488035 TO |
86 | print theme('maintenance_page', array('content' => $content)); |
87 | exit(); | |
88 | } | |
89 | $ret = TRUE; // TODO: Figure out why D7 returns but everyone else prints | |
90 | } | |
91 | $out = $content; | |
92 | ||
93 | $config = &CRM_Core_Config::singleton(); | |
1e305b0b DL |
94 | if ( |
95 | !$print && | |
6a488035 TO |
96 | $config->userFramework == 'WordPress' |
97 | ) { | |
aecede9a AH |
98 | if (!function_exists('is_admin')) { |
99 | throw new \Exception('Function "is_admin()" is missing, even though WordPress is the user framework.'); | |
100 | } | |
101 | if (!defined('ABSPATH')) { | |
102 | throw new \Exception('Constant "ABSPATH" is not defined, even though WordPress is the user framework.'); | |
103 | } | |
6a488035 | 104 | if (is_admin()) { |
e7292422 | 105 | require_once ABSPATH . 'wp-admin/admin-header.php'; |
6a488035 TO |
106 | } |
107 | else { | |
7cdf0f5b | 108 | // FIXME: we need to figure out to replace civicrm content on the frontend pages |
6a488035 TO |
109 | } |
110 | } | |
111 | ||
112 | if ($ret) { | |
113 | return $out; | |
114 | } | |
115 | else { | |
116 | print $out; | |
85c5f34c | 117 | return NULL; |
6a488035 TO |
118 | } |
119 | } | |
120 | ||
bb3a214a EM |
121 | /** |
122 | * @return string | |
123 | */ | |
00be9182 | 124 | public function getDefaultBlockLocation() { |
6a488035 TO |
125 | return 'left'; |
126 | } | |
127 | ||
bb3a214a EM |
128 | /** |
129 | * @return string | |
130 | */ | |
00be9182 | 131 | public function getVersion() { |
6a488035 TO |
132 | return 'Unknown'; |
133 | } | |
134 | ||
135 | /** | |
136 | * Format the url as per language Negotiation. | |
137 | * | |
138 | * @param string $url | |
77b97be7 EM |
139 | * @param bool $addLanguagePart |
140 | * @param bool $removeLanguagePart | |
141 | * | |
7cdf0f5b AH |
142 | * @return string |
143 | * Formatted url. | |
6a488035 TO |
144 | * @static |
145 | */ | |
146 | function languageNegotiationURL( | |
147 | $url, | |
148 | $addLanguagePart = TRUE, | |
149 | $removeLanguagePart = FALSE | |
150 | ) { | |
151 | return $url; | |
152 | } | |
153 | ||
e29aefb4 TO |
154 | /** |
155 | * Determine the location of the CMS root. | |
156 | * | |
7cdf0f5b AH |
157 | * @return string|null |
158 | * Local file system path to CMS root, or NULL if it cannot be determined | |
6a488035 | 159 | */ |
00be9182 | 160 | public function cmsRootPath() { |
e29aefb4 | 161 | return NULL; |
6a488035 TO |
162 | } |
163 | ||
164 | /** | |
165 | * Get user login URL for hosting CMS (method declared in each CMS system class) | |
166 | * | |
77855840 TO |
167 | * @param string $destination |
168 | * If present, add destination to querystring (works for Drupal only). | |
6a488035 | 169 | * |
a6c01b45 CW |
170 | * @return string |
171 | * loginURL for the current CMS | |
6a488035 TO |
172 | * @static |
173 | */ | |
174 | public abstract function getLoginURL($destination = ''); | |
175 | ||
46b6363c TO |
176 | /** |
177 | * Determine the native ID of the CMS user | |
178 | * | |
100fef9d | 179 | * @param string $username |
f4aaa82a EM |
180 | * |
181 | * @throws CRM_Core_Exception | |
46b6363c TO |
182 | * @return int|NULL |
183 | */ | |
00be9182 | 184 | public function getUfId($username) { |
46b6363c TO |
185 | $className = get_class($this); |
186 | throw new CRM_Core_Exception("Not implemented: {$className}->getUfId"); | |
187 | } | |
188 | ||
5d0eb86b BS |
189 | /** |
190 | * Set a init session with user object | |
191 | * | |
7cdf0f5b AH |
192 | * @param array $data |
193 | * Array with user specific data | |
5d0eb86b | 194 | */ |
00be9182 | 195 | public function setUserSession($data) { |
5d0eb86b BS |
196 | list($userID, $ufID) = $data; |
197 | $session = CRM_Core_Session::singleton(); | |
198 | $session->set('ufID', $ufID); | |
199 | $session->set('userID', $userID); | |
200 | } | |
d8a4acc0 C |
201 | |
202 | /** | |
203 | * Reset any system caches that may be required for proper CiviCRM | |
204 | * integration. | |
205 | */ | |
00be9182 | 206 | public function flush() { |
d8a4acc0 C |
207 | // nullop by default |
208 | } | |
82d9c21e | 209 | |
f091327b CW |
210 | /** |
211 | * Flush css/js caches | |
212 | */ | |
00be9182 | 213 | public function clearResourceCache() { |
f091327b CW |
214 | // nullop by default |
215 | } | |
216 | ||
c8950569 | 217 | /** |
9977c6f5 | 218 | * Return default Site Settings |
f4aaa82a | 219 | * |
7cdf0f5b | 220 | * @param string $dir |
f4aaa82a | 221 | * |
7cdf0f5b | 222 | * @return array |
9977c6f5 | 223 | * - $url, (Joomla - non admin url) |
224 | * - $siteName, | |
225 | * - $siteRoot | |
226 | */ | |
00be9182 | 227 | public function getDefaultSiteSettings($dir) { |
9977c6f5 | 228 | $config = CRM_Core_Config::singleton(); |
229 | $url = $config->userFrameworkBaseURL; | |
230 | return array($url, NULL, NULL); | |
231 | } | |
c8950569 | 232 | |
82d9c21e | 233 | /** |
95d68223 | 234 | * Perform any post login activities required by the CMS - |
53980972 | 235 | * e.g. for drupal: records a watchdog message about the new session, saves the login timestamp, |
236 | * calls hook_user op 'login' and generates a new session. | |
e43cc689 | 237 | * |
7cdf0f5b | 238 | * @param array $params |
95d68223 TO |
239 | * |
240 | * FIXME: Document values accepted/required by $params | |
c8950569 | 241 | */ |
9b873358 | 242 | public function userLoginFinalize($params = array()) { |
82d9c21e | 243 | } |
5a604d61 E |
244 | |
245 | /** | |
246 | * Set timezone in mysql so that timestamp fields show the correct time | |
247 | */ | |
9b873358 | 248 | public function setMySQLTimeZone() { |
5a604d61 | 249 | $timeZoneOffset = $this->getTimeZoneOffset(); |
9b873358 | 250 | if ($timeZoneOffset) { |
5a604d61 E |
251 | $sql = "SET time_zone = '$timeZoneOffset'"; |
252 | CRM_Core_DAO::executequery($sql); | |
253 | } | |
254 | } | |
255 | ||
6491539b | 256 | |
5a604d61 E |
257 | /** |
258 | * Get timezone from CMS | |
7cdf0f5b AH |
259 | * |
260 | * @return string|false|null | |
6491539b | 261 | */ |
9b873358 | 262 | public function getTimeZoneOffset() { |
6491539b | 263 | $timezone = $this->getTimeZoneString(); |
8b647c3a | 264 | if ($timezone) { |
6491539b DL |
265 | $tzObj = new DateTimeZone($timezone); |
266 | $dateTime = new DateTime("now", $tzObj); | |
267 | $tz = $tzObj->getOffset($dateTime); | |
268 | ||
8b647c3a AH |
269 | if (empty($tz)) { |
270 | return FALSE; | |
6491539b DL |
271 | } |
272 | ||
e7292422 | 273 | $timeZoneOffset = sprintf("%02d:%02d", $tz / 3600, abs(($tz / 60) % 60)); |
6491539b | 274 | |
8b647c3a | 275 | if ($timeZoneOffset > 0) { |
6491539b DL |
276 | $timeZoneOffset = '+' . $timeZoneOffset; |
277 | } | |
278 | return $timeZoneOffset; | |
279 | } | |
85c5f34c | 280 | return NULL; |
6491539b DL |
281 | } |
282 | ||
283 | /** | |
284 | * Over-ridable function to get timezone as a string eg. | |
7cdf0f5b AH |
285 | * |
286 | * @return string | |
287 | * Time zone, e.g. 'America/Los_Angeles' | |
6491539b | 288 | */ |
00be9182 | 289 | public function getTimeZoneString() { |
48ec57ab | 290 | return date_default_timezone_get(); |
5a604d61 | 291 | } |
2b617cb0 EM |
292 | |
293 | /** | |
294 | * Get Unique Identifier from UserFramework system (CMS) | |
77855840 TO |
295 | * @param object $user |
296 | * Object as described by the User Framework. | |
2b617cb0 | 297 | * @return mixed $uniqueIdentifer Unique identifier from the user Framework system |
2b617cb0 | 298 | */ |
e7292422 TO |
299 | public function getUniqueIdentifierFromUserObject($user) { |
300 | } | |
2b617cb0 | 301 | |
32998c82 EM |
302 | /** |
303 | * Get User ID from UserFramework system (CMS) | |
77855840 TO |
304 | * @param object $user |
305 | * Object as described by the User Framework. | |
32998c82 | 306 | * @return mixed <NULL, number> |
32998c82 | 307 | */ |
e7292422 TO |
308 | public function getUserIDFromUserObject($user) { |
309 | } | |
32998c82 EM |
310 | |
311 | /** | |
312 | * Get currently logged in user uf id. | |
313 | * | |
a6c01b45 CW |
314 | * @return int |
315 | * $userID logged in user uf id. | |
32998c82 | 316 | */ |
e7292422 TO |
317 | public function getLoggedInUfID() { |
318 | } | |
32998c82 | 319 | |
2b617cb0 EM |
320 | /** |
321 | * Get currently logged in user unique identifier - this tends to be the email address or user name. | |
322 | * | |
a6c01b45 CW |
323 | * @return string |
324 | * logged in user unique identifier | |
2b617cb0 | 325 | */ |
e7292422 TO |
326 | public function getLoggedInUniqueIdentifier() { |
327 | } | |
2b617cb0 | 328 | |
32998c82 | 329 | /** |
100fef9d | 330 | * Return a UFID (user account ID from the UserFramework / CMS system being based on the user object |
32998c82 EM |
331 | * passed, defaulting to the logged in user if not passed. Note that ambiguous situation occurs |
332 | * in CRM_Core_BAO_UFMatch::synchronize - a cleaner approach would seem to be resolving the user id before calling | |
333 | * the function | |
334 | * | |
335 | * Note there is already a function getUFId which takes $username as a param - we could add $user | |
336 | * as a second param to it but it seems messy - just overloading it because the name is taken | |
2b617cb0 | 337 | * @param object $user |
a6c01b45 CW |
338 | * @return int |
339 | * $ufid - user ID of UF System | |
32998c82 | 340 | */ |
00be9182 | 341 | public function getBestUFID($user = NULL) { |
22e263ad | 342 | if ($user) { |
32998c82 EM |
343 | return $this->getUserIDFromUserObject($user); |
344 | } | |
345 | return $this->getLoggedInUfID(); | |
346 | } | |
2b617cb0 EM |
347 | |
348 | /** | |
100fef9d | 349 | * Return a unique identifier (usually an email address or username) from the UserFramework / CMS system being based on the user object |
2b617cb0 EM |
350 | * passed, defaulting to the logged in user if not passed. Note that ambiguous situation occurs |
351 | * in CRM_Core_BAO_UFMatch::synchronize - a cleaner approach would seem to be resolving the unique identifier before calling | |
352 | * the function | |
353 | * | |
354 | * @param object $user | |
a6c01b45 CW |
355 | * @return string |
356 | * unique identifier from the UF System | |
2b617cb0 | 357 | */ |
00be9182 | 358 | public function getBestUFUniqueIdentifier($user = NULL) { |
22e263ad | 359 | if ($user) { |
2b617cb0 EM |
360 | return $this->getUniqueIdentifierFromUserObject($user); |
361 | } | |
362 | return $this->getLoggedInUniqueIdentifier(); | |
363 | } | |
59f97da6 EM |
364 | |
365 | /** | |
366 | * Get Url to view user record | |
77855840 TO |
367 | * @param int $contactID |
368 | * Contact ID. | |
59f97da6 EM |
369 | * |
370 | * @return string | |
371 | */ | |
00be9182 | 372 | public function getUserRecordUrl($contactID) { |
59f97da6 EM |
373 | return NULL; |
374 | } | |
375 | /** | |
376 | * Is the current user permitted to add a user | |
377 | * @return bool | |
378 | */ | |
00be9182 | 379 | public function checkPermissionAddUser() { |
59f97da6 EM |
380 | return FALSE; |
381 | } | |
f85b1d20 EM |
382 | |
383 | /** | |
100fef9d | 384 | * Output code from error function |
f85b1d20 EM |
385 | * @param string $content |
386 | */ | |
00be9182 | 387 | public function outputError($content) { |
f85b1d20 EM |
388 | echo CRM_Utils_System::theme($content); |
389 | } | |
e0dd98a5 EM |
390 | |
391 | /** | |
392 | * Log error to CMS | |
393 | */ | |
00be9182 | 394 | public function logger($message) { |
e0dd98a5 EM |
395 | |
396 | } | |
f9f361d0 CW |
397 | |
398 | /** | |
399 | * Append to coreResourcesList | |
400 | */ | |
e7292422 TO |
401 | public function appendCoreResources(&$list) { |
402 | } | |
6a488035 | 403 | } |