/** * Installs an extension. * * @param $fetchData * @param $loc * @param $version * @param $uploadedTempFile * @param $dontDelete * @return mixed|string */ public function installExtension($fetchData, $loc, $version, $uploadedTempFile, $dontDelete) { $xmlHandler =& $this->parentObject->xmlHandler; $extensionList =& $this->parentObject->extensionList; $extensionDetails =& $this->parentObject->extensionDetails; $content = ''; if (tx_em_Tools::importAsType($loc)) { if (is_array($fetchData)) { // There was some data successfully transferred if ($fetchData[0]['extKey'] && is_array($fetchData[0]['FILES'])) { $extKey = $fetchData[0]['extKey']; if (!isset($fetchData[0]['EM_CONF']['constraints'])) { $fetchData[0]['EM_CONF']['constraints'] = $xmlHandler->extensionsXML[$extKey]['versions'][$version]['dependencies']; } $EM_CONF = tx_em_Tools::fixEMCONF($fetchData[0]['EM_CONF']); if (!$EM_CONF['lockType'] || !strcmp($EM_CONF['lockType'], $loc)) { // check dependencies, act accordingly if ext is loaded list($instExtInfo, ) = $extensionList->getInstalledExtensions(); $depStatus = $this->checkDependencies($extKey, $EM_CONF, $instExtInfo); if (t3lib_extMgm::isLoaded($extKey) && !$depStatus['returnCode']) { $content .= $depStatus['html']; if ($uploadedTempFile) { $content .= '<input type="hidden" name="CMD[alreadyUploaded]" value="' . $uploadedTempFile . '" />'; } } else { $res = $this->clearAndMakeExtensionDir($fetchData[0], $loc, $dontDelete); if (is_array($res)) { $extDirPath = trim($res[0]); if ($extDirPath && @is_dir($extDirPath) && substr($extDirPath, -1) == '/') { $emConfFile = $extensionDetails->construct_ext_emconf_file($extKey, $EM_CONF); $dirs = tx_em_Tools::extractDirsFromFileList(array_keys($fetchData[0]['FILES'])); $res = tx_em_Tools::createDirsInPath($dirs, $extDirPath); if (!$res) { $writeFiles = $fetchData[0]['FILES']; $writeFiles['ext_emconf.php']['content'] = $emConfFile; $writeFiles['ext_emconf.php']['content_md5'] = md5($emConfFile); // Write files: foreach ($writeFiles as $theFile => $fileData) { t3lib_div::writeFile($extDirPath . $theFile, $fileData['content']); if (!@is_file($extDirPath . $theFile)) { if (!$this->silentMode) { $flashMessage = t3lib_div::makeInstance('t3lib_FlashMessage', sprintf($GLOBALS['LANG']->getLL('ext_import_file_not_created'), $extDirPath . $theFile), '', t3lib_FlashMessage::ERROR); $content .= $flashMessage->render(); } else { if (!$this->silentMode) { $flashMessage = t3lib_div::makeInstance('t3lib_FlashMessage', sprintf($GLOBALS['LANG']->getLL('ext_import_file_not_created'), $extDirPath . $theFile), '', t3lib_FlashMessage::ERROR); $content .= $flashMessage->render(); } else { $content .= sprintf($GLOBALS['LANG']->getLL('ext_import_file_not_created'), $extDirPath . $theFile) . '<br />'; } } } elseif (md5(t3lib_div::getUrl($extDirPath . $theFile)) != $fileData['content_md5']) { $content .= sprintf($GLOBALS['LANG']->getLL('ext_import_file_corrupted'), $extDirPath . $theFile) . '<br />'; } } t3lib_div::fixPermissions($extDirPath, TRUE); // No content, no errors. Create success output here: if (!$content) { $messageContent = sprintf($GLOBALS['LANG']->getLL('ext_import_success_folder'), $extDirPath) . '<br />'; $uploadSucceed = true; // Fix TYPO3_MOD_PATH for backend modules in extension: $modules = t3lib_div::trimExplode(',', $EM_CONF['module'], 1); if (count($modules)) { foreach ($modules as $mD) { $confFileName = $extDirPath . $mD . '/conf.php'; if (@is_file($confFileName)) { $messageContent .= tx_em_Tools::writeTYPO3_MOD_PATH($confFileName, $loc, $extKey . '/' . $mD . '/') . '<br />'; } else { $messageContent .= sprintf($GLOBALS['LANG']->getLL('ext_import_no_conf_file'), $confFileName) . '<br />'; } } } // NOTICE: I used two hours trying to find out why a script, ext_emconf.php, written twice and in between included by PHP did not update correct the second time. Probably something with PHP-A cache and mtime-stamps. // But this order of the code works.... (using the empty Array with type, EMCONF and files hereunder). // Writing to ext_emconf.php: $sEMD5A = $extensionDetails->serverExtensionMD5array($extKey, array('type' => $loc, 'EM_CONF' => array(), 'files' => array())); $EM_CONF['_md5_values_when_last_written'] = serialize($sEMD5A); $emConfFile = $extensionDetails->construct_ext_emconf_file($extKey, $EM_CONF); t3lib_div::writeFile($extDirPath . 'ext_emconf.php', $emConfFile); $messageContent .= 'ext_emconf.php: ' . $extDirPath . 'ext_emconf.php<br />'; $messageContent .= $GLOBALS['LANG']->getLL('ext_import_ext_type') . ' '; $messageContent .= $this->api->typeLabels[$loc] . '<br />'; $messageContent .= '<br />'; // Remove cache files: $updateContent = ''; if (t3lib_extMgm::isLoaded($extKey)) { if (t3lib_extMgm::removeCacheFiles()) { $messageContent .= $GLOBALS['LANG']->getLL('ext_import_cache_files_removed') . '<br />'; } list($new_list) = $this->parentObject->extensionList->getInstalledExtensions(); $updateContent = $this->updatesForm($extKey, $new_list[$extKey], 1, t3lib_div::linkThisScript(array('CMD[showExt]' => $extKey, 'SET[singleDetails]' => 'info'))); } if (!$this->silentMode) { $flashMessage = t3lib_div::makeInstance('t3lib_FlashMessage', $messageContent, $GLOBALS['LANG']->getLL('ext_import_success')); $content = $flashMessage->render(); } else { $content = $updateContent; } // Install / Uninstall: if (!$this->parentObject->CMD['standAlone']) { $content .= '<h3>' . $GLOBALS['LANG']->getLL('ext_import_install_uninstall') . '</h3>'; $content .= $new_list[$extKey] ? '<a href="' . htmlspecialchars(t3lib_div::linkThisScript(array('CMD[showExt]' => $extKey, 'CMD[remove]' => 1, 'CMD[clrCmd]' => 1, 'SET[singleDetails]' => 'info'))) . '">' . tx_em_Tools::removeButton() . ' ' . $GLOBALS['LANG']->getLL('ext_import_uninstall') . '</a>' : '<a href="' . htmlspecialchars(t3lib_div::linkThisScript(array('CMD[showExt]' => $extKey, 'CMD[load]' => 1, 'CMD[clrCmd]' => 1, 'SET[singleDetails]' => 'info'))) . '">' . tx_em_Tools::installButton() . ' ' . $GLOBALS['LANG']->getLL('ext_import_install') . '</a>'; } else { $content = $GLOBALS['LANG']->getLL('ext_import_imported') . '<br /><br />'; if ($this->silentMode || t3lib_div::_GP('nodoc')) { $content .= '<a id="closewindow" href="javascript:parent.TYPO3.EM.Tools.closeImportWindow();">' . $GLOBALS['LANG']->getLL('ext_import_close') . '</a>'; } else { $content .= '<a href="javascript:opener.top.list.iframe.document.forms[0].submit();window.close();">' . $GLOBALS['LANG']->getLL('ext_import_close_check') . '</a>'; } } } } else { if (!$this->silentMode) { $flashMessage = t3lib_div::makeInstance('t3lib_FlashMessage', $res, '', t3lib_FlashMessage::ERROR); $content = $flashMessage->render(); } else { $content = $res; } } } else { if (!$this->silentMode) { $flashMessage = t3lib_div::makeInstance('t3lib_FlashMessage', sprintf($GLOBALS['LANG']->getLL('ext_import_ext_path_different'), $extDirPath), '', t3lib_FlashMessage::ERROR); $content = $flashMessage->render(); } else { $content = sprintf($GLOBALS['LANG']->getLL('ext_import_ext_path_different'), $extDirPath); } } } else { if (!$this->silentMode) { $flashMessage = t3lib_div::makeInstance('t3lib_FlashMessage', $res, '', t3lib_FlashMessage::ERROR); $content = $flashMessage->render(); } else { $content = $res; } } } } else { if (!$this->silentMode) { $flashMessage = t3lib_div::makeInstance('t3lib_FlashMessage', sprintf($GLOBALS['LANG']->getLL('ext_import_ext_only_here'), $this->typePaths[$EM_CONF['lockType']], $EM_CONF['lockType']), '', t3lib_FlashMessage::ERROR); $content = $flashMessage->render(); } else { $content = sprintf($GLOBALS['LANG']->getLL('ext_import_ext_only_here'), tx_em_Tools::typePath($EM_CONF['lockType']), $EM_CONF['lockType']); } } } else { if (!$this->silentMode) { $flashMessage = t3lib_div::makeInstance('t3lib_FlashMessage', $GLOBALS['LANG']->getLL('ext_import_no_ext_key_files'), '', t3lib_FlashMessage::ERROR); $content = $flashMessage->render(); } else { $content = $GLOBALS['LANG']->getLL('ext_import_no_ext_key_files'); } } } else { if (!$this->silentMode) { $flashMessage = t3lib_div::makeInstance('t3lib_FlashMessage', sprintf($GLOBALS['LANG']->getLL('ext_import_data_transfer'), $fetchData), '', t3lib_FlashMessage::ERROR); $content = $flashMessage->render(); } else { $content = sprintf($GLOBALS['LANG']->getLL('ext_import_data_transfer'), $fetchData); } } } else { if (!$this->silentMode) { $flashMessage = t3lib_div::makeInstance('t3lib_FlashMessage', sprintf($GLOBALS['LANG']->getLL('ext_import_no_install_here'), $this->typePaths[$loc]), '', t3lib_FlashMessage::ERROR); $content = $flashMessage->render(); } else { $content = sprintf($GLOBALS['LANG']->getLL('ext_import_no_install_here'), tx_em_Tools::typePath($loc)); } } return $content; }