‪TYPO3CMS  11.5
DownloadController.php
Go to the documentation of this file.
1 <?php
2 
3 /*
4  * This file is part of the TYPO3 CMS project.
5  *
6  * It is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU General Public License, either version 2
8  * of the License, or any later version.
9  *
10  * For the full copyright and license information, please read the
11  * LICENSE.txt file that was distributed with this source code.
12  *
13  * The TYPO3 project - inspiring people to share!
14  */
15 
17 
18 use Psr\Http\Message\ResponseInterface;
32 
38 {
41 
45  protected ‪$defaultViewObjectName = JsonView::class;
46 
50  protected ‪$view;
51 
52  public function ‪__construct(
55  ) {
56  $this->extensionRepository = ‪$extensionRepository;
57  $this->managementService = ‪$managementService;
58  }
59 
66  public function ‪checkDependenciesAction(‪Extension $extension): ResponseInterface
67  {
68  $message = '';
69  $title = '';
70  $hasDependencies = false;
71  $hasErrors = false;
72  $dependencyTypes = null;
73  $configuration = [
74  'value' => [
75  'dependencies' => [],
76  ],
77  ];
78  $isAutomaticInstallationEnabled = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'automaticInstallation');
79  if (!$isAutomaticInstallationEnabled) {
80  // if automatic installation is deactivated, no dependency check is needed (download only)
81  $action = 'installExtensionWithoutSystemDependencyCheck';
82  } else {
83  $action = 'installFromTer';
84  try {
85  $dependencyTypes = $this->managementService->getAndResolveDependencies($extension);
86  if (!empty($dependencyTypes)) {
87  $hasDependencies = true;
88  $message = '<p>' . $this->‪translate('downloadExtension.dependencies.headline') . '</p>';
89  foreach ($dependencyTypes as $dependencyType => $dependencies) {
90  $extensions = '';
91  foreach ($dependencies as $extensionKey => $dependency) {
92  if (!isset($configuration['value']['dependencies'][$dependencyType])) {
93  $configuration['value']['dependencies'][$dependencyType] = [];
94  }
95  $configuration['value']['dependencies'][$dependencyType][$extensionKey] = [
96  '_exclude' => [
97  'categoryIndexFromStringOrNumber',
98  ],
99  ];
100  $extensions .= $this->‪translate(
101  'downloadExtension.dependencies.extensionWithVersion',
102  [
103  $extensionKey, $dependency->getVersion(),
104  ]
105  ) . '<br />';
106  }
107  $message .= $this->‪translate(
108  'downloadExtension.dependencies.typeHeadline',
109  [
110  $this->‪translate('downloadExtension.dependencyType.' . $dependencyType),
111  $extensions,
112  ]
113  );
114  }
115  $title = $this->‪translate('downloadExtension.dependencies.resolveAutomatically');
116  }
117  } catch (\Exception $e) {
118  $hasErrors = true;
119  $title = $this->‪translate('downloadExtension.dependencies.errorTitle');
120  $message = $e->getMessage();
121  }
122  }
123 
124  $url = $this->uriBuilder->uriFor(
125  $action,
126  ['extension' => $extension->‪getUid(), 'format' => 'json'],
127  'Download'
128  );
129  $this->view->setConfiguration($configuration);
130  $this->view->assign('value', [
131  'dependencies' => $dependencyTypes,
132  'url' => $url,
133  'message' => $message,
134  'hasErrors' => $hasErrors,
135  'hasDependencies' => $hasDependencies,
136  'title' => $title,
137  ]);
138 
139  return $this->‪jsonResponse();
140  }
141 
145  protected function ‪initializeInstallFromTerAction()
146  {
147  // @todo: Switch to JsonView
148  $this->defaultViewObjectName = TemplateView::class;
149  }
150 
158  public function ‪installFromTerAction(Extension $extension, $downloadPath = 'Local'): ResponseInterface
159  {
160  [$result, $errorMessages] = $this->‪installFromTer($extension, $downloadPath);
161  $isAutomaticInstallationEnabled = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'automaticInstallation');
162  $this->view->assignMultiple([
163  'result' => $result,
164  'extension' => $extension,
165  'installationTypeLanguageKey' => $isAutomaticInstallationEnabled ? '' : '.downloadOnly',
166  'unresolvedDependencies' => $errorMessages,
167  ]);
168 
169  return $this->‪htmlResponse();
170  }
171 
178  public function ‪installExtensionWithoutSystemDependencyCheckAction(Extension $extension): ResponseInterface
179  {
180  $this->managementService->setSkipDependencyCheck(true);
181  return (new ForwardResponse('installFromTer'))->withArguments(['extension' => $extension, 'downloadPath' => 'Local']);
182  }
183 
190  public function ‪installDistributionAction(Extension $extension)
191  {
193  return (new ForwardResponse('distributions'))->withControllerName('List');
194  }
195  $errorMessages = $this->‪installFromTer($extension)[1];
196  if ($errorMessages) {
197  foreach ($errorMessages as $extensionKey => $messages) {
198  foreach ($messages as $message) {
199  $this->‪addFlashMessage(
200  $message['message'],
202  'distribution.error.headline',
203  'extensionmanager',
204  [$extensionKey]
205  ) ?? '',
207  );
208  }
209  }
210 
211  // Redirect back to distributions list action
212  $this->‪redirect(
213  'distributions',
214  'List'
215  );
216  } else {
217  // FlashMessage that extension is installed
218  $this->‪addFlashMessage(
220  'distribution.welcome.message',
221  'extensionmanager',
222  [$extension->getExtensionKey()]
223  ) ?? '',
224  ‪LocalizationUtility::translate('distribution.welcome.headline', 'extensionmanager') ?? ''
225  );
226 
227  // Redirect to show action
228  $this->‪redirect(
229  'show',
230  'Distribution',
231  null,
232  ['extension' => $extension]
233  );
234  }
235  }
236 
245  protected function ‪updateExtensionAction(): ResponseInterface
246  {
247  $extensionKey = $this->request->getArgument('extension');
248  $version = $this->request->getArgument('version');
249  $extension = $this->extensionRepository->findOneByExtensionKeyAndVersion($extensionKey, $version);
250  if (!$extension instanceof Extension) {
251  $extension = $this->extensionRepository->findHighestAvailableVersion($extensionKey);
252  }
254  try {
255  if (in_array($extensionKey, $installedExtensions, true)) {
256  // To resolve new dependencies the extension is installed again
257  $this->managementService->installExtension($extension);
258  } else {
259  $this->managementService->downloadMainExtension($extension);
260  }
261  $this->‪addFlashMessage(
262  $this->‪translate('extensionList.updateFlashMessage.body', [$extensionKey]),
263  $this->‪translate('extensionList.updateFlashMessage.title')
264  );
265  } catch (\Exception $e) {
266  $this->‪addFlashMessage($e->getMessage(), '', ‪FlashMessage::ERROR);
267  }
268 
269  return $this->‪jsonResponse();
270  }
271 
277  protected function ‪updateCommentForUpdatableVersionsAction(): ResponseInterface
278  {
279  $extensionKey = $this->request->getArgument('extension');
280  $versionStart = $this->request->getArgument('integerVersionStart');
281  $versionStop = $this->request->getArgument('integerVersionStop');
282  $updateComments = [];
284  $updatableVersions = $this->extensionRepository->findByVersionRangeAndExtensionKeyOrderedByVersion(
285  $extensionKey,
286  $versionStart,
287  $versionStop,
288  false
289  );
290  $highestPossibleVersion = false;
291 
292  foreach ($updatableVersions as $updatableVersion) {
293  if ($highestPossibleVersion === false) {
294  $highestPossibleVersion = $updatableVersion->getVersion();
295  }
296  $updateComments[$updatableVersion->getVersion()] = $updatableVersion->getUpdateComment();
297  }
298 
299  $this->view->assign('value', [
300  'updateComments' => $updateComments,
301  'url' => $this->uriBuilder->uriFor(
302  'updateExtension',
303  ['extension' => $extensionKey, 'version' => $highestPossibleVersion]
304  ),
305  ]);
306 
307  return $this->‪jsonResponse();
308  }
309 
318  protected function ‪installFromTer(Extension $extension, $downloadPath = 'Local')
319  {
320  $result = false;
321  $errorMessages = [];
322  try {
323  $this->managementService->setDownloadPath($downloadPath);
324  $isAutomaticInstallationEnabled = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'automaticInstallation');
325  $this->managementService->setAutomaticInstallationEnabled($isAutomaticInstallationEnabled);
326  if (($result = $this->managementService->installExtension($extension)) === false) {
327  $errorMessages = $this->managementService->getDependencyErrors();
328  }
329  } catch (ExtensionManagerException $e) {
330  $errorMessages = [
331  $extension->getExtensionKey() => [
332  [
333  'code' => $e->getCode(),
334  'message' => $e->getMessage(),
335  ],
336  ],
337  ];
338  }
339 
340  return [$result, $errorMessages];
341  }
342 }
‪TYPO3\CMS\Core\Messaging\AbstractMessage
Definition: AbstractMessage.php:26
‪TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject\getUid
‪int null getUid()
Definition: AbstractDomainObject.php:67
‪TYPO3\CMS\Extensionmanager\Controller\AbstractController\translate
‪string translate($key, $arguments=null)
Definition: AbstractController.php:44
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\htmlResponse
‪ResponseInterface htmlResponse(string $html=null)
Definition: ActionController.php:1067
‪TYPO3\CMS\Extbase\Utility\LocalizationUtility
Definition: LocalizationUtility.php:33
‪TYPO3\CMS\Extensionmanager\Controller\DownloadController\initializeInstallFromTerAction
‪initializeInstallFromTerAction()
Definition: DownloadController.php:143
‪TYPO3\CMS\Core\Package\Exception
Definition: Exception.php:21
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension
Definition: Extension.php:28
‪TYPO3\CMS\Core\Configuration\ExtensionConfiguration
Definition: ExtensionConfiguration.php:45
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\jsonResponse
‪ResponseInterface jsonResponse(string $json=null)
Definition: ActionController.php:1081
‪TYPO3\CMS\Extensionmanager\Controller\DownloadController\updateExtensionAction
‪ResponseInterface updateExtensionAction()
Definition: DownloadController.php:243
‪TYPO3\CMS\Extensionmanager\Controller\DownloadController\$view
‪JsonView $view
Definition: DownloadController.php:48
‪TYPO3\CMS\Extensionmanager\Controller\DownloadController
Definition: DownloadController.php:38
‪TYPO3\CMS\Extensionmanager\Controller\DownloadController\installFromTer
‪array installFromTer(Extension $extension, $downloadPath='Local')
Definition: DownloadController.php:316
‪TYPO3\CMS\Extensionmanager\Controller
Definition: AbstractController.php:16
‪TYPO3\CMS\Extbase\Http\ForwardResponse
Definition: ForwardResponse.php:24
‪TYPO3\CMS\Extensionmanager\Controller\DownloadController\$managementService
‪ExtensionManagementService $managementService
Definition: DownloadController.php:40
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\addFlashMessage
‪addFlashMessage($messageBody, $messageTitle='', $severity=AbstractMessage::OK, $storeInSession=true)
Definition: ActionController.php:828
‪TYPO3\CMS\Fluid\View\TemplateView
Definition: TemplateView.php:22
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility
Definition: ExtensionManagementUtility.php:43
‪TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository
Definition: ExtensionRepository.php:34
‪TYPO3\CMS\Extensionmanager\Controller\DownloadController\updateCommentForUpdatableVersionsAction
‪updateCommentForUpdatableVersionsAction()
Definition: DownloadController.php:275
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension\getExtensionKey
‪string getExtensionKey()
Definition: Extension.php:269
‪TYPO3\CMS\Extbase\Utility\LocalizationUtility\translate
‪static string null translate(string $key, ?string $extensionName=null, array $arguments=null, string $languageKey=null, array $alternativeLanguageKeys=null)
Definition: LocalizationUtility.php:67
‪TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException
Definition: ExtensionManagerException.php:23
‪TYPO3\CMS\Extensionmanager\Controller\DownloadController\$defaultViewObjectName
‪string $defaultViewObjectName
Definition: DownloadController.php:44
‪TYPO3\CMS\Extensionmanager\Controller\DownloadController\$extensionRepository
‪ExtensionRepository $extensionRepository
Definition: DownloadController.php:39
‪TYPO3\CMS\Extensionmanager\Controller\DownloadController\installFromTerAction
‪ResponseInterface installFromTerAction(Extension $extension, $downloadPath='Local')
Definition: DownloadController.php:156
‪TYPO3\CMS\Extensionmanager\Controller\AbstractController
Definition: AbstractController.php:26
‪TYPO3\CMS\Extensionmanager\Service\ExtensionManagementService
Definition: ExtensionManagementService.php:36
‪TYPO3\CMS\Extensionmanager\Controller\DownloadController\installExtensionWithoutSystemDependencyCheckAction
‪ResponseInterface installExtensionWithoutSystemDependencyCheckAction(Extension $extension)
Definition: DownloadController.php:176
‪TYPO3\CMS\Core\Messaging\FlashMessage
Definition: FlashMessage.php:26
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\redirect
‪never redirect($actionName, $controllerName=null, $extensionName=null, array $arguments=null, $pageUid=null, $_=null, $statusCode=303)
Definition: ActionController.php:940
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility\getLoadedExtensionListArray
‪static array getLoadedExtensionListArray()
Definition: ExtensionManagementUtility.php:1830
‪TYPO3\CMS\Extensionmanager\Controller\DownloadController\checkDependenciesAction
‪ResponseInterface checkDependenciesAction(Extension $extension)
Definition: DownloadController.php:64
‪TYPO3\CMS\Extensionmanager\Controller\DownloadController\__construct
‪__construct(ExtensionRepository $extensionRepository, ExtensionManagementService $managementService)
Definition: DownloadController.php:50
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility\isLoaded
‪static bool isLoaded($key)
Definition: ExtensionManagementUtility.php:114
‪TYPO3\CMS\Extbase\Mvc\View\JsonView
Definition: JsonView.php:31
‪TYPO3\CMS\Core\Messaging\AbstractMessage\ERROR
‪const ERROR
Definition: AbstractMessage.php:31
‪TYPO3\CMS\Extensionmanager\Controller\DownloadController\installDistributionAction
‪installDistributionAction(Extension $extension)
Definition: DownloadController.php:188