‪TYPO3CMS  ‪main
ListUtility.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\EventDispatcher\EventDispatcherInterface;
22 use TYPO3\CMS\Core\Package\PackageManager;
29 
40 {
44  protected ‪$emConfUtility;
45 
49  protected ‪$extensionRepository;
50 
54  protected ‪$packageManager;
55 
59  protected $availableExtensions;
60 
64  protected $eventDispatcher;
65 
69  protected $dependencyUtility;
70 
71  public function injectEventDispatcher(EventDispatcherInterface $eventDispatcher)
72  {
73  $this->‪eventDispatcher = $eventDispatcher;
74  }
75 
76  public function ‪injectEmConfUtility(EmConfUtility ‪$emConfUtility)
77  {
78  $this->emConfUtility = ‪$emConfUtility;
79  }
80 
82  {
83  $this->extensionRepository = ‪$extensionRepository;
84  }
85 
86  public function ‪injectPackageManager(PackageManager ‪$packageManager)
87  {
88  $this->packageManager = ‪$packageManager;
89  }
90 
91  public function ‪injectDependencyUtility(‪DependencyUtility $dependencyUtility)
92  {
93  $this->dependencyUtility = $dependencyUtility;
94  }
95 
101  public function ‪getAvailableExtensions(string $filter = ''): array
102  {
103  if ($this->availableExtensions === null) {
104  $this->availableExtensions = [];
105  $this->‪eventDispatcher->dispatch(new ‪PackagesMayHaveChangedEvent());
106  foreach ($this->packageManager->getAvailablePackages() as $package) {
107  if (!$package->getPackageMetaData()->isExtensionType()) {
108  continue;
109  }
110  $installationType = $this->‪getInstallTypeForPackage($package);
111  if ($filter === '' || $filter === $installationType) {
112  $version = $package->getPackageMetaData()->getVersion();
113  $icon = ‪ExtensionManagementUtility::getExtensionIcon($package->getPackagePath());
114  $extensionData = [
115  'packagePath' => $package->getPackagePath(),
116  'type' => $installationType,
117  'key' => $package->getPackageKey(),
118  'version' => $version,
119  'state' => str_starts_with($version, 'dev-') ? 'alpha' : 'stable',
120  'icon' => $icon ? ‪PathUtility::getAbsoluteWebPath($package->getPackagePath() . $icon) : '',
121  'title' => $package->getPackageMetaData()->getTitle(),
122  ];
123  $this->availableExtensions[$package->getPackageKey()] = $extensionData;
124  }
125  }
126  }
127 
128  return $this->availableExtensions;
129  }
130 
134  public function ‪reloadAvailableExtensions()
135  {
136  $this->availableExtensions = null;
137  $this->packageManager->scanAvailablePackages();
138  $this->‪getAvailableExtensions();
139  }
140 
146  public function ‪getExtension($extensionKey)
147  {
148  return $this->packageManager->getPackage($extensionKey);
149  }
150 
156  protected function ‪getInstallTypeForPackage(‪PackageInterface $package)
157  {
159  return $package->‪getPackageMetaData()->‪isFrameworkType() ? 'System' : 'Local';
160  }
161  foreach (‪Extension::returnInstallPaths() as $installType => $installPath) {
162  if (str_starts_with($package->‪getPackagePath(), $installPath)) {
163  return $installType;
164  }
165  }
166  return '';
167  }
168 
174  public function ‪getAvailableAndInstalledExtensions(array $availableExtensions)
175  {
176  foreach ($this->packageManager->getActivePackages() as $extKey => $_) {
177  if (isset($availableExtensions[$extKey])) {
178  $availableExtensions[$extKey]['installed'] = true;
179  }
180  }
181  return $availableExtensions;
182  }
183 
189  public function ‪enrichExtensionsWithEmConfInformation(array $extensions)
190  {
191  foreach ($extensions as $extensionKey => $properties) {
192  $emConf = $this->emConfUtility->includeEmConf($extensionKey, $properties['packagePath'] ?? '');
193  if (!is_array($emConf)) {
194  continue;
195  }
196  $extensions[$extensionKey] = array_merge($emConf, $properties);
197  $extensions[$extensionKey]['state'] = $emConf['state'] ?? $extensions[$extensionKey]['state'] ?? 'stable';
198  }
199  return $extensions;
200  }
201 
207  public function ‪enrichExtensionsWithEmConfAndTerInformation(array $extensions)
208  {
209  $extensions = $this->‪enrichExtensionsWithEmConfInformation($extensions);
210  foreach ($extensions as $extensionKey => $properties) {
211  $terObject = $this->‪getExtensionTerData($extensionKey, $extensions[$extensionKey]['version'] ?? '');
212  if ($terObject instanceof ‪Extension) {
213  $extensions[$extensionKey]['terObject'] = $terObject;
214  $extensions[$extensionKey]['remote'] = $terObject->getRemoteIdentifier();
215  $extensions[$extensionKey]['updateAvailable'] = false;
216  $extensions[$extensionKey]['updateToVersion'] = null;
217  $extensionToUpdate = $this->‪getUpdateableVersion($terObject);
218  if ($extensionToUpdate instanceof ‪Extension) {
219  $extensions[$extensionKey]['updateAvailable'] = true;
220  $extensions[$extensionKey]['updateToVersion'] = $extensionToUpdate;
221  }
222  }
223  }
224  return $extensions;
225  }
226 
236  protected function ‪getExtensionTerData($extensionKey, $version): ?‪Extension
237  {
238  $terObject = $this->extensionRepository->findOneByExtensionKeyAndVersion($extensionKey, $version);
239  if (!$terObject instanceof ‪Extension) {
240  // Version unknown in TER data, try to find extension
241  $terObject = $this->extensionRepository->findHighestAvailableVersion($extensionKey);
242  if ($terObject instanceof ‪Extension) {
243  // Found in TER now, set version information to the known ones, so we can look if there is a newer one
244  // Use a cloned object, otherwise wrong information is stored in persistenceManager
245  $terObject = clone $terObject;
246  $terObject->‪setVersion($version);
247  $terObject->setIntegerVersion(
249  );
250  } else {
251  $terObject = null;
252  }
253  }
254 
255  return $terObject;
256  }
257 
262  public function ‪getAvailableAndInstalledExtensionsWithAdditionalInformation(string $filter = ''): array
263  {
264  $availableExtensions = $this->‪getAvailableExtensions($filter);
265  $availableAndInstalledExtensions = $this->‪getAvailableAndInstalledExtensions($availableExtensions);
266  return $this->‪enrichExtensionsWithEmConfAndTerInformation($availableAndInstalledExtensions);
267  }
268 
274  protected function ‪getUpdateableVersion(‪Extension $extensionData): ?‪Extension
275  {
276  // Only check for update for TER extensions
277  $version = $extensionData->‪getIntegerVersion();
278  $extensionUpdates = $this->extensionRepository->findByVersionRangeAndExtensionKeyOrderedByVersion(
279  $extensionData->‪getExtensionKey(),
280  $version,
281  0,
282  false
283  );
284  if ($extensionUpdates->count() > 0) {
285  foreach ($extensionUpdates as $extensionUpdate) {
287  $this->dependencyUtility->checkDependencies($extensionUpdate);
288  if (!$this->dependencyUtility->hasDependencyErrors()) {
289  return $extensionUpdate;
290  }
291  }
292  }
293  return null;
294  }
295 }
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\reloadAvailableExtensions
‪reloadAvailableExtensions()
Definition: ListUtility.php:128
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\injectEmConfUtility
‪injectEmConfUtility(EmConfUtility $emConfUtility)
Definition: ListUtility.php:70
‪TYPO3\CMS\Core\Utility\VersionNumberUtility
Definition: VersionNumberUtility.php:26
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\getAvailableExtensions
‪array[] getAvailableExtensions(string $filter='')
Definition: ListUtility.php:95
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\$packageManager
‪PackageManager $packageManager
Definition: ListUtility.php:51
‪TYPO3\CMS\Core\Utility\PathUtility
Definition: PathUtility.php:27
‪TYPO3\CMS\Core\Utility\VersionNumberUtility\convertVersionNumberToInteger
‪static int convertVersionNumberToInteger(string $versionNumber)
Definition: VersionNumberUtility.php:33
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension\getIntegerVersion
‪int getIntegerVersion()
Definition: Extension.php:519
‪TYPO3\CMS\Extensionmanager\Utility
Definition: DependencyUtility.php:16
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension\setVersion
‪setVersion($version)
Definition: Extension.php:387
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility\getExtensionIcon
‪static getExtensionIcon(string $extensionPath, bool $returnFullPath=false)
Definition: ExtensionManagementUtility.php:1144
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension
Definition: Extension.php:28
‪TYPO3\CMS\Core\Core\Environment\isComposerMode
‪static isComposerMode()
Definition: Environment.php:137
‪TYPO3\CMS\Core\Package\PackageInterface\getPackagePath
‪string getPackagePath()
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\injectPackageManager
‪injectPackageManager(PackageManager $packageManager)
Definition: ListUtility.php:80
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\getUpdateableVersion
‪Extension null getUpdateableVersion(Extension $extensionData)
Definition: ListUtility.php:268
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility
Definition: ListUtility.php:40
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\enrichExtensionsWithEmConfInformation
‪array enrichExtensionsWithEmConfInformation(array $extensions)
Definition: ListUtility.php:183
‪TYPO3\CMS\Core\Package\MetaData\isFrameworkType
‪isFrameworkType()
Definition: MetaData.php:97
‪TYPO3\CMS\Core\Package\PackageInterface
Definition: PackageInterface.php:22
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility
Definition: ExtensionManagementUtility.php:40
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\injectDependencyUtility
‪injectDependencyUtility(DependencyUtility $dependencyUtility)
Definition: ListUtility.php:85
‪TYPO3\CMS\Core\Utility\PathUtility\getAbsoluteWebPath
‪static string getAbsoluteWebPath(string $targetPath, bool $prefixWithSitePath=true)
Definition: PathUtility.php:52
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\enrichExtensionsWithEmConfAndTerInformation
‪array enrichExtensionsWithEmConfAndTerInformation(array $extensions)
Definition: ListUtility.php:201
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\getExtensionTerData
‪Extension null getExtensionTerData($extensionKey, $version)
Definition: ListUtility.php:230
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\getAvailableAndInstalledExtensions
‪array getAvailableAndInstalledExtensions(array $availableExtensions)
Definition: ListUtility.php:168
‪TYPO3\CMS\Extensionmanager\Utility\DependencyUtility
Definition: DependencyUtility.php:35
‪TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository
Definition: ExtensionRepository.php:35
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension\getExtensionKey
‪string getExtensionKey()
Definition: Extension.php:269
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\eventDispatcher
‪array< string, $availableExtensions;protected EventDispatcherInterface $eventDispatcher;protected DependencyUtility $dependencyUtility;public function injectEventDispatcher(EventDispatcherInterface $eventDispatcher) { $this-> eventDispatcher
Definition: ListUtility.php:67
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\$emConfUtility
‪EmConfUtility $emConfUtility
Definition: ListUtility.php:43
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\injectExtensionRepository
‪injectExtensionRepository(ExtensionRepository $extensionRepository)
Definition: ListUtility.php:75
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\getAvailableAndInstalledExtensionsWithAdditionalInformation
‪getAvailableAndInstalledExtensionsWithAdditionalInformation(string $filter='')
Definition: ListUtility.php:256
‪TYPO3\CMS\Core\Package\PackageInterface\getPackageMetaData
‪MetaData getPackageMetaData()
‪TYPO3\CMS\Core\SingletonInterface
Definition: SingletonInterface.php:23
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Core\Package\Event\PackagesMayHaveChangedEvent
Definition: PackagesMayHaveChangedEvent.php:24
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\getExtension
‪TYPO3 CMS Core Package PackageInterface getExtension($extensionKey)
Definition: ListUtility.php:140
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\getInstallTypeForPackage
‪string getInstallTypeForPackage(PackageInterface $package)
Definition: ListUtility.php:150
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension\returnInstallPaths
‪static array returnInstallPaths()
Definition: Extension.php:438
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\$extensionRepository
‪ExtensionRepository $extensionRepository
Definition: ListUtility.php:47