‪TYPO3CMS  ‪main
ListController.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\Http\Message\ResponseInterface;
26 use TYPO3\CMS\Core\Imaging\IconSize;
41 
49 {
50  public function ‪__construct(
51  protected readonly ‪PageRenderer $pageRenderer,
52  protected readonly ‪ExtensionRepository $extensionRepository,
53  protected readonly ‪ListUtility $listUtility,
54  protected readonly ‪DependencyUtility $dependencyUtility,
55  protected readonly ‪IconFactory $iconFactory,
56  protected readonly ‪RemoteRegistry $remoteRegistry,
57  protected readonly ‪ExtensionConfiguration $extensionConfiguration,
58  ) {
59  }
60 
64  protected function ‪initializeAction(): void
65  {
66  $this->pageRenderer->addInlineLanguageLabelFile('EXT:extensionmanager/Resources/Private/Language/locallang.xlf');
67  $this->settings['offlineMode'] = (bool)$this->extensionConfiguration->get('extensionmanager', 'offlineMode');
68  }
69 
73  protected function ‪indexAction(): ResponseInterface
74  {
75  $moduleData = $this->request->getAttribute('moduleData');
76  if ($this->request->hasArgument('filter')
77  && is_string($this->request->getArgument('filter'))
78  ) {
79  $filter = $this->request->getArgument('filter');
80  $moduleData->set('filter', $filter);
81  $this->‪getBackendUserAuthentication()->pushModuleData($moduleData->getModuleIdentifier(), $moduleData->toArray());
82  } else {
83  $filter = (string)$moduleData->get('filter');
84  }
86  $isComposerMode = ‪Environment::isComposerMode();
87  $availableAndInstalledExtensions = $this->‪enrichExtensionsWithViewInformation(
88  $this->listUtility->getAvailableAndInstalledExtensionsWithAdditionalInformation($filter),
89  $isComposerMode
90  );
91  ksort($availableAndInstalledExtensions);
92  ‪$view = $this->‪initializeModuleTemplate($this->request);
94  ‪$view->assignMultiple([
95  'extensions' => $availableAndInstalledExtensions,
96  'isComposerMode' => $isComposerMode,
97  'typeFilter' => $filter ?: 'All',
98  // Sort extension by update state. This is only automatically set for non-composer
99  // mode and only takes effect if at least one extension can be updated.
100  'sortByUpdate' => $this->‪extensionsWithUpdate($availableAndInstalledExtensions) !== [] && !$isComposerMode,
101  ]);
103  return ‪$view->renderResponse('List/Index');
104  }
105 
109  protected function ‪unresolvedDependenciesAction(string $extensionKey, array $returnAction): ResponseInterface
110  {
111  $availableExtensions = $this->listUtility->getAvailableExtensions();
112  if (isset($availableExtensions[$extensionKey])) {
113  $extensionArray = $this->listUtility->enrichExtensionsWithEmConfAndTerInformation(
114  [
115  $extensionKey => $availableExtensions[$extensionKey],
116  ]
117  );
118  $extension = ‪Extension::createFromExtensionArray($extensionArray[$extensionKey]);
119  } else {
120  throw new ‪ExtensionManagerException('Extension ' . $extensionKey . ' is not available', 1402421007);
121  }
122  $this->dependencyUtility->checkDependencies($extension);
123  ‪$view = $this->‪initializeModuleTemplate($this->request);
124  ‪$view->assignMultiple([
125  'extension' => $extension,
126  'returnAction' => $returnAction,
127  'unresolvedDependencies' => $this->dependencyUtility->getDependencyErrors(),
128  ]);
129  return ‪$view->renderResponse('List/UnresolvedDependencies');
130  }
131 
135  protected function ‪terAction(string $search = '', int $currentPage = 1): ResponseInterface
136  {
138  $search = trim($search);
139  if (!empty($search)) {
140  $extensions = $this->extensionRepository->findByTitleOrAuthorNameOrExtensionKey($search);
141  $paginator = new ‪ArrayPaginator($extensions, $currentPage);
142  $tableId = 'terSearchTable';
143  } else {
145  $extensions = $this->extensionRepository->findAll();
146  $paginator = new ‪QueryResultPaginator($extensions, $currentPage);
147  $tableId = 'terTable';
148  }
149  $pagination = new ‪SimplePagination($paginator);
150  $availableAndInstalledExtensions = $this->listUtility->getAvailableAndInstalledExtensions($this->listUtility->getAvailableExtensions());
151  ‪$view = $this->‪initializeModuleTemplate($this->request);
153  ‪$view->assignMultiple([
154  'extensions' => $extensions,
155  'paginator' => $paginator,
156  'pagination' => $pagination,
157  'search' => $search,
158  'availableAndInstalled' => $availableAndInstalledExtensions,
159  'actionName' => 'ter',
160  'tableId' => $tableId,
161  ]);
162  return ‪$view->renderResponse('List/Ter');
163  }
164 
168  protected function ‪distributionsAction(bool $showUnsuitableDistributions = false): ResponseInterface
169  {
170  $this->pageRenderer->loadJavaScriptModule('@typo3/extensionmanager/distribution-image.js');
172  $importExportInstalled = ‪ExtensionManagementUtility::isLoaded('impexp');
173  ‪$view = $this->‪initializeModuleTemplate($this->request);
174  if ($importExportInstalled) {
175  try {
176  foreach ($this->remoteRegistry->getListableRemotes() as $remote) {
177  $remote->getAvailablePackages();
178  }
179  } catch (‪ExtensionManagerException $e) {
180  $this->‪addFlashMessage($e->getMessage(), $e->getCode(), ContextualFeedbackSeverity::ERROR);
181  }
182  $officialDistributions = $this->extensionRepository->findAllOfficialDistributions($showUnsuitableDistributions);
183  $communityDistributions = $this->extensionRepository->findAllCommunityDistributions($showUnsuitableDistributions);
184  ‪$view->assign('officialDistributions', $officialDistributions);
185  ‪$view->assign('communityDistributions', $communityDistributions);
186  }
187  ‪$view->assign('enableDistributionsView', $importExportInstalled);
188  ‪$view->assign('showUnsuitableDistributions', $showUnsuitableDistributions);
189  return ‪$view->renderResponse('List/Distributions');
190  }
191 
195  protected function ‪showAllVersionsAction(string $extensionKey): ResponseInterface
196  {
197  $currentVersion = $this->extensionRepository->findOneByCurrentVersionByExtensionKey($extensionKey);
198  $extensions = $this->extensionRepository->findByExtensionKeyOrderedByVersion($extensionKey);
199  ‪$view = $this->‪initializeModuleTemplate($this->request);
201  ‪$view->assignMultiple([
202  'extensionKey' => $extensionKey,
203  'currentVersion' => $currentVersion,
204  'extensions' => $extensions,
205  ]);
206  return ‪$view->renderResponse('List/ShowAllVersions');
207  }
208 
213  {
215  return ‪$view;
216  }
217  $buttonBar = ‪$view->getDocHeaderComponent()->getButtonBar();
218  if ($this->actionMethodName === 'showAllVersionsAction') {
219  $action = $this->request->hasArgument('returnTo') ? $this->request->getArgument('returnTo') : 'ter';
220  $uri = $this->uriBuilder->reset()->uriFor(in_array($action, ['index', 'ter'], true) ? $action : 'ter', [], 'List');
221  $title = $this->‪translate('extConfTemplate.backToList');
222  $icon = $this->iconFactory->getIcon('actions-view-go-back', IconSize::SMALL);
223  $classes = '';
224  } else {
225  $uri = $this->uriBuilder->reset()->uriFor('form', [], 'UploadExtensionFile');
226  $title = $this->‪translate('extensionList.uploadExtension');
227  $icon = $this->iconFactory->getIcon('actions-edit-upload', IconSize::SMALL);
228  $classes = 't3js-upload';
229  }
230  $button = $buttonBar->makeLinkButton()
231  ->setHref($uri)
232  ->setTitle($title)
233  ->setShowLabelText(true)
234  ->setClasses($classes)
235  ->setIcon($icon);
236  $buttonBar->addButton($button);
237  return ‪$view;
238  }
239 
243  protected function ‪addComposerModeNotification(): void
244  {
246  $this->‪addFlashMessage(
248  'composerStrictMode.message',
249  'extensionmanager'
250  ) ?? '',
252  'composerMode.title',
253  'extensionmanager'
254  ) ?? '',
255  ContextualFeedbackSeverity::INFO
256  );
257  }
258  }
259 
260  protected function ‪enrichExtensionsWithViewInformation(array $availableAndInstalledExtensions, bool $isComposerMode): array
261  {
262  $isOfflineMode = (bool)($this->settings['offlineMode'] ?? false);
263  foreach ($availableAndInstalledExtensions as &$extension) {
264  $extension['updateIsBlocked'] = $isComposerMode || $isOfflineMode || ($extension['state'] ?? '') === 'excludeFromUpdates';
265  $extension['sortUpdate'] = 2;
266  if ($extension['updateAvailable'] ?? false) {
267  $extension['sortUpdate'] = (int)$extension['updateIsBlocked'];
268  }
269  }
270  return $availableAndInstalledExtensions;
271  }
272 
273  protected function ‪extensionsWithUpdate(array $availableAndInstalledExtensions): array
274  {
275  return array_filter($availableAndInstalledExtensions, static function ($extension) {
276  return $extension['updateAvailable'] ?? false;
277  });
278  }
279 
281  {
282  return ‪$GLOBALS['BE_USER'];
283  }
284 }
‪TYPO3\CMS\Extensionmanager\Controller\ListController\indexAction
‪indexAction()
Definition: ListController.php:73
‪TYPO3\CMS\Extbase\Utility\LocalizationUtility
Definition: LocalizationUtility.php:35
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension
Definition: Extension.php:28
‪TYPO3\CMS\Core\Configuration\ExtensionConfiguration
Definition: ExtensionConfiguration.php:47
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\$view
‪ViewInterface $view
Definition: ActionController.php:89
‪TYPO3\CMS\Extensionmanager\Controller\ListController\addComposerModeNotification
‪addComposerModeNotification()
Definition: ListController.php:243
‪TYPO3\CMS\Extensionmanager\Controller\AbstractController\translate
‪translate(string $key, ?array $arguments=null)
Definition: AbstractController.php:51
‪TYPO3\CMS\Core\Core\Environment\isComposerMode
‪static isComposerMode()
Definition: Environment.php:137
‪TYPO3\CMS\Extbase\Pagination\QueryResultPaginator
Definition: QueryResultPaginator.php:24
‪TYPO3\CMS\Core\Imaging\IconFactory
Definition: IconFactory.php:34
‪TYPO3\CMS\Extensionmanager\Controller
Definition: AbstractController.php:18
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility
Definition: ListUtility.php:40
‪TYPO3\CMS\Extensionmanager\Controller\ListController\initializeAction
‪initializeAction()
Definition: ListController.php:64
‪TYPO3\CMS\Backend\Template\ModuleTemplate
Definition: ModuleTemplate.php:46
‪TYPO3\CMS\Core\Pagination\SimplePagination
Definition: SimplePagination.php:21
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility\isLoaded
‪static isLoaded(string $key)
Definition: ExtensionManagementUtility.php:93
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension\createFromExtensionArray
‪static createFromExtensionArray(array $extensionArray)
Definition: Extension.php:590
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility
Definition: ExtensionManagementUtility.php:40
‪TYPO3\CMS\Core\Type\ContextualFeedbackSeverity
‪ContextualFeedbackSeverity
Definition: ContextualFeedbackSeverity.php:25
‪TYPO3\CMS\Extensionmanager\Controller\ListController\__construct
‪__construct(protected readonly PageRenderer $pageRenderer, protected readonly ExtensionRepository $extensionRepository, protected readonly ListUtility $listUtility, protected readonly DependencyUtility $dependencyUtility, protected readonly IconFactory $iconFactory, protected readonly RemoteRegistry $remoteRegistry, protected readonly ExtensionConfiguration $extensionConfiguration,)
Definition: ListController.php:50
‪TYPO3\CMS\Extensionmanager\Controller\AbstractController\initializeModuleTemplate
‪initializeModuleTemplate(RequestInterface $request)
Definition: AbstractController.php:76
‪TYPO3\CMS\Core\Page\PageRenderer
Definition: PageRenderer.php:46
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\addFlashMessage
‪addFlashMessage(string $messageBody, $messageTitle='', ContextualFeedbackSeverity $severity=ContextualFeedbackSeverity::OK, $storeInSession=true)
Definition: ActionController.php:672
‪TYPO3\CMS\Extensionmanager\Controller\ListController\enrichExtensionsWithViewInformation
‪enrichExtensionsWithViewInformation(array $availableAndInstalledExtensions, bool $isComposerMode)
Definition: ListController.php:260
‪TYPO3\CMS\Extensionmanager\Utility\DependencyUtility
Definition: DependencyUtility.php:35
‪TYPO3\CMS\Extensionmanager\Controller\ListController\getBackendUserAuthentication
‪getBackendUserAuthentication()
Definition: ListController.php:280
‪TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository
Definition: ExtensionRepository.php:35
‪TYPO3\CMS\Extbase\Utility\LocalizationUtility\translate
‪static string null translate(string $key, ?string $extensionName=null, array $arguments=null, Locale|string $languageKey=null)
Definition: LocalizationUtility.php:47
‪TYPO3\CMS\Extensionmanager\Controller\ListController\distributionsAction
‪distributionsAction(bool $showUnsuitableDistributions=false)
Definition: ListController.php:168
‪TYPO3\CMS\Extensionmanager\Controller\ListController\terAction
‪terAction(string $search='', int $currentPage=1)
Definition: ListController.php:135
‪TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException
Definition: ExtensionManagerException.php:24
‪TYPO3\CMS\Extbase\Persistence\QueryResultInterface
Definition: QueryResultInterface.php:26
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:64
‪TYPO3\CMS\Extensionmanager\Controller\AbstractController
Definition: AbstractController.php:32
‪TYPO3\CMS\Extensionmanager\Controller\ListController\extensionsWithUpdate
‪extensionsWithUpdate(array $availableAndInstalledExtensions)
Definition: ListController.php:273
‪TYPO3\CMS\Extensionmanager\Controller\ListController\registerDocHeaderButtons
‪registerDocHeaderButtons(ModuleTemplate $view)
Definition: ListController.php:212
‪TYPO3\CMS\Extensionmanager\Controller\AbstractController\handleTriggerArguments
‪handleTriggerArguments(ModuleTemplate $view)
Definition: AbstractController.php:61
‪TYPO3\CMS\Core\Pagination\ArrayPaginator
Definition: ArrayPaginator.php:21
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Extensionmanager\Controller\ListController
Definition: ListController.php:49
‪TYPO3\CMS\Extensionmanager\Controller\ListController\showAllVersionsAction
‪showAllVersionsAction(string $extensionKey)
Definition: ListController.php:195
‪TYPO3\CMS\Extensionmanager\Remote\RemoteRegistry
Definition: RemoteRegistry.php:26
‪TYPO3\CMS\Extensionmanager\Controller\ListController\unresolvedDependenciesAction
‪unresolvedDependenciesAction(string $extensionKey, array $returnAction)
Definition: ListController.php:109