/** * Installs (activates) an extension * * For $mode use the three constants EM_INSTALL_VERSION_MIN, EM_INSTALL_VERSION_MAX, EM_INSTALL_VERSION_STRICT * * If an extension is loaded or imported already and the version requirement is matched, it will not be * fetched from the repository. This means, if you use EM_INSTALL_VERSION_MIN, you will not always get the latest * version of an extension! * * @param string $extKey The extension key to install * @param string $version A version number that should be installed * @param int $mode If a version is requested, this determines if it is the min, max or strict version requested * @return [type] ... * @todo Make the method able to handle needed interaction somehow (unmatched dependencies) */ function installExtension($extKey, $version = null, $mode = EM_INSTALL_VERSION_MIN) { list($inst_list, ) = $this->extensionList->getInstalledExtensions(); // check if it is already installed and loaded with sufficient version if (isset($inst_list[$extKey])) { $currentVersion = $inst_list[$extKey]['EM_CONF']['version']; if (t3lib_extMgm::isLoaded($extKey)) { if ($version === null) { return array(true, $GLOBALS['LANG']->getLL('ext_import_ext_already_installed_loaded')); } else { switch ($mode) { case EM_INSTALL_VERSION_STRICT: if ($currentVersion == $version) { return array(true, $GLOBALS['LANG']->getLL('ext_import_ext_already_installed_loaded')); } break; case EM_INSTALL_VERSION_MIN: if (version_compare($currentVersion, $version, '>=')) { return array(true, $GLOBALS['LANG']->getLL('ext_import_ext_already_installed_loaded')); } break; case EM_INSTALL_VERSION_MAX: if (version_compare($currentVersion, $version, '<=')) { return array(true, $GLOBALS['LANG']->getLL('ext_import_ext_already_installed_loaded')); } break; } } } else { if (!t3lib_extMgm::isLocalconfWritable()) { return array(false, $GLOBALS['LANG']->getLL('ext_import_p_localconf')); } $newExtList = -1; switch ($mode) { case EM_INSTALL_VERSION_STRICT: if ($currentVersion == $version) { $newExtList = $this->extensionList->addExtToList($extKey, $inst_list); } break; case EM_INSTALL_VERSION_MIN: if (version_compare($currentVersion, $version, '>=')) { $newExtList = $this->extensionList->addExtToList($extKey, $inst_list); } break; case EM_INSTALL_VERSION_MAX: if (version_compare($currentVersion, $version, '<=')) { $newExtList = $this->extensionList->addExtToList($extKey, $inst_list); } break; } if ($newExtList != -1) { $this->install->writeNewExtensionList($newExtList); tx_em_Tools::refreshGlobalExtList(); $this->install->forceDBupdates($extKey, $inst_list[$extKey]); return array(true, $GLOBALS['LANG']->getLL('ext_import_ext_loaded')); } } } // at this point we know we need to import (a matching version of) the extension from TER2 // see if we have an extension list at all if (!$this->xmlHandler->countExtensions()) { $this->fetchMetaData('extensions'); } $this->xmlHandler->searchExtensionsXMLExact($extKey, '', '', true); // check if extension can be fetched if (isset($this->xmlHandler->extensionsXML[$extKey])) { $versions = array_keys($this->xmlHandler->extensionsXML[$extKey]['versions']); $latestVersion = end($versions); switch ($mode) { case EM_INSTALL_VERSION_STRICT: if (!isset($this->xmlHandler->extensionsXML[$extKey]['versions'][$version])) { return array(false, $GLOBALS['LANG']->getLL('ext_import_ext_n_a')); } break; case EM_INSTALL_VERSION_MIN: if (version_compare($latestVersion, $version, '>=')) { $version = $latestVersion; } else { return array(false, $GLOBALS['LANG']->getLL('ext_import_ext_n_a')); } break; case EM_INSTALL_VERSION_MAX: while (($v = array_pop($versions)) && version_compare($v, $version, '>=')) { // Loop until a version is found } if ($v !== null && version_compare($v, $version, '<=')) { $version = $v; } else { return array(false, $GLOBALS['LANG']->getLL('ext_import_ext_n_a')); } break; } $this->importExtFromRep($extKey, $version, 'L'); $newExtList = $this->extensionList->addExtToList($extKey, $inst_list); if ($newExtList != -1) { $this->install->writeNewExtensionList($newExtList); tx_em_Tools::refreshGlobalExtList(); $this->install->forceDBupdates($extKey, $inst_list[$extKey]); $this->translations->installTranslationsForExtension($extKey, $this->getMirrorURL()); return array(true, $GLOBALS['LANG']->getLL('ext_import_ext_imported')); } else { return array(false, $GLOBALS['LANG']->getLL('ext_import_ext_not_loaded')); } } else { return array(false, $GLOBALS['LANG']->getLL('ext_import_ext_n_a_rep')); } }