コード例 #1
0
 /**
  * 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;
 }