X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FUtils%2FSystem.php;h=91fc83dd25e7078316edb8e0160eb4b5d93480ab;hb=d44c681d9105af668449d16d9f53832d7982f47e;hp=01775726cf9156b10c6871c4d69f37782f5740d2;hpb=a74880802265c949ef3284b795d320396966629f;p=civicrm-core.git diff --git a/CRM/Utils/System.php b/CRM/Utils/System.php index 01775726cf..91fc83dd25 100644 --- a/CRM/Utils/System.php +++ b/CRM/Utils/System.php @@ -1,9 +1,9 @@ userSystem->url($path, $query, $absolute, $fragment, $htmlize, $frontend, $forceBackend); } + /** + * @param $text + * @param null $path + * @param null $query + * @param bool $absolute + * @param null $fragment + * @param bool $htmlize + * @param bool $frontend + * @param bool $forceBackend + * + * @return string + */ static function href($text, $path = NULL, $query = NULL, $absolute = TRUE, $fragment = NULL, $htmlize = TRUE, $frontend = FALSE, $forceBackend = FALSE ) { @@ -240,11 +273,17 @@ class CRM_Utils_System { return "$text"; } + /** + * @return mixed + */ static function permissionDenied() { $config = CRM_Core_Config::singleton(); return $config->userSystem->permissionDenied(); } + /** + * @return mixed + */ static function logout() { $config = CRM_Core_Config::singleton(); return $config->userSystem->logout(); @@ -270,13 +309,13 @@ class CRM_Utils_System { } /** - * this function is called from a template to compose a url + * This function is called from a template to compose a url. * - * @param array $params list of parameters + * @param array $params + * List of parameters. * * @return string url * @access public - * @static */ static function crmURL($params) { $p = CRM_Utils_Array::value('p', $params); @@ -296,14 +335,12 @@ class CRM_Utils_System { } /** - * sets the title of the page + * Sets the title of the page. * * @param string $title * @param string $pageTitle * - * @return void * @access public - * @static */ static function setTitle($title, $pageTitle = NULL) { self::$title = $title; @@ -312,13 +349,15 @@ class CRM_Utils_System { } /** - * figures and sets the userContext. Uses the referer if valid - * else uses the default + * Figures and sets the userContext. * - * @param array $names refererer should match any str in this array - * @param string $default the default userContext if no match found + * Uses the referer if valid else uses the default. + * + * @param array $names + * Refererer should match any str in this array. + * @param string $default + * (optional) The default userContext if no match found. * - * @return void * @access public */ static function setUserContext($names, $default = NULL) { @@ -342,27 +381,27 @@ class CRM_Utils_System { } /** - * gets a class name for an object + * Gets a class name for an object. * - * @param object $object - object whose class name is needed + * @param object $object + * Object whose class name is needed. * - * @return string $className - class name + * @return string + * The class name of the object. * * @access public - * @static */ static function getClassName($object) { return get_class($object); } /** - * redirect to another url + * Redirect to another URL. * - * @param string $url the url to goto + * @param string $url + * The URL to provide to the browser via the Location header. * - * @return void * @access public - * @static */ static function redirect($url = NULL) { if (!$url) { @@ -372,19 +411,33 @@ class CRM_Utils_System { // replace the & characters with & // this is kinda hackish but not sure how to do it right $url = str_replace('&', '&', $url); + + // If we are in a json context, respond appropriately + if (CRM_Utils_Array::value('snippet', $_GET) === 'json') { + CRM_Core_Page_AJAX::returnJsonResponse(array( + 'status' => 'redirect', + 'userContext' => $url, + )); + } + header('Location: ' . $url); self::civiExit(); } /** - * use a html based file with javascript embedded to redirect to another url + * Redirect to another URL using JavaScript. + * + * Use an html based file with javascript embedded to redirect to another url * This prevent the too many redirect errors emitted by various browsers * - * @param string $url the url to goto + * @param string $url + * (optional) The destination URL. + * @param string $title + * (optional) The page title to use for the redirect page. + * @param string $message + * (optional) The message to provide in the body of the redirect page. * - * @return void * @access public - * @static */ static function jsRedirect( $url = NULL, @@ -420,14 +473,11 @@ class CRM_Utils_System { } /** - * Append an additional breadcrumb tag to the existing breadcrumb + * Append an additional breadcrumb tag to the existing breadcrumbs. * - * @param string $title - * @param string $url + * @param $breadCrumbs * - * @return void * @access public - * @static */ static function appendBreadCrumb($breadCrumbs) { $config = CRM_Core_Config::singleton(); @@ -435,11 +485,9 @@ class CRM_Utils_System { } /** - * Reset an additional breadcrumb tag to the existing breadcrumb + * Reset an additional breadcrumb tag to the existing breadcrumb. * - * @return void * @access public - * @static */ static function resetBreadCrumb() { $config = CRM_Core_Config::singleton(); @@ -447,13 +495,11 @@ class CRM_Utils_System { } /** - * Append a string to the head of the html file + * Append a string to the head of the HTML file. * - * @param string $head the new string to be appended + * @param string $bc * - * @return void * @access public - * @static */ static function addHTMLHead($bc) { $config = CRM_Core_Config::singleton(); @@ -461,13 +507,14 @@ class CRM_Utils_System { } /** - * figure out the post url for the form + * Determine the post URL for a form * - * @param the default action if one is pre-specified + * @param $action + * The default action if one is pre-specified. * - * @return string the url to post the form + * @return string + * The URL to post the form. * @access public - * @static */ static function postURL($action) { $config = CRM_Core_Config::singleton(); @@ -475,11 +522,9 @@ class CRM_Utils_System { } /** - * rewrite various system urls to https + * Rewrite various system URLs to https. * - * @return void - * access public - * @static + * @access public */ static function mapConfigToSSL() { $config = CRM_Core_Config::singleton(); @@ -494,19 +539,18 @@ class CRM_Utils_System { } /** - * Get the base URL from the system - * - * @param + * Get the base URL of the system. * * @return string * @access public - * @static */ static function baseURL() { $config = CRM_Core_Config::singleton(); return $config->userFrameworkBaseURL; } + /** + */ static function authenticateAbort($message, $abort) { if ($abort) { echo $message; @@ -517,6 +561,12 @@ class CRM_Utils_System { } } + /** + * @param bool $abort + * (optional) Whether to exit; defaults to true. + * + * @return bool + */ static function authenticateKey($abort = TRUE) { // also make sure the key is sent and is valid $key = trim(CRM_Utils_Array::value('key', $_REQUEST)); @@ -556,9 +606,18 @@ class CRM_Utils_System { return TRUE; } + /** + * @param bool $abort + * @param null $name + * @param null $pass + * @param bool $storeInSession + * @param bool $loadCMSBootstrap + * @param bool $requireKey + * + * @return bool + */ static function authenticateScript($abort = TRUE, $name = NULL, $pass = NULL, $storeInSession = TRUE, $loadCMSBootstrap = TRUE, $requireKey = TRUE) { - // auth to make sure the user has a login/password to do a shell - // operation + // auth to make sure the user has a login/password to do a shell operation // later on we'll link this to acl's if (!$name) { $name = trim(CRM_Utils_Array::value('name', $_REQUEST)); @@ -603,25 +662,30 @@ class CRM_Utils_System { } /** - * Authenticate the user against the uf db + * Authenticate the user against the uf db. * - * @param string $name the user name - * @param string $password the password for the above user name + * In case of succesful authentication, returns an array consisting of + * (contactID, ufID, unique string). Returns FALSE if authentication is + * unsuccessful. * - * @return mixed false if no auth - * array( - contactID, ufID, unique string ) if success + * @param string $name + * The username. + * @param string $password + * The password. + * @param bool $loadCMSBootstrap + * @param $realPath + * + * @return false|array * @access public - * @static */ static function authenticate($name, $password, $loadCMSBootstrap = FALSE, $realPath = NULL) { $config = CRM_Core_Config::singleton(); - // before we do any loading, lets start the session and write to it - // we typically call authenticate only when we need to bootstrap the CMS directly via Civi - // and hence bypass the normal CMS auth and bootstrap process - // typically done in cli and cron scripts - // CRM-12648 + /* Before we do any loading, let's start the session and write to it. + * We typically call authenticate only when we need to bootstrap the CMS + * directly via Civi and hence bypass the normal CMS auth and bootstrap + * process typically done in CLI and cron scripts. See: CRM-12648 + */ $session = CRM_Core_Session::singleton(); $session->set( 'civicrmInitSession', TRUE ); @@ -630,12 +694,12 @@ class CRM_Utils_System { } /** - * Set a message in the UF to display to a user + * Set a message in the UF to display to a user. * - * @param string $name the message to set + * @param string $message + * The message to set. * * @access public - * @static */ static function setUFMessage($message) { $config = CRM_Core_Config::singleton(); @@ -643,7 +707,13 @@ class CRM_Utils_System { } - + /** + * Determine whether a value is null-ish. + * + * @param $value + * The value to check for null. + * @return bool + */ static function isNull($value) { // FIXME: remove $value = 'null' string test when we upgrade our DAO code to handle passing null in a better way. if (!isset($value) || $value === NULL || $value === '' || $value === 'null') { @@ -660,6 +730,16 @@ class CRM_Utils_System { return FALSE; } + /** + * Obscure all but the last few digits of a credit card number. + * + * @param string $number + * The credit card number to obscure. + * @param int $keep + * (optional) The number of digits to preserve unmodified. + * @return string + * The obscured credit card number. + */ static function mungeCreditCard($number, $keep = 4) { $number = trim($number); if (empty($number)) { @@ -669,7 +749,11 @@ class CRM_Utils_System { return substr_replace($number, $replace, 0, -$keep); } - /** parse php modules from phpinfo */ + /** + * Determine which PHP modules are loaded. + * + * @return array + */ public static function parsePHPModules() { ob_start(); phpinfo(INFO_MODULES); @@ -703,12 +787,20 @@ class CRM_Utils_System { return $vModules; } - /** get a module setting */ + /** + * Get a setting from a loaded PHP module. + */ public static function getModuleSetting($pModuleName, $pSetting) { $vModules = self::parsePHPModules(); return $vModules[$pModuleName][$pSetting]; } + /** + * @param $title + * (optional) + * + * @return mixed|string + */ static function memory($title = NULL) { static $pid = NULL; if (!$pid) { @@ -723,9 +815,18 @@ class CRM_Utils_System { return $memory; } + /** + * @param string $name + * @param string $mimeType + * @param $buffer + * @param string $ext + * @param bool $output + * @param string $disposition + */ static function download($name, $mimeType, &$buffer, $ext = NULL, - $output = TRUE + $output = TRUE, + $disposition = 'attachment' ) { $now = gmdate('D, d M Y H:i:s') . ' GMT'; @@ -746,7 +847,7 @@ class CRM_Utils_System { header('Pragma: public'); } else { - header("Content-Disposition: attachment; $fileString"); + header("Content-Disposition: $disposition; $fileString"); header('Pragma: no-cache'); } @@ -756,6 +857,13 @@ class CRM_Utils_System { } } + /** + * Gather and print (and possibly log) amount of used memory. + * + * @param string $title + * @param bool $log + * (optional) Whether to log the memory usage information. + */ static function xMemory($title = NULL, $log = FALSE) { $mem = (float ) xdebug_memory_usage() / (float )(1024); $mem = number_format($mem, 5) . ", " . time(); @@ -770,6 +878,17 @@ class CRM_Utils_System { } } + /** + * Take a URL (or partial URL) and make it better. + * + * Currently, URLs pass straight through unchanged unless they are "seriously + * malformed" (see http://us2.php.net/parse_url). + * + * @param string $url + * The URL to operate on. + * @return string + * The fixed URL. + */ static function fixURL($url) { $components = parse_url($url); @@ -783,12 +902,12 @@ class CRM_Utils_System { } /** - * make sure the callback is valid in the current context + * Make sure a callback is valid in the current context. * - * @param string $callback the name of the function + * @param string $callback + * Name of the function to check. * - * @return boolean - * @static + * @return bool */ static function validCallback($callback) { if (self::$_callbacks === NULL) { @@ -823,9 +942,16 @@ class CRM_Utils_System { } /** - * This serves as a wrapper to the php explode function - * we expect exactly $limit arguments in return, and if we dont - * get them, we pad it with null + * Like PHP's built-in explode(), but always return an array of $limit items. + * + * This serves as a wrapper to the PHP explode() function. In the event that + * PHP's explode() returns an array with fewer than $limit elements, pad + * the end of the array with NULLs. + * + * @param string $separator + * @param string $string + * @param int $limit + * @return string[] */ static function explode($separator, $string, $limit) { $result = explode($separator, $string, $limit); @@ -835,6 +961,14 @@ class CRM_Utils_System { return $result; } + /** + * @param string $url + * The URL to check. + * @param bool $addCookie + * (optional) + * + * @return mixed + */ static function checkURL($url, $addCookie = FALSE) { // make a GET request to $url $ch = curl_init($url); @@ -845,11 +979,25 @@ class CRM_Utils_System { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // lets capture the return stuff rather than echo - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true ); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE ); - return curl_exec($ch); + // CRM-13227, CRM-14744: only return the SSL error status + return (curl_exec($ch) !== FALSE); } + /** + * Assert that we are running on a particular PHP version. + * + * @param int $ver + * The major version of PHP that is required. + * @param bool $abort + * (optional) Whether to fatally abort if the version requirement is not + * met. Defaults to TRUE. + * @return bool + * Returns TRUE if the requirement is met, FALSE if the requirement is not + * met and we're not aborting due to the failed requirement. If $abort is + * TRUE and the requirement fails, this function does not return. + */ static function checkPHPVersion($ver = 5, $abort = TRUE) { $phpVersion = substr(PHP_VERSION, 0, 1); if ($phpVersion >= $ver) { @@ -864,6 +1012,12 @@ class CRM_Utils_System { return FALSE; } + /** + * @param $string + * @param bool $encode + * + * @return string + */ static function formatWikiURL($string, $encode = FALSE) { $items = explode(' ', trim($string), 2); if (count($items) == 2) { @@ -878,6 +1032,11 @@ class CRM_Utils_System { return "$title"; } + /** + * @param string $url + * + * @return null|string + */ static function urlEncode($url) { $items = parse_url($url); if ($items === FALSE) { @@ -909,9 +1068,10 @@ class CRM_Utils_System { } /** - * Function to return the latest civicrm version. + * Return the running civicrm version. * - * @return string civicrm version + * @return string + * civicrm version * @access public */ static function version() { @@ -949,10 +1109,20 @@ class CRM_Utils_System { return $version; } + /** + * Determines whether a string is a valid CiviCRM version string. + * + * @param string $version + * Version string to be checked. + * @return bool + */ static function isVersionFormatValid($version) { return preg_match("/^(\d{1,2}\.){2,3}(\d{1,2}|(alpha|beta)\d{1,2})(\.upgrade)?$/", $version); } + /** + * Wraps or emulates PHP's getallheaders() function. + */ static function getAllHeaders() { if (function_exists('getallheaders')) { return getallheaders(); @@ -976,6 +1146,8 @@ class CRM_Utils_System { return $headers; } + /** + */ static function getRequestHeaders() { if (function_exists('apache_request_headers')) { return apache_request_headers(); @@ -986,17 +1158,20 @@ class CRM_Utils_System { } /** - * Check and determine is this is an SSL request - * Note that we inline this function in install/civicrm.php, so if - * you change this function, please go and change the code in the install script + * Determine whether this is an SSL request. + * + * Note that we inline this function in install/civicrm.php, so if you change + * this function, please go and change the code in the install script as well. */ static function isSSL( ) { return (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && - strtolower($_SERVER['HTTPS']) != 'off') ? true : false; + strtolower($_SERVER['HTTPS']) != 'off') ? TRUE : FALSE; } + /** + */ static function redirectToSSL($abort = FALSE) { $config = CRM_Core_Config::singleton(); $req_headers = self::getRequestHeaders(); @@ -1024,18 +1199,29 @@ class CRM_Utils_System { /* * Get logged in user's IP address. * - * Get IP address from HTTP Header. If the CMS is Drupal then use the Drupal function - * as this also handles reverse proxies (based on proper configuration in settings.php) + * Get IP address from HTTP REMOTE_ADDR header. If the CMS is Drupal then use + * the Drupal function as this also handles reverse proxies (based on proper + * configuration in settings.php) + * + * @param bool $strictIPV4 + * (optional) Whether to return only IPv4 addresses. + * + * @return string + * IP address of logged in user. + */ + /** + * @param bool $strictIPV4 * - * @return string ip address of logged in user + * @return mixed|string */ static function ipAddress($strictIPV4 = TRUE) { $address = CRM_Utils_Array::value('REMOTE_ADDR', $_SERVER); $config = CRM_Core_Config::singleton(); - if ($config->userSystem->is_drupal) { - //drupal function handles the server being behind a proxy securely - $address = ip_address(); + if ($config->userSystem->is_drupal && function_exists('ip_address')) { + //drupal function handles the server being behind a proxy securely. We still have legacy ipn methods + // that reach this point without bootstrapping hence the check that the fn exists + $address = ip_address(); } // hack for safari @@ -1056,9 +1242,10 @@ class CRM_Utils_System { } /** - * Returns you the referring / previous page url + * Get the referring / previous page URL. * - * @return string the previous page url + * @return string + * The previous page URL * @access public */ static function refererPath() { @@ -1066,9 +1253,10 @@ class CRM_Utils_System { } /** - * Returns default documentation URL base + * Get the documentation base URL. * - * @return string documentation url + * @return string + * Base URL of the CRM documentation. * @access public */ static function getDocBaseURL() { @@ -1077,7 +1265,7 @@ class CRM_Utils_System { } /** - * Returns wiki (alternate) documentation URL base + * Returns wiki (alternate) documentation URL base. * * @return string documentation url * @access public @@ -1089,16 +1277,26 @@ class CRM_Utils_System { /** * Returns URL or link to documentation page, based on provided parameters. + * * For use in PHP code. - * WARNING: Always returns URL, if ts function is not defined ($URLonly has no effect). + * WARNING: Always returns URL, if ts function is not defined ($URLonly has + * no effect). + * + * @param string $page + * Title of documentation wiki page. + * @param boolean $URLonly + * (optional) Whether to return URL only or full HTML link (default). + * @param string $text + * (optional) Text of HTML link (no effect if $URLonly = false). + * @param string $title + * (optional) Tooltip text for HTML link (no effect if $URLonly = false) + * @param string $style + * (optional) Style attribute value for HTML link (no effect if $URLonly = false) * - * @param string $page Title of documentation wiki page - * @param boolean $URLonly Whether function should return URL only or whole link (default) - * @param string $text Text of HTML link (no effect if $URLonly = false) - * @param string $title Tooltip text for HTML link (no effect if $URLonly = false) - * @param string $style Style attribute value for HTML link (no effect if $URLonly = false) + * @param null $resource * - * @return string URL or link to documentation page, based on provided parameters + * @return string + * URL or link to documentation page, based on provided parameters. * @access public */ static function docURL2($page, $URLonly = FALSE, $text = NULL, $title = NULL, $style = NULL, $resource = NULL) { @@ -1127,11 +1325,14 @@ class CRM_Utils_System { /** * Returns URL or link to documentation page, based on provided parameters. + * * For use in templates code. * - * @param array $params An array of parameters (see CRM_Utils_System::docURL2 method for names) + * @param array $params + * An array of parameters (see CRM_Utils_System::docURL2 method for names) * - * @return string URL or link to documentation page, based on provided parameters + * @return string + * URL or link to documentation page, based on provided parameters. * @access public */ static function docURL($params) { @@ -1167,14 +1368,15 @@ class CRM_Utils_System { return $link; } else { - return "{$params['text']}"; + return "{$params['text']}"; } } /** * Get the locale set in the hosting CMS * - * @return string the used locale or null for none + * @return string + * The used locale or null for none. */ static function getUFLocale() { $config = CRM_Core_Config::singleton(); @@ -1182,16 +1384,18 @@ class CRM_Utils_System { } /** - * Execute external or internal urls and return server response + * Execute external or internal URLs and return server response. * - * @param string $url request url - * @param boolean $addCookie should be true to access internal urls + * @param string $url + * Request URL. + * @param bool $addCookie + * Whether to provide a cookie. Should be true to access internal URLs. * - * @return string $response response from url - * @static + * @return string + * Response from URL. */ static function getServerResponse($url, $addCookie = TRUE) { - CRM_Core_Error::ignoreException(); + CRM_Core_TemporaryErrorScope::ignoreException(); require_once 'HTTP/Request.php'; $request = new HTTP_Request($url); @@ -1213,10 +1417,11 @@ class CRM_Utils_System { $request->sendRequest(); $response = $request->getResponseBody(); - CRM_Core_Error::setCallback(); return $response; } + /** + */ static function isDBVersionValid(&$errorMessage) { $dbVersion = CRM_Core_BAO_Domain::version(); @@ -1259,6 +1464,12 @@ class CRM_Utils_System { return TRUE; } + /** + * Exit with provided exit code. + * + * @param int $status + * (optional) Code with which to exit. + */ static function civiExit($status = 0) { // move things to CiviCRM cache as needed CRM_Core_Session::storeSessionObjects(); @@ -1267,8 +1478,7 @@ class CRM_Utils_System { } /** - * Reset the various system caches and some important - * static variables + * Reset the various system caches and some important static variables. */ static function flushCache( ) { // flush out all cache entries so we can reload new data @@ -1300,13 +1510,16 @@ class CRM_Utils_System { } /** - * load cms bootstrap - * - * @param $params array with uid name and pass - * @param $loadUser boolean load user or not + * Load CMS bootstrap. + * + * @param array $params + * Array with uid name and pass + * @param bool $loadUser + * Boolean load user or not. + * @param bool $throwError + * @param $realPath */ - static function loadBootStrap($params = array( - ), $loadUser = TRUE, $throwError = TRUE, $realPath = NULL) { + static function loadBootStrap($params = array(), $loadUser = TRUE, $throwError = TRUE, $realPath = NULL) { if (!is_array($params)) { $params = array(); } @@ -1315,9 +1528,9 @@ class CRM_Utils_System { } /** - * check is user logged in. + * Check if user is logged in. * - * @return boolean. + * @return bool */ public static function isUserLoggedIn() { $config = CRM_Core_Config::singleton(); @@ -1327,13 +1540,16 @@ class CRM_Utils_System { /** * Get current logged in user id. * - * @return int ufId, currently logged in user uf id. + * @return int + * ufId, currently logged in user uf id. */ public static function getLoggedInUfID() { $config = CRM_Core_Config::singleton(); return $config->userSystem->getLoggedInUfID(); } + /** + */ static function baseCMSURL() { static $_baseURL = NULL; if (!$_baseURL) { @@ -1374,6 +1590,12 @@ class CRM_Utils_System { return $_baseURL; } + /** + * Given a URL, return a relative URL if possible. + * + * @param string $url + * @return string + */ static function relativeURL($url) { // check if url is relative, if so return immediately if (substr($url, 0, 4) != 'http') { @@ -1393,6 +1615,14 @@ class CRM_Utils_System { return $url; } + /** + * Produce an absolute URL from a possibly-relative URL. + * + * @param string $url + * @param bool $removeLanguagePart + * + * @return string + */ static function absoluteURL($url, $removeLanguagePart = FALSE) { // check if url is already absolute, if so return immediately if (substr($url, 0, 4) == 'http') { @@ -1412,12 +1642,11 @@ class CRM_Utils_System { } /** - * Function to clean url, replaces first '&' with '?' + * clean url, replaces first '&' with '?' * * @param string $url * * @return string $url, clean url - * @static */ static function cleanUrl($url) { if (!$url) { @@ -1436,8 +1665,10 @@ class CRM_Utils_System { * * @param string $url * + * @param bool $addLanguagePart + * @param bool $removeLanguagePart + * * @return string $url, formatted url. - * @static */ static function languageNegotiationURL($url, $addLanguagePart = TRUE, @@ -1452,13 +1683,13 @@ class CRM_Utils_System { * the custom template directory. This does not work if there are * multiple custom template directories * - * @param string $fileName - the name of the tpl file that we are processing - * @param string $content (by reference) - the current content string - * @param string $overideFileName - an optional parameter which is sent by contribution/event reg/profile pages - * which uses a id specific extra file name if present - * - * @return void - the content string is modified if needed - * @static + * @param string $fileName + * The name of the tpl file that we are processing. + * @param string $content + * The current content string. May be modified by this function. + * @param string $overideFileName + * (optional) Sent by contribution/event reg/profile pages which uses a id + * specific extra file name if present. */ static function appendTPLFile($fileName, &$content, @@ -1484,12 +1715,14 @@ class CRM_Utils_System { * * @author Ken Zalewski * - * @param string $relpath a relative path, typically pointing to - * a directory with multiple class files + * @param string $relpath + * A relative path, typically pointing to a directory with multiple class + * files. * - * @return array An array of files that exist in one or more of the - * directories that are referenced by the relative path - * when appended to each element of the PHP include path + * @return array + * An array of files that exist in one or more of the directories that are + * referenced by the relative path when appended to each element of the PHP + * include path. * @access public */ static function listIncludeFiles($relpath) { @@ -1517,20 +1750,23 @@ class CRM_Utils_System { * * @author Ken Zalewski * - * @param string $relpath a relative path referencing a directory that - * contains one or more plugins - * @param string $fext only files with this extension will be considered - * to be plugins - * @param array $skipList list of files to skip - * - * @return array List of plugins, where the plugin name is both the - * key and the value of each element. + * @param string $relpath + * A relative path referencing a directory that contains one or more + * plugins. + * @param string $fext + * (optional) Only files with this extension will be considered to be + * plugins. + * @param array $skipList + * (optional) List of files to skip. + * + * @return array + * List of plugins, where the plugin name is both the key and the value of + * each element. * @access public */ - static function getPluginList($relpath, $fext = '.php', $skipList = array( - )) { - $fext_len = strlen($fext); - $plugins = array(); + static function getPluginList($relpath, $fext = '.php', $skipList = array()) { + $fext_len = strlen($fext); + $plugins = array(); $inc_files = CRM_Utils_System::listIncludeFiles($relpath); foreach ($inc_files as $inc_file) { if (substr($inc_file, 0 - $fext_len) == $fext) { @@ -1546,11 +1782,6 @@ class CRM_Utils_System { /** * - * @param string $fileName - the name of the tpl file that we are processing - * @param string $content (by reference) - the current content string - * - * @return void - the content string is modified if needed - * @static */ static function executeScheduledJobs() { $facility = new CRM_Core_JobManager(); @@ -1566,7 +1797,7 @@ class CRM_Utils_System { } /** - * Evaluate any tokens in a URL + * Evaluate any tokens in a URL. * * @param string|FALSE $url * @return string|FALSE @@ -1607,5 +1838,68 @@ class CRM_Utils_System { } return $cache; } -} + /** + * @return bool + */ + static function isInUpgradeMode() { + $args = explode('/', $_GET['q']); + $upgradeInProcess = CRM_Core_Session::singleton()->get('isUpgradePending'); + if ((isset($args[1]) && $args[1] == 'upgrade') || $upgradeInProcess) { + return TRUE; + } + else { + return FALSE; + } + } + + /** + * Determine the standard URL for viewing or editing the specified link + * + * This function delegates the decision-making to (a) the hook system and + * (b) the BAO system. + * + * @param array $crudLinkSpec with keys: + * - action: int, CRM_Core_Action::UPDATE or CRM_Core_Action::VIEW [default: VIEW] + * - entity_table: string, eg "civicrm_contact" + * - entity_id: int + * @return array|NULL NULL if unavailable, or an array. array has keys: + * - path: string + * - query: array + * - title: string + * - url: string + */ + static function createDefaultCrudLink($crudLinkSpec) { + $crudLinkSpec['action'] = CRM_Utils_Array::value('action', $crudLinkSpec, CRM_Core_Action::VIEW); + $daoClass = CRM_Core_DAO_AllCoreTables::getClassForTable($crudLinkSpec['entity_table']); + if (!$daoClass) { + return NULL; + } + + $baoClass = str_replace('_DAO_', '_BAO_', $daoClass); + if (!class_exists($baoClass)) { + return NULL; + } + + $bao = new $baoClass(); + $bao->id = $crudLinkSpec['entity_id']; + if (!$bao->find(TRUE)) { + return NULL; + } + + $link = array(); + CRM_Utils_Hook::crudLink($crudLinkSpec, $bao, $link); + if (empty($link) && is_callable(array($bao, 'createDefaultCrudLink'))) { + $link = $bao->createDefaultCrudLink($crudLinkSpec); + } + + if (!empty($link)) { + if (!isset($link['url'])) { + $link['url'] = self::url($link['path'], $link['query'], TRUE, NULL, FALSE); + } + return $link; + } + + return NULL; + } +}