diff --git a/typo3/sysext/install/Classes/Updates/AbstractDownloadExtensionUpdate.php b/typo3/sysext/install/Classes/Updates/AbstractDownloadExtensionUpdate.php index 45be31f8ad014a9ecedcbd99f21d114f7f0d6060..0a0e9bb3fecc13f78484b3a975572758c3013f26 100644 --- a/typo3/sysext/install/Classes/Updates/AbstractDownloadExtensionUpdate.php +++ b/typo3/sysext/install/Classes/Updates/AbstractDownloadExtensionUpdate.php @@ -14,6 +14,7 @@ namespace TYPO3\CMS\Install\Updates; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Core\Environment; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Object\ObjectManager; use TYPO3\CMS\Extensionmanager\Utility\Connection\TerUtility; @@ -58,15 +59,15 @@ abstract class AbstractDownloadExtensionUpdate extends AbstractUpdate /** @var $extensionListUtility ListUtility */ $extensionListUtility = $objectManager->get(ListUtility::class); - $availableExtensions = $extensionListUtility->getAvailableExtensions(); - $availableAndInstalledExtensions = $extensionListUtility->getAvailableAndInstalledExtensions($availableExtensions); + $extensionDetails = $this->getExtensionDetails($extensionKey); + + $isExtensionAvailable = !empty($availableExtensions[$extensionKey]); + $isComposerMode = Environment::isComposerMode(); - // Extension is not downloaded yet. - if (!is_array($availableAndInstalledExtensions[$extensionKey])) { + if (!$isComposerMode && !$isExtensionAvailable) { /** @var $extensionTerUtility TerUtility */ $extensionTerUtility = $objectManager->get(TerUtility::class); - $extensionDetails = $this->getExtensionDetails($extensionKey); if (empty($extensionDetails)) { $updateSuccessful = false; $customMessage .= 'No version information for extension ' . $extensionKey . ' found. Can not install the extension.'; @@ -90,11 +91,20 @@ abstract class AbstractDownloadExtensionUpdate extends AbstractUpdate $extensionListUtility->reloadAvailableExtensions(); } - if ($updateSuccessful !== false) { + if ($isComposerMode && !$isExtensionAvailable) { + $updateSuccessful = false; + $customMessage .= 'The extension ' . $extensionKey . ' can not be downloaded since ' . + 'Composer is used for package management. Please require this ' . + 'extension as package via Composer: ' . + '"composer require ' . $extensionDetails['composerName'] . ':^' . $extensionDetails['versionString'] . '"'; + } + + if ($updateSuccessful) { /** @var $extensionInstallUtility InstallUtility */ $extensionInstallUtility = $objectManager->get(InstallUtility::class); $extensionInstallUtility->install($extensionKey); } + return $updateSuccessful; } diff --git a/typo3/sysext/install/Classes/Updates/Compatibility7ExtractionUpdate.php b/typo3/sysext/install/Classes/Updates/Compatibility7ExtractionUpdate.php index 189bd9112dd41de0f30c768ccc5aee0881d4784d..b6aa71bda280b8763fae7381c192cec48941f851 100644 --- a/typo3/sysext/install/Classes/Updates/Compatibility7ExtractionUpdate.php +++ b/typo3/sysext/install/Classes/Updates/Compatibility7ExtractionUpdate.php @@ -39,7 +39,8 @@ class Compatibility7ExtractionUpdate extends AbstractDownloadExtensionUpdate 'title' => 'Compatibility Mode for TYPO3 v7', 'description' => 'Provides an additional backwards-compatibility layer with legacy functionality for sites that haven\'t fully migrated to TYPO3 v8 yet.', 'versionString' => '8.7.1', - ] + 'composerName' => 'friendsoftypo3/compatibility7', + ], ]; /** diff --git a/typo3/sysext/install/Classes/Updates/FormLegacyExtractionUpdate.php b/typo3/sysext/install/Classes/Updates/FormLegacyExtractionUpdate.php index 6aeb7800d9dd073f7f2d11718a7216231e79ac0b..11c9f35447be8155f964724fd875794a80731698 100644 --- a/typo3/sysext/install/Classes/Updates/FormLegacyExtractionUpdate.php +++ b/typo3/sysext/install/Classes/Updates/FormLegacyExtractionUpdate.php @@ -42,7 +42,8 @@ class FormLegacyExtractionUpdate extends AbstractDownloadExtensionUpdate 'title' => 'Legacy form extension for TYPO3 v7 compatibility', 'description' => 'Provides an additional backwards-compatibility layer with legacy functionality for sites that used the form extension in TYPO3 v7.', 'versionString' => '8.7.0', - ] + 'composerName' => 'friendsoftypo3/form-legacy', + ], ]; /** diff --git a/typo3/sysext/install/Classes/Updates/FuncExtractionUpdate.php b/typo3/sysext/install/Classes/Updates/FuncExtractionUpdate.php index 679fca51257126e7b4a46ff5cc808256ea9e4b96..19001ca351c7343525b9cdf18800ce44065b921a 100644 --- a/typo3/sysext/install/Classes/Updates/FuncExtractionUpdate.php +++ b/typo3/sysext/install/Classes/Updates/FuncExtractionUpdate.php @@ -39,7 +39,8 @@ class FuncExtractionUpdate extends AbstractDownloadExtensionUpdate 'title' => 'Web->Functions module', 'description' => 'Provides Web->Functions BE module used in previous TYPO3 versions for extensions that still rely on it.', 'versionString' => '9.0.1', - ] + 'composerName' => 'friendsoftypo3/cms-func', + ], ]; /** diff --git a/typo3/sysext/install/Classes/Updates/RedirectExtractionUpdate.php b/typo3/sysext/install/Classes/Updates/RedirectExtractionUpdate.php index ceb0ac7e818504c52f47385628be319b279d1a77..e31db5d22f94c517cc3e0ecb8ffc78484ff28089 100644 --- a/typo3/sysext/install/Classes/Updates/RedirectExtractionUpdate.php +++ b/typo3/sysext/install/Classes/Updates/RedirectExtractionUpdate.php @@ -40,7 +40,8 @@ class RedirectExtractionUpdate extends AbstractDownloadExtensionUpdate 'title' => 'Redirects based on &RDCT parameter', 'description' => 'Provides redirects based on "cache_md5params" and the GET parameter &RDCT for extensions that still rely on it.', 'versionString' => '1.0.0', - ] + 'composerName' => 'friendsoftypo3/rdct', + ], ]; /** diff --git a/typo3/sysext/install/Classes/Updates/RteHtmlAreaExtractionUpdate.php b/typo3/sysext/install/Classes/Updates/RteHtmlAreaExtractionUpdate.php index 0237106a2436cc77eae4c6c951646b813eac6b6a..e1604d22db82a74fb6e4cc1804513b0d2ea12650 100644 --- a/typo3/sysext/install/Classes/Updates/RteHtmlAreaExtractionUpdate.php +++ b/typo3/sysext/install/Classes/Updates/RteHtmlAreaExtractionUpdate.php @@ -39,7 +39,8 @@ class RteHtmlAreaExtractionUpdate extends AbstractDownloadExtensionUpdate 'title' => 'RTE HTMLArea for TYPO3', 'description' => 'Provides the well-known RTE used in previous TYPO3 versions, if handling of images or custom configurations are necessary.', 'versionString' => '8.7.0', - ] + 'composerName' => 'friendsoftypo3/rtehtmlarea', + ], ]; /** diff --git a/typo3/sysext/install/Classes/Updates/Typo3DbExtractionUpdate.php b/typo3/sysext/install/Classes/Updates/Typo3DbExtractionUpdate.php index 64ef5592e844d498c4a31201cbecd380eb925ff8..a96ac1367302cd6ede7583605dede2ec71b1b6cb 100644 --- a/typo3/sysext/install/Classes/Updates/Typo3DbExtractionUpdate.php +++ b/typo3/sysext/install/Classes/Updates/Typo3DbExtractionUpdate.php @@ -39,7 +39,8 @@ class Typo3DbExtractionUpdate extends AbstractDownloadExtensionUpdate 'title' => '$GLOBALS[\'TYPO3_DB\'] compatibility layer', 'description' => 'Provides the well-known database API $GLOBALS[\'TYPO3_DB\'] used in previous TYPO3 versions for extensions that still rely on it.', 'versionString' => '1.0.1', - ] + 'composerName' => 'friendsoftypo3/typo3db-legacy', + ], ]; /** diff --git a/typo3/sysext/install/Tests/Unit/Updates/Compatibility7ExtractionUpdateTest.php b/typo3/sysext/install/Tests/Unit/Updates/Compatibility7ExtractionUpdateTest.php index d61447b23795b617c1bb4fe707359933a63bcf33..d50c10765675b3fd47214dfb9c461233b6f596d6 100644 --- a/typo3/sysext/install/Tests/Unit/Updates/Compatibility7ExtractionUpdateTest.php +++ b/typo3/sysext/install/Tests/Unit/Updates/Compatibility7ExtractionUpdateTest.php @@ -114,7 +114,7 @@ class Compatibility7ExtractionUpdateTest extends UnitTestCase $installUtility = $this->prophesize(InstallUtility::class); $objectManager->get(InstallUtility::class)->willReturn($installUtility->reveal()); $objectManager->get(ListUtility::class)->willReturn($listUtility->reveal()); - $extensionList = ['compatibility7' => []]; + $extensionList = ['compatibility7' => ['foo' => 'bar']]; $listUtility->getAvailableExtensions()->willReturn($extensionList); $listUtility->getAvailableAndInstalledExtensions($extensionList)->willReturn($extensionList); $installUtility->install('compatibility7')->shouldBeCalled();