/** * @return void */ public function execute() { $contexts = array('BE', 'FE'); if ($this->getExtensionKey()) { $extensionList = array($this->getExtensionKey()); } else { $extensionList = Tx_Smoothmigration_Utility_ExtensionUtility::getLoadedExtensionsFiltered(); } foreach ($contexts as $context) { if (is_array($GLOBALS['TYPO3_CONF_VARS'][$context]['XCLASS']) && count($GLOBALS['TYPO3_CONF_VARS'][$context]['XCLASS']) > 0) { foreach ($GLOBALS['TYPO3_CONF_VARS'][$context]['XCLASS'] as $targetClass => $implementationClass) { if (is_file($implementationClass)) { $path = str_replace(PATH_typo3conf . 'ext/', '', $implementationClass); $extKey = current(explode('/', $path)); } else { $extKey = t3lib_extMgm::getExtensionKeyByPrefix(strtolower($implementationClass)); } if (!in_array($extKey, $extensionList)) { continue; } $this->issues[] = $this->createIssue($context, $targetClass, $implementationClass, $extKey); } } } }
/** * Execute the check * * @return void */ public function execute() { $extensions = Tx_Smoothmigration_Utility_ExtensionUtility::getIncompatibleExtensions(); foreach ($extensions as $extension => $versionRange) { $location = new Tx_Smoothmigration_Domain_Model_IssueLocation_Extension($extension, $versionRange[0], $versionRange[1]); $this->issues[] = new Tx_Smoothmigration_Domain_Model_Issue($this->parentCheck->getIdentifier(), $location); } }
/** * Execute the check * * @return void */ public function execute() { $extensions = Tx_Smoothmigration_Utility_ExtensionUtility::getObsoleteExtensions(); foreach ($extensions as $extension) { $location = new Tx_Smoothmigration_Domain_Model_IssueLocation_Extension($extension); $this->issues[] = new Tx_Smoothmigration_Domain_Model_Issue($this->parentCheck->getIdentifier(), $location); } }
/** * Execute the check * * @return void */ public function execute() { $list = Tx_Smoothmigration_Utility_ExtensionUtility::getLoadedExtensionsFiltered(TRUE, FALSE, TRUE); foreach ($list as $extensionKey) { $locations = Tx_Smoothmigration_Utility_FileLocatorUtility::searchInExtension($extensionKey, '.*[^ext_tables]\\.(php|inc)$', '(addPlugin\\s*\\(\\s*(array\\s*\\([^\\)]*\\)[^\\,]*\\,|\\$[^\\,]*\\,)[^\\)\\,]*\\))'); foreach ($locations as $location) { $this->issues[] = new Tx_Smoothmigration_Domain_Model_Issue($this->parentCheck->getIdentifier(), $location); } } }
/** * @param string $fileNamePattern * @param string $searchPattern * @param array $excludedExtensions * * @return Tx_Smoothmigration_Domain_Interface_IssueLocation[] */ public static function searchInExtensions($fileNamePattern, $searchPattern, $excludedExtensions = array()) { $locations = array(); $loadedExtensions = Tx_Smoothmigration_Utility_ExtensionUtility::getLoadedExtensionsFiltered(); foreach ($loadedExtensions as $extensionKey) { if (in_array($extensionKey, $excludedExtensions)) { continue; } $locations = array_merge(self::searchInExtension($extensionKey, $fileNamePattern, $searchPattern), $locations); } return $locations; }
/** * Get a filtered list of loaded / active extensions * * Compatible extensions can be filtered out. * Ignored extensions can be filtered out. * System extensions can be filtered out. * Smoothmigration is filtered out. * * @param bool $removeCompatible * @param bool $removeIgnored * @param bool $removeSystem * * @return array Array of installed */ public static function getLoadedExtensionsFiltered($removeCompatible = TRUE, $removeIgnored = TRUE, $removeSystem = TRUE) { if (self::$loadedExtensionsFiltered !== NULL) { return self::$loadedExtensionsFiltered; } // get extension configuration $configuration = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['smoothmigration']); if (isset($configuration['includeInactiveExtensions']) && intval($configuration['includeInactiveExtensions']) > 0) { $loadedExtensionsFiltered = self::getInstalledExtensions(); } else { $loadedExtensionsFiltered = self::getLoadedExtensions(); } $loadedExtensionsFiltered = array_flip($loadedExtensionsFiltered); unset($loadedExtensionsFiltered['smoothmigration']); if ($removeCompatible) { if (isset($configuration['excludeCompatibleExtensions']) && intval($configuration['excludeCompatibleExtensions']) > 0) { $targetVersion = NULL; if (isset($configuration['targetVersionOverride']) && trim($configuration['targetVersionOverride'])) { $targetVersion = trim($configuration['targetVersionOverride']); } $compatibleExtensions = Tx_Smoothmigration_Utility_ExtensionUtility::getCompatibleExtensions($targetVersion); foreach ($compatibleExtensions as $key => $_) { unset($loadedExtensionsFiltered[$key]); } } } if ($removeIgnored) { if (isset($configuration['excludedExtensions']) && trim($configuration['excludedExtensions']) !== '') { $ingoreExtensions = explode(',', str_replace(' ', '', $configuration['excludedExtensions'])); foreach ($ingoreExtensions as $key) { unset($loadedExtensionsFiltered[$key]); } } } if ($removeSystem) { foreach ($loadedExtensionsFiltered as $key => $_) { if ($GLOBALS['TYPO3_LOADED_EXT'][$key]['type'] === 'S') { unset($loadedExtensionsFiltered[$key]); } } } $loadedExtensionsFiltered = array_flip($loadedExtensionsFiltered); self::$loadedExtensionsFiltered = $loadedExtensionsFiltered; return self::$loadedExtensionsFiltered; }
/** * Extension action, displays extension report * * @return void */ public function extensionAction() { $values = array(); // FIXME: It's unclear to me how to get this value programmatically // There is a getArgumentPrefix method, but that only applies to widgets $values['argumentPrefix'] = 'tx_smoothmigration_tools_smoothmigrationsmoothmigration'; // List of frontend extensions $loadedExtensions = Tx_Smoothmigration_Utility_ExtensionUtility::getFrontendExtensions(FALSE); $this->view->assign('loadedExtensions', $loadedExtensions); $selectedExtension = ''; if ($this->request->hasArgument('extension')) { $selectedExtension = $this->request->getArgument('extension'); } // List of sites $sites = Tx_Smoothmigration_Utility_DatabaseUtility::getSiteRoots(); $selectSites = array(); foreach ($sites as $siteUid => $siteData) { $selectSites[$siteUid] = $siteUid . ': ' . $siteData['title']; } $values['sites'] = $selectSites; $selectedSite = ''; if ($this->request->hasArgument('site')) { $selectedSite = $this->request->getArgument('site'); $values['selectedSite'] = $selectedSite; } if ($selectedSite && $selectedExtension != 1) { // Get TypoScript configuration for selected site if (count($sites) && $selectedSite) { $tmpl = t3lib_div::makeInstance('t3lib_tsparser_ext'); $tmpl->tt_track = 0; $tmpl->init(); $tmpl->runThroughTemplates(t3lib_BEfunc::BEgetRootLine((int) $selectedSite, 'AND 1=1'), 0); $tmpl->generateConfig(); } // Fetch correct class names $correctClassNames = array(); if ($selectedExtension) { $correctClassNames[$selectedExtension] = t3lib_extMgm::getCN($selectedExtension); } else { $extensionKeys = Tx_Smoothmigration_Utility_ExtensionUtility::getLoadedExtensions(); foreach ($extensionKeys as $key) { $correctClassNames[$key] = t3lib_extMgm::getCN($key); } } $listTypes = array(); $values['plugins'] = array(); // For all the root plugin objects in the plugin array foreach ($tmpl->setup['plugin.'] as $name => $_) { $name = rtrim($name, '.'); // Store the matching extension key with the plugin name foreach ($correctClassNames as $key => $className) { if (strstr($name, $className)) { $values['plugins'][$name] = $key; $suffix = str_replace($className, '', $name); $listTypes[] = $key . $suffix; } } } asort($values['plugins']); $pluginNames = array_keys($values['plugins']); // This catches Powermail which has it's own ctype which it calls powermail_pi1 $values['cTypes'] = array(); foreach ($pluginNames as $name) { array_push($values['cTypes'], str_replace('tx_', '', $name)); } // Fetch list types, initialize with legacy tt_news list_type: 9 $values['listTypes'] = array(); if ($selectedExtension === 'tt_news') { $values['listTypes'] = array('9'); } foreach ($tmpl->setup['tt_content.']['list.']['20.'] as $listType => $_) { if (preg_match('/^[^.]+$/', $listType)) { foreach ($values['plugins'] as $correctedClassName) { if (preg_match('/^' . $correctedClassName . '/', $listType)) { $values['listTypes'][] = $listType; } } } } asort($values['listTypes']); $values['pages'] = array(); if (count($values['listTypes']) || count($values['cTypes'])) { $values['pages'] = Tx_Smoothmigration_Utility_DatabaseUtility::getPagesWithContentElements($values['cTypes'], $values['listTypes']); } $pages = array(); foreach ($values['pages'] as $page) { $this->setInPageArray($pages, t3lib_BEfunc::BEgetRootLine($page['pageUid'], 'AND 1=1'), $page); } $lines = array(); $lines[] = '<tr class="t3-row-header"> <td nowrap>Page title</td> <td nowrap>' . $GLOBALS['LANG']->getLL('isExt') . '</td> </tr>'; $lines = array_merge($lines, $this->renderList($pages)); $values['table'] = '<table border="0" cellpadding="0" cellspacing="1" id="ts-overview">' . implode('', $lines) . '</table>'; } $this->view->assignMultiple($values); $this->view->assign('selectedExtension', $selectedExtension); $this->view->assign('moduleToken', $this->moduleToken); }
/** * Display index of actions * * @param string $type * * @return void */ protected function displayActionIndex($type = 'Check') { $this->messageBus->headerMessage('Avaliable ' . $type . 's:', 'info'); $type = strtolower($type); if ($this->availableActions === array()) { $this->availableActions = $this->commandManager->getAvailableCommands(); } $colorizedIdentifierLength = $this->getMaximumIdentifierLength($this->availableActions[$type], TRUE); $identifierLength = $this->getMaximumIdentifierLength($this->availableActions[$type]); $this->messageBus->message(vsprintf(' %-' . $identifierLength . 's %s', array('Identifier', 'Description'))); $this->messageBus->horizontalLine(); /** @var Tx_Smoothmigration_Checks_AbstractCheckDefinition $command */ $counter = 1; foreach ($this->availableActions[$type] as $command) { $this->autoCompleteValues['actions'][] = $command->getIdentifier(); $description = wordwrap($command->getShortDescription(), TERMINAL_WIDTH - $identifierLength - 7, PHP_EOL . str_repeat(' ', $identifierLength + 7), TRUE); $shortCommandIdentifier = $command->getIdentifier(); $this->messageBus->message(vsprintf('%2s) %-' . $colorizedIdentifierLength . 's %s', array($counter, $this->messageBus->successString($shortCommandIdentifier), $description))); $counter++; } $this->messageBus->message(); if ($this->isInInteractiveMode) { $this->messageBus->setCompletions(array('actions' => $this->autoCompleteValues['actions'], 'extensions' => Tx_Smoothmigration_Utility_ExtensionUtility::getLoadedExtensionsFiltered())); $actions = $this->autoCompleteValues['actions'][$type]; $this->messageBus->usage(); $response = $this->messageBus->prompt(); $this->messageBus->message(); list($code, $extension) = explode(' ', $response); if (array_key_exists($code, $actions)) { readline_add_history($response); $method = $type . 'Command'; $this->{$method}($actions[$code], $extension); } elseif (in_array($code, $actions)) { readline_add_history($response); $method = $type . 'Command'; $this->{$method}($code, $extension); } elseif ($code == -1) { $this->interactiveCommand(); } else { $this->messageBus->errorMessage('Uknown comand: ' . $code); $this->interactiveCommand(); } } else { $this->messageBus->message('Usage: ./cli_dispatch.phpsh extbase smoothmigration:' . $type . ' <Identifier> [extensionName]'); } $this->messageBus->message(); }
/** * Loads all Extension-Versions from ext_emconf files * * @return void */ protected function initializeTypo3ExtensionArray() { $extensionKeys = Tx_Smoothmigration_Utility_ExtensionUtility::getLoadedExtensions(); foreach ($extensionKeys as $extensionKey) { $this->installedTypo3Extensions[$extensionKey] = t3lib_extMgm::getExtensionVersion($extensionKey); } }