/** * Get extensions that have category plugin or category fe * * @param boolean $onlyKeys If true, only the extension keys are returned. * * @return array Array of frontend extension keys */ public static function getFrontendExtensions($onlyKeys = TRUE) { $extensions = array(); if (t3lib_div::int_from_ver(TYPO3_version) < 6001000) { $list = array(); /** @var $extensionList tx_em_Extensions_List */ $extensionList = t3lib_div::makeInstance('tx_em_Extensions_List'); $cat = tx_em_Tools::getDefaultCategory(); $path = PATH_typo3conf . 'ext/'; $extensionList->getInstExtList($path, $list, $cat, 'L'); } else { $list = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getLoadedExtensionListArray(); } foreach ($list as $extensionName => $extensionData) { if (isset($extensionData['EM_CONF']['category'])) { if (trim($extensionData['EM_CONF']['category']) === 'plugin' || trim($extensionData['EM_CONF']['category']) === 'fe') { if ((bool) $onlyKeys) { array_push($extensions, $extensionName); } else { $extensions[$extensionName] = $extensionData; } } } } return $extensions; }
/** * Parses content of mirrors.xml into a suitable array * * @param string XML data file to parse * @return string HTLML output informing about result */ function parseExtensionsXML($filename) { $parser = xml_parser_create(); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 0); xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'utf-8'); xml_set_element_handler($parser, array(&$this, 'startElement'), array(&$this, 'endElement')); xml_set_character_data_handler($parser, array(&$this, 'characterData')); $fp = gzopen($filename, 'rb'); if (!$fp) { return 'Error opening XML extension file "' . $filename . '"'; } $string = gzread($fp, 0xffff); // Read 64KB $idx = 0; $defaultCategories = tx_em_Tools::getDefaultCategory(); foreach ($defaultCategories as $catKey => $tmp) { $this->revCatArr[$catKey] = $idx++; } $idx = 0; $states = tx_em_Tools::getStates(); foreach ($states as $state => $tmp) { $this->revStateArr[$state] = $idx++; } $GLOBALS['TYPO3_DB']->exec_TRUNCATEquery('cache_extensions'); $extcount = 0; $content = ''; @ini_set('pcre.backtrack_limit', 500000); do { if (preg_match('/.*(<extension\\s+extensionkey="[^"]+">.*<\\/extension>)/suU', $string, $match)) { // Parse content: if (!xml_parse($parser, $match[0], 0)) { $content .= 'Error in XML parser while decoding extensions XML file. Line ' . xml_get_current_line_number($parser) . ': ' . xml_error_string(xml_get_error_code($parser)); $error = TRUE; break; } $this->storeXMLResult(); $this->extXMLResult = array(); $extcount++; $string = substr($string, strlen($match[0])); } elseif (function_exists('preg_last_error') && preg_last_error()) { $errorcodes = array(0 => 'PREG_NO_ERROR', 1 => 'PREG_INTERNAL_ERROR', 2 => 'PREG_BACKTRACK_LIMIT_ERROR', 3 => 'PREG_RECURSION_LIMIT_ERROR', 4 => 'PREG_BAD_UTF8_ERROR'); $content .= 'Error in regular expression matching, code: ' . $errorcodes[preg_last_error()] . '<br />See <a href="http://www.php.net/manual/en/function.preg-last-error.php" target="_blank">http://www.php.net/manual/en/function.preg-last-error.php</a>'; $error = TRUE; break; } else { if (gzeof($fp)) { break; } // Nothing more can be read $string .= gzread($fp, 0xffff); // Read another 64KB } } while (TRUE); xml_parser_free($parser); gzclose($fp); if (!$error) { /** @var $flashMessage t3lib_FlashMessage */ $flashMessage = t3lib_div::makeInstance('t3lib_FlashMessage', sprintf($GLOBALS['LANG']->getLL('ext_import_extlist_updated'), $extcount), $GLOBALS['LANG']->getLL('ext_import_extlist_updated_header')); $content .= $flashMessage->render(); } return $content; }
/** * Method collects and stores extension version details into the database. * * @access protected * @param SplSubject $subject a subject notifying this observer * @return void */ protected function loadIntoDB(SplSubject &$subject) { // flush every 50 rows to database if ($this->sumRecords !== 0 && $this->sumRecords % 50 === 0) { $GLOBALS['TYPO3_DB']->exec_INSERTmultipleRows('cache_extensions', self::$fieldNames, $this->arrRows, self::$fieldIndicesNoQuote); $this->arrRows = array(); } // order must match that of self::$fieldNamses! $this->arrRows[] = array($subject->getExtkey(), $subject->getVersion(), tx_em_Tools::makeVersion($subject->getVersion(), 'int'), intval($subject->getAlldownloadcounter()), intval($subject->getDownloadcounter()), !is_null($subject->getTitle()) ? $subject->getTitle() : '', $subject->getOwnerusername(), !is_null($subject->getAuthorname()) ? $subject->getAuthorname() : '', !is_null($subject->getAuthoremail()) ? $subject->getAuthoremail() : '', !is_null($subject->getAuthorcompany()) ? $subject->getAuthorcompany() : '', intval($subject->getLastuploaddate()), $subject->getT3xfilemd5(), $this->repositoryUID, tx_em_Tools::getDefaultState($subject->getState() ? $subject->getState() : ''), intval($subject->getReviewstate()), tx_em_Tools::getDefaultCategory($subject->getCategory() ? $subject->getCategory() : ''), $subject->getDescription() ? $subject->getDescription() : '', $subject->getDependencies() ? $subject->getDependencies() : '', $subject->getUploadcomment() ? $subject->getUploadcomment() : ''); ++$this->sumRecords; }
/** * Maps remote extensions information into $cat/$list arrays for listing * * @param boolean If set the info in the internal extensionsXML array will be unset before returning the result. * @return array List array and category index as key 0 / 1 in an array. */ function prepareImportExtList($unsetProc = false) { $list = array(); $cat = tx_em_Tools::getDefaultCategory(); $filepath = $this->parentObject->getMirrorURL(); foreach ($this->parentObject->xmlHandler->extensionsXML as $extKey => $data) { $GLOBALS['LANG']->csConvObj->convarray($data, 'utf-8', $GLOBALS['LANG']->charSet); // is there a better place for conversion? $list[$extKey]['type'] = '_'; $version = array_keys($data['versions']); $extPath = t3lib_div::strtolower($extKey); $list[$extKey]['_ICON'] = '<img alt="" src="' . $filepath . $extPath[0] . '/' . $extPath[1] . '/' . $extPath . '_' . end($version) . '.gif" />'; $list[$extKey]['downloadcounter'] = $data['downloadcounter']; foreach (array_keys($data['versions']) as $version) { $list[$extKey]['versions'][$version]['downloadcounter'] = $data['versions'][$version]['downloadcounter']; $list[$extKey]['versions'][$version]['EM_CONF'] = array('version' => $version, 'title' => $data['versions'][$version]['title'], 'description' => $data['versions'][$version]['description'], 'category' => $data['versions'][$version]['category'], 'constraints' => $data['versions'][$version]['dependencies'], 'state' => $data['versions'][$version]['state'], 'reviewstate' => $data['versions'][$version]['reviewstate'], 'lastuploaddate' => $data['versions'][$version]['lastuploaddate'], 'author' => $data['versions'][$version]['authorname'], 'author_email' => $data['versions'][$version]['authoremail'], 'author_company' => $data['versions'][$version]['authorcompany']); } tx_em_Tools::setCat($cat, $list[$extKey]['versions'][$version], $extKey); if ($unsetProc) { unset($this->parentObject->xmlHandler->extensionsXML[$extKey]); } } return array($list, $cat); }