diff --git a/typo3/sysext/extensionmanager/Classes/Utility/InstallUtility.php b/typo3/sysext/extensionmanager/Classes/Utility/InstallUtility.php index c7731695014250f542afd41d775a5bfd2652a17d..ee2c5b0d5e82eaa6e8b2f87269807a9120e640e3 100644 --- a/typo3/sysext/extensionmanager/Classes/Utility/InstallUtility.php +++ b/typo3/sysext/extensionmanager/Classes/Utility/InstallUtility.php @@ -14,8 +14,9 @@ namespace TYPO3\CMS\Extensionmanager\Utility; * The TYPO3 project - inspiring people to share! */ -use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Service\OpcodeCacheService; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Core\Utility\PathUtility; use TYPO3\CMS\Extensionmanager\Domain\Model\Extension; use TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException; use TYPO3\CMS\Impexp\Utility\ImportExportUtility; @@ -187,13 +188,21 @@ class InstallUtility implements \TYPO3\CMS\Core\SingletonInterface $this->cacheManager->flushCachesInGroup('system'); } $this->reloadCaches(); + $this->processExtensionSetup($extensionKey); + + $this->emitAfterExtensionInstallSignal($extensionKey); + } + /** + * @param string $extensionKey + */ + public function processExtensionSetup($extensionKey) + { + $extension = $this->getExtensionArray($extensionKey); $this->importInitialFiles($extension['siteRelPath'], $extensionKey); $this->processDatabaseUpdates($extension); $this->processRuntimeDatabaseUpdates($extensionKey); - $this->saveDefaultConfiguration($extension['key']); - - $this->emitAfterExtensionInstallSignal($extensionKey); + $this->saveDefaultConfiguration($extensionKey); } /** @@ -313,12 +322,7 @@ class InstallUtility implements \TYPO3\CMS\Core\SingletonInterface */ public function enrichExtensionWithDetails($extensionKey) { - $availableExtensions = $this->listUtility->getAvailableExtensions(); - if (isset($availableExtensions[$extensionKey])) { - $extension = $availableExtensions[$extensionKey]; - } else { - throw new ExtensionManagerException('Extension ' . $extensionKey . ' is not available', 1342864081); - } + $extension = $this->getExtensionArray($extensionKey); $availableAndInstalledExtensions = $this->listUtility->enrichExtensionsWithEmConfAndTerInformation(array($extensionKey => $extension)); if (!isset($availableAndInstalledExtensions[$extensionKey])) { @@ -331,6 +335,21 @@ class InstallUtility implements \TYPO3\CMS\Core\SingletonInterface return $availableAndInstalledExtensions[$extensionKey]; } + /** + * @param string $extensionKey + * @return array + * @throws ExtensionManagerException + */ + protected function getExtensionArray($extensionKey) + { + $availableExtensions = $this->listUtility->getAvailableExtensions(); + if (isset($availableExtensions[$extensionKey])) { + return $availableExtensions[$extensionKey]; + } else { + throw new ExtensionManagerException('Extension ' . $extensionKey . ' is not available', 1342864081); + } + } + /** * Creates directories as requested in ext_emconf.php * diff --git a/typo3/sysext/extensionmanager/Classes/Utility/ListUtility.php b/typo3/sysext/extensionmanager/Classes/Utility/ListUtility.php index 8978b125f1b5e79444702fcb1110f06d8136b4f1..59c57898c4be5517a2cd9b9fd34d0f75c13a7a39 100644 --- a/typo3/sysext/extensionmanager/Classes/Utility/ListUtility.php +++ b/typo3/sysext/extensionmanager/Classes/Utility/ListUtility.php @@ -55,6 +55,11 @@ class ListUtility implements \TYPO3\CMS\Core\SingletonInterface */ protected $signalSlotDispatcher; + /** + * @var array + */ + protected $availableExtensions = NULL; + /** * @param \TYPO3\CMS\Extensionmanager\Utility\EmConfUtility $emConfUtility */ @@ -102,18 +107,20 @@ class ListUtility implements \TYPO3\CMS\Core\SingletonInterface */ public function getAvailableExtensions() { - $this->emitPackagesMayHaveChangedSignal(); - $extensions = array(); - foreach ($this->packageManager->getAvailablePackages() as $package) { - $installationType = $this->getInstallTypeForPackage($package); - $extensions[$package->getPackageKey()] = array( - 'siteRelPath' => str_replace(PATH_site, '', $package->getPackagePath()), - 'type' => $installationType, - 'key' => $package->getPackageKey(), - 'ext_icon' => ExtensionManagementUtility::getExtensionIcon($package->getPackagePath()), - ); + if ($this->availableExtensions === NULL) { + $this->emitPackagesMayHaveChangedSignal(); + foreach ($this->packageManager->getAvailablePackages() as $package) { + $installationType = $this->getInstallTypeForPackage($package); + $this->availableExtensions[$package->getPackageKey()] = array( + 'siteRelPath' => str_replace(PATH_site, '', $package->getPackagePath()), + 'type' => $installationType, + 'key' => $package->getPackageKey(), + 'ext_icon' => ExtensionManagementUtility::getExtensionIcon($package->getPackagePath()), + ); + } } - return $extensions; + + return $this->availableExtensions; } /** diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Utility/InstallUtilityTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Utility/InstallUtilityTest.php index caab13c9735315a24c28c87736f6865df114a2a8..ede4169ed25ebfd4840b8132d3e489fafcdcde71 100644 --- a/typo3/sysext/extensionmanager/Tests/Unit/Utility/InstallUtilityTest.php +++ b/typo3/sysext/extensionmanager/Tests/Unit/Utility/InstallUtilityTest.php @@ -59,6 +59,7 @@ class InstallUtilityTest extends \TYPO3\CMS\Core\Tests\UnitTestCase 'reloadCaches', 'processCachingFrameworkUpdates', 'saveDefaultConfiguration', + 'getExtensionArray', 'enrichExtensionWithDetails', 'ensureConfiguredDirectoriesExist', 'importInitialFiles', @@ -70,6 +71,10 @@ class InstallUtilityTest extends \TYPO3\CMS\Core\Tests\UnitTestCase ); $dependencyUtility = $this->getMock(\TYPO3\CMS\Extensionmanager\Utility\DependencyUtility::class); $this->installMock->_set('dependencyUtility', $dependencyUtility); + $this->installMock->expects($this->any()) + ->method('getExtensionArray') + ->with($this->extensionKey) + ->will($this->returnCallback(array($this, 'getExtensionData'))); $this->installMock->expects($this->any()) ->method('enrichExtensionWithDetails') ->with($this->extensionKey)