/** * Displays a list of extensions where a newer version is available * in the TER than the one that is installed right now * integrated from the extension "ter_update_check" for TYPO3 4.2 by Christian Welzel * * @return string */ function showExtensionsToUpdate() { global $LANG; $extList = $this->getInstalledExtensions(); $content = '<table cellspacing="1" class="t3-em-extension-list t3-em-extension-list-to-update">' . '<tr class="t3-row-header">' . '<td></td>' . '<td>' . $LANG->sL('LLL:EXT:lang/locallang_mod_tools_em.xml:tab_mod_name') . '</td>' . '<td>' . $LANG->sL('LLL:EXT:lang/locallang_mod_tools_em.xml:tab_mod_key') . '</td>' . '<td>' . $LANG->sL('LLL:EXT:lang/locallang_mod_tools_em.xml:tab_mod_loc_ver') . '</td>' . '<td>' . $LANG->sL('LLL:EXT:lang/locallang_mod_tools_em.xml:tab_mod_rem_ver') . '</td>' . '<td>' . $LANG->sL('LLL:EXT:lang/locallang_mod_tools_em.xml:tab_mod_location') . '</td>' . '<td>' . $LANG->sL('LLL:EXT:lang/locallang_mod_tools_em.xml:tab_mod_comment') . '</td>' . '</tr>'; foreach ($extList[0] as $name => $data) { $this->xmlHandler->searchExtensionsXMLExact($name, '', '', TRUE, TRUE); if (!is_array($this->xmlHandler->extensionsXML[$name])) { continue; } $v = $this->xmlHandler->extensionsXML[$name]['versions']; $versions = array_keys($v); natsort($versions); $lastversion = end($versions); if ((t3lib_extMgm::isLoaded($name) || $this->parentObject->MOD_SETTINGS['display_installed']) && ($data['EM_CONF']['shy'] == 0 || $this->parentObject->MOD_SETTINGS['display_shy']) && tx_em_Tools::versionDifference($lastversion, $data['EM_CONF']['version'], 1)) { $imgInfo = @getImageSize(tx_em_Tools::getExtPath($name, $data['type']) . '/ext_icon.gif'); if (is_array($imgInfo)) { $icon = '<img src="' . $GLOBALS['BACK_PATH'] . tx_em_Tools::typeRelPath($data['type']) . $name . '/ext_icon.gif' . '" ' . $imgInfo[3] . ' alt="" />'; } elseif ($data['_ICON']) { //TODO: see if this can be removed, seems to be wrong in this context $icon = $data['_ICON']; } else { $icon = '<img src="clear.gif" width="1" height="1" alt="" />'; } $comment = '<table cellpadding="0" cellspacing="0" width="100%">'; foreach ($versions as $vk) { $va =& $v[$vk]; if (t3lib_div::int_from_ver($vk) <= t3lib_div::int_from_ver($data['EM_CONF']['version'])) { continue; } $comment .= '<tr><td valign="top" style="padding-right:2px;border-bottom:1px dotted gray">' . $vk . '</td>' . '<td valign="top" style="border-bottom:1px dotted gray">' . nl2br($va[uploadcomment]) . '</td></tr>'; } $comment .= '</table>'; $serverMD5Array = $this->parentObject->extensionDetails->serverExtensionMD5array($name, $data); if (is_array($serverMD5Array)) { ksort($serverMD5Array); } $currentMD5Array = unserialize($data['EM_CONF']['_md5_values_when_last_written']); if (is_array($currentMD5Array)) { @ksort($currentMD5Array); } $warn = ''; if (strcmp(serialize($currentMD5Array), serialize($serverMD5Array))) { $warn = '<tr class="bgColor4" style="color:red"><td colspan="7">' . tx_em_Tools::rfw('<br /><strong>' . $name . ': ' . $LANG->sL('LLL:EXT:lang/locallang_mod_tools_em.xml:msg_warn_diff') . '</strong>') . '</td></tr>' . LF; if ($this->parentObject->MOD_SETTINGS['display_files'] == 1) { $affectedFiles = tx_em_Tools::findMD5ArrayDiff($serverMD5Array, $currentMD5Array); if (count($affectedFiles)) { $warn .= '<tr class="bgColor4"><td colspan="7"><strong>' . $LANG->sL('LLL:EXT:lang/locallang_mod_tools_em.xml:msg_modified') . '</strong><br />' . tx_em_Tools::rfw(implode('<br />', $affectedFiles)) . '</td></tr>' . LF; } } } $content .= '<tr class="bgColor4"><td valign="top">' . $icon . '</td>' . '<td valign="top">' . ($data['EM_CONF']['state'] == 'excludeFromUpdates' ? '<span style="color:#cf7307">' . $data['EM_CONF']['title'] . ' ' . $LANG->sL('LLL:EXT:lang/locallang_mod_tools_em.xml:write_protected') . '</span>' : '<a href="' . t3lib_div::linkThisScript(array('CMD[importExtInfo]' => $name)) . '">' . $data[EM_CONF][title] . '</a>') . '</td>' . '<td valign="top">' . $name . '</td>' . '<td valign="top" align="right">' . $data[EM_CONF][version] . '</td>' . '<td valign="top" align="right">' . $lastversion . '</td>' . '<td valign="top" nowrap="nowrap">' . $this->api->typeLabels[$data['type']] . (strlen($data['doubleInstall']) > 1 ? '<strong> ' . tx_em_Tools::rfw($data['doubleInstall']) . '</strong>' : '') . '</td>' . '<td valign="top">' . $comment . '</td></tr>' . LF . $warn . '<tr class="bgColor4"><td colspan="7"><hr style="margin:0px" /></td></tr>' . LF; } } return $content . '</table><br />'; }
/** * Make upload array out of extension * * @param string Extension key * @param array Extension information array * @return mixed Returns array with extension upload array on success, otherwise an error string. */ function makeUploadarray($extKey, $conf) { $extPath = tx_em_Tools::getExtPath($extKey, $conf['type']); if ($extPath) { // Get files for extension: $fileArr = array(); $fileArr = t3lib_div::getAllFilesAndFoldersInPath($fileArr, $extPath, '', 0, 99, $GLOBALS['TYPO3_CONF_VARS']['EXT']['excludeForPackaging']); // Calculate the total size of those files: $totalSize = 0; foreach ($fileArr as $file) { $totalSize += filesize($file); } // If the total size is less than the upper limit, proceed: if ($totalSize < $this->maxUploadSize) { // Initialize output array: $uploadArray = array(); $uploadArray['extKey'] = $extKey; $uploadArray['EM_CONF'] = $conf['EM_CONF']; $uploadArray['misc']['codelines'] = 0; $uploadArray['misc']['codebytes'] = 0; $uploadArray['techInfo'] = $this->install->makeDetailedExtensionAnalysis($extKey, $conf, 1); // Read all files: foreach ($fileArr as $file) { $relFileName = substr($file, strlen($extPath)); $fI = pathinfo($relFileName); if ($relFileName != 'ext_emconf.php') { // This file should be dynamically written... $uploadArray['FILES'][$relFileName] = array('name' => $relFileName, 'size' => filesize($file), 'mtime' => filemtime($file), 'is_executable' => TYPO3_OS == 'WIN' ? 0 : is_executable($file), 'content' => t3lib_div::getUrl($file)); if (t3lib_div::inList('php,inc', strtolower($fI['extension']))) { $uploadArray['FILES'][$relFileName]['codelines'] = count(explode(LF, $uploadArray['FILES'][$relFileName]['content'])); $uploadArray['misc']['codelines'] += $uploadArray['FILES'][$relFileName]['codelines']; $uploadArray['misc']['codebytes'] += $uploadArray['FILES'][$relFileName]['size']; // locallang*.php files: if (substr($fI['basename'], 0, 9) == 'locallang' && strstr($uploadArray['FILES'][$relFileName]['content'], '$LOCAL_LANG')) { $uploadArray['FILES'][$relFileName]['LOCAL_LANG'] = tx_em_Tools::getSerializedLocalLang($file, $uploadArray['FILES'][$relFileName]['content']); } } $uploadArray['FILES'][$relFileName]['content_md5'] = md5($uploadArray['FILES'][$relFileName]['content']); } } // Return upload-array: return $uploadArray; } else { return sprintf($GLOBALS['LANG']->getLL('makeUploadArray_error_size'), $totalSize, t3lib_div::formatSize($this->maxUploadSize)); } } else { return sprintf($GLOBALS['LANG']->getLL('makeUploadArray_error_path'), $extKey); } }
/** * Updates the database according to extension requirements * DBAL compliant (based on Install Tool code) * * @param string Extension key * @param array Extension information array * @return void */ function forceDBupdates($extKey, $extInfo) { $instObj = new t3lib_install(); // Updating tables and fields? if (is_array($extInfo['files']) && in_array('ext_tables.sql', $extInfo['files'])) { $fileContent = t3lib_div::getUrl(tx_em_Tools::getExtPath($extKey, $extInfo['type']) . 'ext_tables.sql'); $FDfile = $instObj->getFieldDefinitions_fileContent($fileContent); if (count($FDfile)) { $FDdb = $instObj->getFieldDefinitions_database(TYPO3_db); $diff = $instObj->getDatabaseExtra($FDfile, $FDdb); $update_statements = $instObj->getUpdateSuggestions($diff); foreach ((array) $update_statements['add'] as $string) { $GLOBALS['TYPO3_DB']->admin_query($string); } foreach ((array) $update_statements['change'] as $string) { $GLOBALS['TYPO3_DB']->admin_query($string); } foreach ((array) $update_statements['create_table'] as $string) { $GLOBALS['TYPO3_DB']->admin_query($string); } } } // Importing static tables? if (is_array($extInfo['files']) && in_array('ext_tables_static+adt.sql', $extInfo['files'])) { $fileContent = t3lib_div::getUrl(tx_em_Tools::getExtPath($extKey, $extInfo['type']) . 'ext_tables_static+adt.sql'); $statements = $instObj->getStatementarray($fileContent, 1); list($statements_table, $insertCount) = $instObj->getCreateTables($statements, 1); // Traverse the tables foreach ($statements_table as $table => $query) { $GLOBALS['TYPO3_DB']->admin_query('DROP TABLE IF EXISTS ' . $table); $GLOBALS['TYPO3_DB']->admin_query($query); if ($insertCount[$table]) { $statements_insert = $instObj->getTableInsertStatements($statements, $table); foreach ($statements_insert as $v) { $GLOBALS['TYPO3_DB']->admin_query($v); } } } } }
/** * Returns the absolute path where the extension $extKey is installed (based on 'type' (SGL)) * * @param string Extension key * @param string Install scope type: L, G, S * @return string Returns the absolute path to the install scope given by input $type variable. It is checked if the path is a directory. Slash is appended. */ public function getExtPath($extKey, $type, $returnWithoutExtKey = FALSE) { return tx_em_Tools::getExtPath($extKey, $type, $returnWithoutExtKey); }
/** * Prints backupdelete * * @param string $parameter * @return string */ public function getExtensionBackupDelete($extKey) { $content = ''; /** @var $extensionList tx_em_Extensions_List*/ $extensionList = t3lib_div::makeInstance('tx_em_Extensions_List', $this); /** @var $extensionDetails tx_em_Extensions_Details */ $extensionDetails = t3lib_div::makeInstance('tx_em_Extensions_Details'); /** @var $extensionDetails tx_em_Connection_Ter */ $terConnection = t3lib_div::makeInstance('tx_em_Connection_Ter', $this); /** @var $extensionDetails tx_em_Install */ $install = t3lib_div::makeInstance('tx_em_Install'); /** @var $api tx_em_API */ $api = t3lib_div::makeInstance('tx_em_API'); list($list, ) = $extensionList->getInstalledExtensions(); $uploadArray = $extensionDetails->makeUploadarray($extKey, $list[$extKey]); if (is_array($uploadArray)) { $backUpData = $terConnection->makeUploadDataFromarray($uploadArray); $filename = 'T3X_' . $extKey . '-' . str_replace('.', '_', $list[$extKey]['EM_CONF']['version']) . '-z-' . date('YmdHi') . '.t3x'; $techInfo = $install->makeDetailedExtensionAnalysis($extKey, $list[$extKey]); $lines = array(); // Backup $lines[] = '<tr class="t3-row-header"><td colspan="2">' . $GLOBALS['LANG']->sL('LLL:EXT:em/language/locallang.xml:ext_details_backup') . '</td></tr>'; $lines[] = '<tr class="bgColor4"><td><strong>' . $GLOBALS['LANG']->sL('LLL:EXT:em/language/locallang.xml:extBackup_files') . '</strong></td><td>' . '<a class="t3-link" href="' . htmlspecialchars(t3lib_div::linkThisScript(array('CMD[doBackup]' => 1, 'CMD[showExt]' => $extKey, 'SET[singleDetails]' => 'backup'))) . '">' . sprintf($GLOBALS['LANG']->sL('LLL:EXT:em/language/locallang.xml:extBackup_download'), $extKey) . '</a><br /> (' . $filename . ', <br />' . t3lib_div::formatSize(strlen($backUpData)) . ', <br />' . $GLOBALS['LANG']->sL('LLL:EXT:em/language/locallang.xml:extBackup_md5') . ' ' . md5($backUpData) . ') <br /></td></tr>'; if (is_array($techInfo['tables'])) { $lines[] = '<tr class="bgColor4"><td><strong>' . $GLOBALS['LANG']->sL('LLL:EXT:em/language/locallang.xml:extBackup_data_tables') . '</strong></td><td>' . tx_em_Database::dumpDataTablesLine($techInfo['tables'], $extKey, array('SET[singleDetails]' => 'backup')) . '</td></tr>'; } if (is_array($techInfo['static'])) { $lines[] = '<tr class="bgColor4"><td><strong>' . $GLOBALS['LANG']->sL('LLL:EXT:em/language/locallang.xml:extBackup_static_tables') . '</strong></td><td>' . tx_em_Database::dumpDataTablesLine($techInfo['static'], $extKey, array('SET[singleDetails]' => 'backup')) . '</td></tr>'; } // Delete if (!t3lib_extMgm::isLoaded($extKey)) { // check ext scope if (tx_em_Tools::deleteAsType($list[$extKey]['type']) && t3lib_div::inList('G,L', $list[$extKey]['type'])) { $lines[] = '<tr class="t3-row-header"><td colspan="2">' . $GLOBALS['LANG']->sL('LLL:EXT:em/language/locallang.xml:ext_details_delete') . '</td></tr>'; $lines[] = '<tr class="bgColor4"><td colspan="2">' . $install->extDelete($extKey, $list[$extKey], '') . '</td></tr>'; } } // EM_CONF $lines[] = '<tr class="t3-row-header"><td colspan="2">' . $GLOBALS['LANG']->sL('LLL:EXT:em/language/locallang.xml:ext_details_update_em_conf') . '</td></tr>'; $updateEMConf = $GLOBALS['LANG']->sL('LLL:EXT:em/language/locallang.xml:extUpdateEMCONF_file'); $lines[] = '<tr class="bgColor4"><td colspan="2">' . $GLOBALS['LANG']->sL('LLL:EXT:em/language/locallang.xml:extUpdateEMCONF_info_changes') . '<br /> ' . $GLOBALS['LANG']->sL('LLL:EXT:em/language/locallang.xml:extUpdateEMCONF_info_reset') . '<br /><br />' . '<a class="t3-link emconfLink" href="#"><strong>' . $updateEMConf . '</strong> ' . sprintf($GLOBALS['LANG']->sL('LLL:EXT:em/language/locallang.xml:extDelete_from_location'), $api->typeLabels[$list[$extKey]['type']], substr(tx_em_Tools::getExtPath($extKey, $list[$extKey]['type']['type']), strlen(PATH_site))) . '</a>' . '</td></tr>'; // mod menu for singleDetails $modMenu = $GLOBALS['TBE_MODULES_EXT']['tools_em']['MOD_MENU']['singleDetails']; if (isset($modMenu) && is_array($modMenu)) { $lines[] = '<tr class="t3-row-header"><td colspan="2">' . $GLOBALS['LANG']->sL('LLL:EXT:em/language/locallang.xml:ext_details_externActions') . '</td></tr>'; $menuLinks = ''; foreach ($modMenu as $menuEntry) { $onClick = htmlspecialchars('jumpToUrl(\'mod.php?&id=0&M=tools_em&SET[singleDetails]=' . $menuEntry['name'] . '&CMD[showExt]=' . $extKey . '\');'); $menuLinks .= '<a class="t3-link" href="#" onclick="' . $onClick . '" >' . $GLOBALS['LANG']->sL($menuEntry['title'], TRUE) . '</a><br />'; } $lines[] = '<tr class="bgColor4"><td colspan="2"><p>' . $menuLinks . '</p></td></tr>'; } $content = '<table border="0" cellpadding="2" cellspacing="2">' . implode('', $lines) . '</table>'; return $this->replaceLinks($content); } }