[cleanup] Remove deprecated pattern &CRM_Core_Config::singleton()
[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 /**
9 * Deprecated property to check if this is a drupal install.
10 *
11 * The correct method is to have functions on the UF classes for all UF specific
12 * functions and leave the codebase oblivious to the type of CMS
13 *
14 * @var bool
15 * @deprecated
16 * TRUE, if the CMS is Drupal.
17 */
18 public $is_drupal = FALSE;
19
20 /**
21 * 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
22 * functions and leave the codebase oblivious to the type of CMS
23 *
24 * @var bool
25 * @deprecated
26 * TRUE, if the CMS is Joomla!.
27 */
28 public $is_joomla = FALSE;
29
30 /**
31 * 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
32 * functions and leave the codebase oblivious to the type of CMS
33 *
34 * @var bool
35 * @deprecated
36 * TRUE, if the CMS is WordPress.
37 */
38 public $is_wordpress = FALSE;
39
40 /**
41 * Does this CMS / UF support a CMS specific logging mechanism?
42 * @var bool
43 * @todo - we should think about offering up logging mechanisms in a way that is also extensible by extensions
44 */
45 public $supports_UF_Logging = FALSE;
46
47 /**
48 * @var bool
49 * TRUE, if the CMS allows CMS forms to be extended by hooks.
50 */
51 public $supports_form_extensions = FALSE;
52
53 public function initialize() {
54 if (\CRM_Utils_System::isSSL()) {
55 $this->mapConfigToSSL();
56 }
57 }
58
59 abstract public function loadBootStrap($params = [], $loadUser = TRUE, $throwError = TRUE, $realPath = NULL);
60
61 /**
62 * Append an additional breadcrumb tag to the existing breadcrumb.
63 *
64 * @param array $breadCrumbs
65 */
66 public function appendBreadCrumb($breadCrumbs) {
67 }
68
69 /**
70 * Reset an additional breadcrumb tag to the existing breadcrumb.
71 */
72 public function resetBreadCrumb() {
73 }
74
75 /**
76 * Append a string to the head of the html file.
77 *
78 * @param string $head
79 * The new string to be appended.
80 */
81 public function addHTMLHead($head) {
82 }
83
84 /**
85 * Rewrite various system urls to https.
86 */
87 public function mapConfigToSSL() {
88 // dont need to do anything, let CMS handle their own switch to SSL
89 }
90
91 /**
92 * Figure out the post url for QuickForm.
93 *
94 * @param string $action
95 * The default url if one is pre-specified.
96 *
97 * @return string
98 * The url to post the form.
99 */
100 public function postURL($action) {
101 $config = CRM_Core_Config::singleton();
102 if (!empty($action)) {
103 return $action;
104 }
105
106 return $this->url(CRM_Utils_Array::value($config->userFrameworkURLVar, $_GET),
107 NULL, TRUE, NULL, FALSE
108 );
109 }
110
111 /**
112 * Generate the url string to a CiviCRM path.
113 *
114 * @param string $path
115 * The path being linked to, such as "civicrm/add".
116 * @param string $query
117 * A query string to append to the link.
118 * @param bool $absolute
119 * Whether to force the output to be an absolute link (beginning with http).
120 * Useful for links that will be displayed outside the site, such as in an RSS feed.
121 * @param string $fragment
122 * A fragment identifier (named anchor) to append to the link.
123 * @param bool $frontend
124 * This link should be to the CMS front end (applies to WP & Joomla).
125 * @param bool $forceBackend
126 * This link should be to the CMS back end (applies to WP & Joomla).
127 *
128 * @return string
129 */
130 public function url(
131 $path = NULL,
132 $query = NULL,
133 $absolute = FALSE,
134 $fragment = NULL,
135 $frontend = FALSE,
136 $forceBackend = FALSE
137 ) {
138 return NULL;
139 }
140
141 /**
142 * Authenticate the user against the CMS db.
143 *
144 * @param string $name
145 * The user name.
146 * @param string $password
147 * The password for the above user.
148 * @param bool $loadCMSBootstrap
149 * Load cms bootstrap?.
150 * @param string $realPath
151 * Filename of script
152 *
153 * @return array|bool
154 * [contactID, ufID, unique string] else false if no auth
155 */
156 public function authenticate($name, $password, $loadCMSBootstrap = FALSE, $realPath = NULL) {
157 return FALSE;
158 }
159
160 /**
161 * Set a message in the CMS to display to a user.
162 *
163 * @param string $message
164 * The message to set.
165 */
166 public function setMessage($message) {
167 }
168
169 /**
170 * Load user into session.
171 *
172 * @param obj $user
173 *
174 * @return bool
175 */
176 public function loadUser($user) {
177 return TRUE;
178 }
179
180 /**
181 * Immediately stop script execution and display a 401 "Access Denied" page.
182 */
183 public function permissionDenied() {
184 CRM_Core_Error::fatal(ts('You do not have permission to access this page.'));
185 }
186
187 /**
188 * Immediately stop script execution, log out the user and redirect to the home page.
189 *
190 * @deprecated
191 * This function should be removed in favor of linking to the CMS's logout page
192 */
193 public function logout() {
194 }
195
196 /**
197 * Clear CMS caches related to the user registration/profile forms.
198 * Used when updating/embedding profiles on CMS user forms.
199 * @see CRM-3600
200 */
201 public function updateCategories() {
202 }
203
204 /**
205 * Get the locale set in the CMS.
206 *
207 * @return string|null
208 * Locale or null for none
209 */
210 public function getUFLocale() {
211 return NULL;
212 }
213
214 /**
215 * If we are using a theming system, invoke theme, else just print the content.
216 *
217 * @param string $content
218 * The content that will be themed.
219 * @param bool $print
220 * Are we displaying to the screen or bypassing theming?.
221 * @param bool $maintenance
222 * For maintenance mode.
223 *
224 * @throws Exception
225 * @return string|null
226 * NULL, If $print is FALSE, and some other criteria match up.
227 * The themed string, otherwise.
228 *
229 * @todo The return value is inconsistent.
230 * @todo Better to always return, and never print.
231 */
232 public function theme(&$content, $print = FALSE, $maintenance = FALSE) {
233 $ret = FALSE;
234
235 // TODO: Split up; this was copied verbatim from CiviCRM 4.0's multi-UF theming function
236 // but the parts should be copied into cleaner subclass implementations
237 $config = CRM_Core_Config::singleton();
238 if (
239 $config->userSystem->is_drupal &&
240 function_exists('theme') &&
241 !$print
242 ) {
243 if ($maintenance) {
244 drupal_set_breadcrumb('');
245 drupal_maintenance_theme();
246 if ($region = CRM_Core_Region::instance('html-header', FALSE)) {
247 CRM_Utils_System::addHTMLHead($region->render(''));
248 }
249 print theme('maintenance_page', ['content' => $content]);
250 exit();
251 }
252 // TODO: Figure out why D7 returns but everyone else prints
253 $ret = TRUE;
254 }
255 $out = $content;
256
257 if (
258 !$print &&
259 CRM_Core_Config::singleton()->userFramework == 'WordPress'
260 ) {
261 if (!function_exists('is_admin')) {
262 throw new \Exception('Function "is_admin()" is missing, even though WordPress is the user framework.');
263 }
264 if (!defined('ABSPATH')) {
265 throw new \Exception('Constant "ABSPATH" is not defined, even though WordPress is the user framework.');
266 }
267 if (is_admin()) {
268 require_once ABSPATH . 'wp-admin/admin-header.php';
269 }
270 else {
271 // FIXME: we need to figure out to replace civicrm content on the frontend pages
272 }
273 }
274
275 if ($ret) {
276 return $out;
277 }
278 else {
279 print $out;
280 return NULL;
281 }
282 }
283
284 /**
285 * @return string
286 */
287 public function getDefaultBlockLocation() {
288 return 'left';
289 }
290
291 /**
292 * Get the absolute path to the site's base url.
293 *
294 * @return bool|mixed|string
295 */
296 public function getAbsoluteBaseURL() {
297 if (!defined('CIVICRM_UF_BASEURL')) {
298 return FALSE;
299 }
300
301 $url = CRM_Utils_File::addTrailingSlash(CIVICRM_UF_BASEURL, '/');
302
303 //format url for language negotiation, CRM-7803
304 $url = $this->languageNegotiationURL($url);
305
306 if (CRM_Utils_System::isSSL()) {
307 $url = str_replace('http://', 'https://', $url);
308 }
309
310 return $url;
311 }
312
313 /**
314 * Get the relative path to the sites base url.
315 *
316 * @return bool
317 */
318 public function getRelativeBaseURL() {
319 $absoluteBaseURL = $this->getAbsoluteBaseURL();
320 if ($absoluteBaseURL === FALSE) {
321 return FALSE;
322 }
323 $parts = parse_url($absoluteBaseURL);
324 return $parts['path'];
325 //$this->useFrameworkRelativeBase = empty($base['path']) ? '/' : $base['path'];
326 }
327
328 /**
329 * Get CMS Version.
330 *
331 * @return string
332 */
333 public function getVersion() {
334 return 'Unknown';
335 }
336
337 /**
338 * Format the url as per language Negotiation.
339 *
340 * @param string $url
341 * @param bool $addLanguagePart
342 * @param bool $removeLanguagePart
343 *
344 * @return string
345 * Formatted url.
346 */
347 public function languageNegotiationURL(
348 $url,
349 $addLanguagePart = TRUE,
350 $removeLanguagePart = FALSE
351 ) {
352 return $url;
353 }
354
355 /**
356 * Determine the location of the CMS root.
357 *
358 * @return string|null
359 * Local file system path to CMS root, or NULL if it cannot be determined
360 */
361 public function cmsRootPath() {
362 return NULL;
363 }
364
365 /**
366 * Create a user in the CMS.
367 *
368 * @param array $params
369 * @param string $mail
370 * Email id for cms user.
371 *
372 * @return int|bool
373 * uid if user exists, false otherwise
374 */
375 public function createUser(&$params, $mail) {
376 return FALSE;
377 }
378
379 /**
380 * Update a user's email address in the CMS.
381 *
382 * @param int $ufID
383 * User ID in CMS.
384 * @param string $email
385 * Primary contact email address.
386 */
387 public function updateCMSName($ufID, $email) {
388 }
389
390 /**
391 * Check if user is logged in to the CMS.
392 *
393 * @return bool
394 */
395 public function isUserLoggedIn() {
396 return FALSE;
397 }
398
399 /**
400 * Check if user registration is permitted.
401 *
402 * @return bool
403 */
404 public function isUserRegistrationPermitted() {
405 return FALSE;
406 }
407
408 /**
409 * Check if user can create passwords or is initially assigned a system-generated one.
410 *
411 * @return bool
412 */
413 public function isPasswordUserGenerated() {
414 return FALSE;
415 }
416
417 /**
418 * Get user login URL for hosting CMS (method declared in each CMS system class)
419 *
420 * @param string $destination
421 * If present, add destination to querystring (works for Drupal only).
422 *
423 * @return string
424 * loginURL for the current CMS
425 */
426 abstract public function getLoginURL($destination = '');
427
428 /**
429 * Get the login destination string.
430 *
431 * When this is passed in the URL the user will be directed to it after filling in the CMS form.
432 *
433 * @param CRM_Core_Form $form
434 * Form object representing the 'current' form - to which the user will be returned.
435 *
436 * @return string|NULL
437 * destination value for URL
438 */
439 public function getLoginDestination(&$form) {
440 return NULL;
441 }
442
443 /**
444 * Determine the native ID of the CMS user.
445 *
446 * @param string $username
447 *
448 * @throws CRM_Core_Exception
449 */
450 public function getUfId($username) {
451 $className = get_class($this);
452 throw new CRM_Core_Exception("Not implemented: {$className}->getUfId");
453 }
454
455 /**
456 * Set the localisation from the user framework.
457 *
458 * @param string $civicrm_language
459 *
460 * @return bool
461 */
462 public function setUFLocale($civicrm_language) {
463 return TRUE;
464 }
465
466 /**
467 * Set a init session with user object.
468 *
469 * @param array $data
470 * Array with user specific data
471 */
472 public function setUserSession($data) {
473 list($userID, $ufID) = $data;
474 $session = CRM_Core_Session::singleton();
475 $session->set('ufID', $ufID);
476 $session->set('userID', $userID);
477 }
478
479 /**
480 * Reset any system caches that may be required for proper CiviCRM integration.
481 */
482 public function flush() {
483 // nullop by default
484 }
485
486 /**
487 * Flush css/js caches.
488 */
489 public function clearResourceCache() {
490 // nullop by default
491 }
492
493 /**
494 * Add a script file.
495 *
496 * Note: This function is not to be called directly
497 * @see CRM_Core_Region::render()
498 *
499 * @param string $url absolute path to file
500 * @param string $region
501 * location within the document: 'html-header', 'page-header', 'page-footer'.
502 *
503 * @return bool
504 * TRUE if we support this operation in this CMS, FALSE otherwise
505 */
506 public function addScriptUrl($url, $region) {
507 return FALSE;
508 }
509
510 /**
511 * Add an inline script.
512 *
513 * Note: This function is not to be called directly
514 * @see CRM_Core_Region::render()
515 *
516 * @param string $code javascript code
517 * @param string $region
518 * location within the document: 'html-header', 'page-header', 'page-footer'.
519 *
520 * @return bool
521 * TRUE if we support this operation in this CMS, FALSE otherwise
522 */
523 public function addScript($code, $region) {
524 return FALSE;
525 }
526
527 /**
528 * Add a css file.
529 *
530 * Note: This function is not to be called directly
531 * @see CRM_Core_Region::render()
532 *
533 * @param string $url absolute path to file
534 * @param string $region
535 * location within the document: 'html-header', 'page-header', 'page-footer'.
536 *
537 * @return bool
538 * TRUE if we support this operation in this CMS, FALSE otherwise
539 */
540 public function addStyleUrl($url, $region) {
541 return FALSE;
542 }
543
544 /**
545 * Add an inline style.
546 *
547 * Note: This function is not to be called directly
548 * @see CRM_Core_Region::render()
549 *
550 * @param string $code css code
551 * @param string $region
552 * location within the document: 'html-header', 'page-header', 'page-footer'.
553 *
554 * @return bool
555 * TRUE if we support this operation in this CMS, FALSE otherwise
556 */
557 public function addStyle($code, $region) {
558 return FALSE;
559 }
560
561 /**
562 * Sets the title of the page.
563 *
564 * @param string $title
565 * Title to set in html header
566 * @param string|null $pageTitle
567 * Title to set in html body (if different)
568 */
569 public function setTitle($title, $pageTitle = NULL) {
570 }
571
572 /**
573 * Return default Site Settings.
574 *
575 * @param string $dir
576 *
577 * @return array
578 * - $url, (Joomla - non admin url)
579 * - $siteName,
580 * - $siteRoot
581 */
582 public function getDefaultSiteSettings($dir) {
583 $config = CRM_Core_Config::singleton();
584 $url = $config->userFrameworkBaseURL;
585 return [$url, NULL, NULL];
586 }
587
588 /**
589 * Determine the default location for file storage.
590 *
591 * FIXME:
592 * 1. This was pulled out from a bigger function. It should be split
593 * into even smaller pieces and marked abstract.
594 * 2. This would be easier to compute by a calling a CMS API, but
595 * for whatever reason Civi gets it from config data.
596 *
597 * @return array
598 * - url: string. ex: "http://example.com/sites/foo.com/files/civicrm"
599 * - path: string. ex: "/var/www/sites/foo.com/files/civicrm"
600 */
601 public function getDefaultFileStorage() {
602 global $civicrm_root;
603 $config = CRM_Core_Config::singleton();
604 $baseURL = CRM_Utils_System::languageNegotiationURL($config->userFrameworkBaseURL, FALSE, TRUE);
605
606 $filesURL = NULL;
607 $filesPath = NULL;
608
609 if ($config->userFramework == 'Joomla') {
610 // gross hack
611 // we need to remove the administrator/ from the end
612 $tempURL = str_replace("/administrator/", "/", $baseURL);
613 $filesURL = $tempURL . "media/civicrm/";
614 }
615 elseif ($config->userFramework == 'UnitTests') {
616 $filesURL = $baseURL . "sites/default/files/civicrm/";
617 }
618 else {
619 throw new CRM_Core_Exception("Failed to locate default file storage ($config->userFramework)");
620 }
621
622 return [
623 'url' => $filesURL,
624 'path' => CRM_Utils_File::baseFilePath(),
625 ];
626 }
627
628 /**
629 * Determine the location of the CiviCRM source tree.
630 *
631 * FIXME:
632 * 1. This was pulled out from a bigger function. It should be split
633 * into even smaller pieces and marked abstract.
634 * 2. This would be easier to compute by a calling a CMS API, but
635 * for whatever reason we take the hard way.
636 *
637 * @return array
638 * - url: string. ex: "http://example.com/sites/all/modules/civicrm"
639 * - path: string. ex: "/var/www/sites/all/modules/civicrm"
640 */
641 public function getCiviSourceStorage() {
642 global $civicrm_root;
643 $config = CRM_Core_Config::singleton();
644
645 // Don't use $config->userFrameworkBaseURL; it has garbage on it.
646 // More generally, w shouldn't be using $config here.
647 if (!defined('CIVICRM_UF_BASEURL')) {
648 throw new RuntimeException('Undefined constant: CIVICRM_UF_BASEURL');
649 }
650 $baseURL = CRM_Utils_File::addTrailingSlash(CIVICRM_UF_BASEURL, '/');
651 if (CRM_Utils_System::isSSL()) {
652 $baseURL = str_replace('http://', 'https://', $baseURL);
653 }
654
655 if ($config->userFramework == 'Joomla') {
656 $userFrameworkResourceURL = $baseURL . "components/com_civicrm/civicrm/";
657 }
658 elseif ($config->userFramework == 'WordPress') {
659 $userFrameworkResourceURL = CIVICRM_PLUGIN_URL . "civicrm/";
660 }
661 elseif ($this->is_drupal) {
662 // Drupal setting
663 // check and see if we are installed in sites/all (for D5 and above)
664 // we dont use checkURL since drupal generates an error page and throws
665 // the system for a loop on lobo's macosx box
666 // or in modules
667 $cmsPath = $config->userSystem->cmsRootPath();
668 $userFrameworkResourceURL = $baseURL . str_replace("$cmsPath/", '',
669 str_replace('\\', '/', $civicrm_root)
670 );
671
672 $siteName = $config->userSystem->parseDrupalSiteNameFromRoot($civicrm_root);
673 if ($siteName) {
674 $civicrmDirName = trim(basename($civicrm_root));
675 $userFrameworkResourceURL = $baseURL . "sites/$siteName/modules/$civicrmDirName/";
676 }
677 }
678 else {
679 $userFrameworkResourceURL = NULL;
680 }
681
682 return [
683 'url' => CRM_Utils_File::addTrailingSlash($userFrameworkResourceURL),
684 'path' => CRM_Utils_File::addTrailingSlash($civicrm_root),
685 ];
686 }
687
688 /**
689 * Perform any post login activities required by the CMS.
690 *
691 * e.g. for drupal: records a watchdog message about the new session, saves the login timestamp,
692 * calls hook_user op 'login' and generates a new session.
693 *
694 * @param array $params
695 *
696 * FIXME: Document values accepted/required by $params
697 */
698 public function userLoginFinalize($params = []) {
699 }
700
701 /**
702 * Set timezone in mysql so that timestamp fields show the correct time.
703 */
704 public function setMySQLTimeZone() {
705 $timeZoneOffset = $this->getTimeZoneOffset();
706 if ($timeZoneOffset) {
707 $sql = "SET time_zone = '$timeZoneOffset'";
708 CRM_Core_DAO::executequery($sql);
709 }
710 }
711
712 /**
713 * Get timezone from CMS.
714 *
715 * @return string|false|null
716 */
717 public function getTimeZoneOffset() {
718 $timezone = $this->getTimeZoneString();
719 if ($timezone) {
720 if ($timezone == 'UTC' || $timezone == 'Etc/UTC') {
721 // CRM-17072 Let's short-circuit all the zero handling & return it here!
722 return '+00:00';
723 }
724 $tzObj = new DateTimeZone($timezone);
725 $dateTime = new DateTime("now", $tzObj);
726 $tz = $tzObj->getOffset($dateTime);
727
728 if ($tz === 0) {
729 // CRM-21422
730 return '+00:00';
731 }
732
733 if (empty($tz)) {
734 return FALSE;
735 }
736
737 $timeZoneOffset = sprintf("%02d:%02d", $tz / 3600, abs(($tz / 60) % 60));
738
739 if ($timeZoneOffset > 0) {
740 $timeZoneOffset = '+' . $timeZoneOffset;
741 }
742 return $timeZoneOffset;
743 }
744 return NULL;
745 }
746
747 /**
748 * Get timezone as a string.
749 * @return string
750 * Timezone string e.g. 'America/Los_Angeles'
751 */
752 public function getTimeZoneString() {
753 return date_default_timezone_get();
754 }
755
756 /**
757 * Get Unique Identifier from UserFramework system (CMS).
758 *
759 * @param object $user
760 * Object as described by the User Framework.
761 *
762 * @return mixed
763 * Unique identifier from the user Framework system
764 */
765 public function getUniqueIdentifierFromUserObject($user) {
766 return NULL;
767 }
768
769 /**
770 * Get User ID from UserFramework system (CMS).
771 *
772 * @param object $user
773 *
774 * Object as described by the User Framework.
775 * @return null|int
776 */
777 public function getUserIDFromUserObject($user) {
778 return NULL;
779 }
780
781 /**
782 * Get an array of user details for a contact, containing at minimum the user ID & name.
783 *
784 * @param int $contactID
785 *
786 * @return array
787 * CMS user details including
788 * - id
789 * - name (ie the system user name.
790 */
791 public function getUser($contactID) {
792 $ufMatch = civicrm_api3('UFMatch', 'getsingle', [
793 'contact_id' => $contactID,
794 'domain_id' => CRM_Core_Config::domainID(),
795 ]);
796 return [
797 'id' => $ufMatch['uf_id'],
798 'name' => $ufMatch['uf_name'],
799 ];
800 }
801
802 /**
803 * Get currently logged in user uf id.
804 *
805 * @return int|null
806 * logged in user uf id.
807 */
808 public function getLoggedInUfID() {
809 return NULL;
810 }
811
812 /**
813 * Get currently logged in user unique identifier - this tends to be the email address or user name.
814 *
815 * @return string|null
816 * logged in user unique identifier
817 */
818 public function getLoggedInUniqueIdentifier() {
819 return NULL;
820 }
821
822 /**
823 * Return a UFID (user account ID from the UserFramework / CMS system.
824 *
825 * ID is based on the user object passed, defaulting to the logged in user if not passed.
826 *
827 * Note that ambiguous situation occurs in CRM_Core_BAO_UFMatch::synchronize - a cleaner approach would
828 * seem to be resolving the user id before calling the function.
829 *
830 * Note there is already a function getUFId which takes $username as a param - we could add $user
831 * as a second param to it but it seems messy - just overloading it because the name is taken.
832 *
833 * @param object $user
834 *
835 * @return int
836 * User ID of UF System
837 */
838 public function getBestUFID($user = NULL) {
839 if ($user) {
840 return $this->getUserIDFromUserObject($user);
841 }
842 return $this->getLoggedInUfID();
843 }
844
845 /**
846 * Return a unique identifier (usually an email address or username) from the UserFramework / CMS system.
847 *
848 * This is based on the user object passed, defaulting to the logged in user if not passed.
849 *
850 * Note that ambiguous situation occurs in CRM_Core_BAO_UFMatch::synchronize - a cleaner approach would seem to be
851 * resolving the unique identifier before calling the function.
852 *
853 * @param object $user
854 *
855 * @return string
856 * unique identifier from the UF System
857 */
858 public function getBestUFUniqueIdentifier($user = NULL) {
859 if ($user) {
860 return $this->getUniqueIdentifierFromUserObject($user);
861 }
862 return $this->getLoggedInUniqueIdentifier();
863 }
864
865 /**
866 * List modules installed in the CMS, including enabled and disabled ones.
867 *
868 * @return array
869 * [CRM_Core_Module]
870 */
871 public function getModules() {
872 return [];
873 }
874
875 /**
876 * Get Url to view user record.
877 *
878 * @param int $contactID
879 * Contact ID.
880 *
881 * @return string|null
882 */
883 public function getUserRecordUrl($contactID) {
884 return NULL;
885 }
886
887 /**
888 * Is the current user permitted to add a user.
889 *
890 * @return bool
891 */
892 public function checkPermissionAddUser() {
893 return FALSE;
894 }
895
896 /**
897 * Output code from error function.
898 *
899 * @param string $content
900 */
901 public function outputError($content) {
902 echo CRM_Utils_System::theme($content);
903 }
904
905 /**
906 * Log error to CMS.
907 *
908 * @param string $message
909 */
910 public function logger($message) {
911 }
912
913 /**
914 * Append to coreResourcesList.
915 *
916 * @param \Civi\Core\Event\GenericHookEvent $e
917 */
918 public function appendCoreResources(\Civi\Core\Event\GenericHookEvent $e) {
919 }
920
921 /**
922 * @param string $name
923 * @param string $value
924 */
925 public function setHttpHeader($name, $value) {
926 header("$name: $value");
927 }
928
929 /**
930 * Create CRM contacts for all existing CMS users
931 *
932 * @return array
933 * @throws \Exception
934 */
935 public function synchronizeUsers() {
936 throw new Exception('CMS user creation not supported for this framework');
937 return [];
938 }
939
940 }