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