Esempio n. 1
0
 /**
  * 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'));
     }
 }