X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FExtension%2FMapper.php;h=dd989c8413ad4bf9b5c8ca6f19a4d2b13d577a8c;hb=c6da7104e771b5039d040499629d4da1a5780bdb;hp=ce50f74495d3a000f28f9cadcaf7fc39c13acb4a;hpb=dfbf151818668f98a0cdfe583a5d629f5cc8bb2b;p=civicrm-core.git diff --git a/CRM/Extension/Mapper.php b/CRM/Extension/Mapper.php index ce50f74495..dd989c8413 100644 --- a/CRM/Extension/Mapper.php +++ b/CRM/Extension/Mapper.php @@ -66,6 +66,12 @@ class CRM_Extension_Mapper { protected $civicrmUrl; + /** + * @var array + * Array(string $extKey => CRM_Extension_Upgrader_Interface $upgrader) + */ + protected $upgraders = []; + /** * @param CRM_Extension_Container_Interface $container * @param CRM_Utils_Cache_Interface $cache @@ -474,8 +480,7 @@ class CRM_Extension_Mapper { /** * Get a list of all installed modules, including enabled and disabled ones * - * @return array - * CRM_Core_Module + * @return CRM_Core_Module[] */ public function getModules() { $result = []; @@ -535,4 +540,56 @@ class CRM_Extension_Mapper { CRM_Extension_System::singleton()->getClassLoader()->refresh(); } + /** + * This returns a formatted string containing an extension upgrade link for the UI. + * @todo We should improve this to return more appropriate text. eg. when an extension is not installed + * it should not say "version xx is installed". + * + * @param array $remoteExtensionInfo + * @param array $localExtensionInfo + * + * @return string + */ + public function getUpgradeLink($remoteExtensionInfo, $localExtensionInfo) { + if (!empty($remoteExtensionInfo) && version_compare($localExtensionInfo['version'], $remoteExtensionInfo->version, '<')) { + return ts('Version %1 is installed. Upgrade to version %3.', [ + 1 => $localExtensionInfo['version'], + 2 => 'href="' . CRM_Utils_System::url('civicrm/admin/extensions', "action=update&id={$localExtensionInfo['key']}&key={$localExtensionInfo['key']}") . '"', + 3 => $remoteExtensionInfo->version, + ]); + } + } + + /** + * @param string $key + * Long name of the extension. + * Ex: 'org.example.myext' + * + * @return \CRM_Extension_Upgrader_Interface + */ + public function getUpgrader(string $key) { + if (!array_key_exists($key, $this->upgraders)) { + $this->upgraders[$key] = NULL; + + try { + $info = $this->keyToInfo($key); + } + catch (CRM_Extension_Exception_ParseException $e) { + CRM_Core_Session::setStatus(ts('Parse error in extension: %1', [ + 1 => $e->getMessage(), + ]), '', 'error'); + CRM_Core_Error::debug_log_message("Parse error in extension: " . $e->getMessage()); + return NULL; + } + + if (!empty($info->upgrader)) { + $class = $info->upgrader; + $u = new $class(); + $u->init(['key' => $key]); + $this->upgraders[$key] = $u; + } + } + return $this->upgraders[$key]; + } + }