‪TYPO3CMS  11.5
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 
79  public function ‪injectEmConfUtility(EmConfUtility ‪$emConfUtility)
80  {
81  $this->emConfUtility = ‪$emConfUtility;
82  }
83 
88  {
89  $this->extensionRepository = ‪$extensionRepository;
90  }
91 
95  public function ‪injectPackageManager(PackageManager ‪$packageManager)
96  {
97  $this->packageManager = ‪$packageManager;
98  }
99 
103  public function ‪injectDependencyUtility(‪DependencyUtility $dependencyUtility)
104  {
105  $this->dependencyUtility = $dependencyUtility;
106  }
107 
114  public function ‪getAvailableExtensions(string $filter = ''): array
115  {
116  if ($this->availableExtensions === null) {
117  $this->availableExtensions = [];
118  $this->‪eventDispatcher->dispatch(new PackagesMayHaveChangedEvent());
119  foreach ($this->packageManager->getAvailablePackages() as $package) {
120  if (!$package->getPackageMetaData()->isExtensionType()) {
121  continue;
122  }
123  $installationType = $this->‪getInstallTypeForPackage($package);
124  if ($filter === '' || $filter === $installationType) {
125  $version = $package->getPackageMetaData()->getVersion();
126  $icon = ‪ExtensionManagementUtility::getExtensionIcon($package->getPackagePath());
127  $extensionData = [
128  'packagePath' => $package->getPackagePath(),
129  'type' => $installationType,
130  'key' => $package->getPackageKey(),
131  'version' => $version,
132  'state' => str_starts_with($version, 'dev-') ? 'alpha' : 'stable',
133  'icon' => $icon ? ‪PathUtility::getAbsoluteWebPath($package->getPackagePath() . $icon) : '',
134  'title' => $package->getPackageMetaData()->getTitle(),
135  ];
136  $this->availableExtensions[$package->getPackageKey()] = $extensionData;
137  }
138  }
139  }
140 
141  return $this->availableExtensions;
142  }
143 
147  public function ‪reloadAvailableExtensions()
148  {
149  $this->availableExtensions = null;
150  $this->packageManager->scanAvailablePackages();
151  $this->‪getAvailableExtensions();
152  }
153 
159  public function ‪getExtension($extensionKey)
160  {
161  return $this->packageManager->getPackage($extensionKey);
162  }
163 
170  protected function ‪getInstallTypeForPackage(‪PackageInterface $package)
171  {
173  return $package->‪getPackageMetaData()->‪isFrameworkType() ? 'System' : 'Local';
174  }
175  foreach (‪Extension::returnInstallPaths() as $installType => $installPath) {
176  if (str_starts_with($package->‪getPackagePath(), $installPath)) {
177  return $installType;
178  }
179  }
180  return '';
181  }
182 
189  public function ‪getAvailableAndInstalledExtensions(array $availableExtensions)
190  {
191  foreach ($this->packageManager->getActivePackages() as $extKey => $_) {
192  if (isset($availableExtensions[$extKey])) {
193  $availableExtensions[$extKey]['installed'] = true;
194  }
195  }
196  return $availableExtensions;
197  }
198 
205  public function ‪enrichExtensionsWithEmConfInformation(array $extensions)
206  {
207  foreach ($extensions as $extensionKey => $properties) {
208  $emConf = $this->emConfUtility->includeEmConf($extensionKey, $properties['packagePath'] ?? '');
209  if (!is_array($emConf)) {
210  continue;
211  }
212  $extensions[$extensionKey] = array_merge($emConf, $properties);
213  $extensions[$extensionKey]['state'] = $emConf['state'] ?? $extensions[$extensionKey]['state'] ?? 'stable';
214  }
215  return $extensions;
216  }
217 
224  public function ‪enrichExtensionsWithEmConfAndTerInformation(array $extensions)
225  {
226  $extensions = $this->‪enrichExtensionsWithEmConfInformation($extensions);
227  foreach ($extensions as $extensionKey => $properties) {
228  $terObject = $this->‪getExtensionTerData($extensionKey, $extensions[$extensionKey]['version'] ?? '');
229  if ($terObject instanceof Extension) {
230  $extensions[$extensionKey]['terObject'] = $terObject;
231  $extensions[$extensionKey]['remote'] = $terObject->getRemoteIdentifier();
232  $extensions[$extensionKey]['updateAvailable'] = false;
233  $extensions[$extensionKey]['updateToVersion'] = null;
234  $extensionToUpdate = $this->‪getUpdateableVersion($terObject);
235  if ($extensionToUpdate instanceof Extension) {
236  $extensions[$extensionKey]['updateAvailable'] = true;
237  $extensions[$extensionKey]['updateToVersion'] = $extensionToUpdate;
238  }
239  }
240  }
241  return $extensions;
242  }
243 
253  protected function ‪getExtensionTerData($extensionKey, $version): ?Extension
254  {
255  $terObject = $this->extensionRepository->findOneByExtensionKeyAndVersion($extensionKey, $version);
256  if (!$terObject instanceof Extension) {
257  // Version unknown in TER data, try to find extension
258  $terObject = $this->extensionRepository->findHighestAvailableVersion($extensionKey);
259  if ($terObject instanceof Extension) {
260  // Found in TER now, set version information to the known ones, so we can look if there is a newer one
261  // Use a cloned object, otherwise wrong information is stored in persistenceManager
262  $terObject = clone $terObject;
263  $terObject->setVersion($version);
264  $terObject->setIntegerVersion(
266  );
267  } else {
268  $terObject = null;
269  }
270  }
271 
272  return $terObject;
273  }
274 
282  public function ‪getAvailableAndInstalledExtensionsWithAdditionalInformation(string $filter = ''): array
283  {
284  $availableExtensions = $this->‪getAvailableExtensions($filter);
285  $availableAndInstalledExtensions = $this->‪getAvailableAndInstalledExtensions($availableExtensions);
286  return $this->‪enrichExtensionsWithEmConfAndTerInformation($availableAndInstalledExtensions);
287  }
288 
295  protected function ‪getUpdateableVersion(Extension $extensionData): ?Extension
296  {
297  // Only check for update for TER extensions
298  $version = $extensionData->getIntegerVersion();
299  $extensionUpdates = $this->extensionRepository->findByVersionRangeAndExtensionKeyOrderedByVersion(
300  $extensionData->getExtensionKey(),
301  $version,
302  0,
303  false
304  );
305  if ($extensionUpdates->count() > 0) {
306  foreach ($extensionUpdates as $extensionUpdate) {
308  $this->dependencyUtility->checkDependencies($extensionUpdate);
309  if (!$this->dependencyUtility->hasDependencyErrors()) {
310  return $extensionUpdate;
311  }
312  }
313  }
314  return null;
315  }
316 }
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\reloadAvailableExtensions
‪reloadAvailableExtensions()
Definition: ListUtility.php:141
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\injectEmConfUtility
‪injectEmConfUtility(EmConfUtility $emConfUtility)
Definition: ListUtility.php:73
‪TYPO3\CMS\Core\Utility\VersionNumberUtility
Definition: VersionNumberUtility.php:24
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\getAvailableExtensions
‪array[] getAvailableExtensions(string $filter='')
Definition: ListUtility.php:108
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\$packageManager
‪PackageManager $packageManager
Definition: ListUtility.php:51
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\getAvailableAndInstalledExtensionsWithAdditionalInformation
‪array getAvailableAndInstalledExtensionsWithAdditionalInformation(string $filter='')
Definition: ListUtility.php:276
‪TYPO3\CMS\Core\Utility\PathUtility
Definition: PathUtility.php:25
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension\getIntegerVersion
‪int getIntegerVersion()
Definition: Extension.php:545
‪TYPO3\CMS\Extensionmanager\Utility
Definition: DependencyUtility.php:16
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension\setVersion
‪setVersion($version)
Definition: Extension.php:390
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension
Definition: Extension.php:28
‪TYPO3\CMS\Core\Package\PackageInterface\getPackagePath
‪string getPackagePath()
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\injectPackageManager
‪injectPackageManager(PackageManager $packageManager)
Definition: ListUtility.php:89
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\getUpdateableVersion
‪Extension null getUpdateableVersion(Extension $extensionData)
Definition: ListUtility.php:289
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility
Definition: ListUtility.php:40
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\enrichExtensionsWithEmConfInformation
‪array enrichExtensionsWithEmConfInformation(array $extensions)
Definition: ListUtility.php:199
‪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:43
‪TYPO3\CMS\Core\Utility\VersionNumberUtility\convertVersionNumberToInteger
‪static int convertVersionNumberToInteger($versionNumber)
Definition: VersionNumberUtility.php:31
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\injectDependencyUtility
‪injectDependencyUtility(DependencyUtility $dependencyUtility)
Definition: ListUtility.php:97
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\enrichExtensionsWithEmConfAndTerInformation
‪array enrichExtensionsWithEmConfAndTerInformation(array $extensions)
Definition: ListUtility.php:218
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\getExtensionTerData
‪Extension null getExtensionTerData($extensionKey, $version)
Definition: ListUtility.php:247
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\getAvailableAndInstalledExtensions
‪array getAvailableAndInstalledExtensions(array $availableExtensions)
Definition: ListUtility.php:183
‪TYPO3\CMS\Extensionmanager\Utility\DependencyUtility
Definition: DependencyUtility.php:35
‪TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository
Definition: ExtensionRepository.php:34
‪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:81
‪TYPO3\CMS\Core\Core\Environment\isComposerMode
‪static bool isComposerMode()
Definition: Environment.php:152
‪TYPO3\CMS\Core\Package\PackageInterface\getPackageMetaData
‪MetaData getPackageMetaData()
‪TYPO3\CMS\Core\SingletonInterface
Definition: SingletonInterface.php:22
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:43
‪TYPO3\CMS\Core\Package\Event\PackagesMayHaveChangedEvent
Definition: PackagesMayHaveChangedEvent.php:23
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\getExtension
‪TYPO3 CMS Core Package PackageInterface getExtension($extensionKey)
Definition: ListUtility.php:153
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\getInstallTypeForPackage
‪string getInstallTypeForPackage(PackageInterface $package)
Definition: ListUtility.php:164
‪TYPO3\CMS\Core\Utility\ExtensionManagementUtility\getExtensionIcon
‪static string getExtensionIcon($extensionPath, $returnFullPath=false)
Definition: ExtensionManagementUtility.php:1482
‪TYPO3\CMS\Core\Utility\PathUtility\getAbsoluteWebPath
‪static string getAbsoluteWebPath($targetPath, bool $prefixWithSitePath=true)
Definition: PathUtility.php:51
‪TYPO3\CMS\Extensionmanager\Domain\Model\Extension\returnInstallPaths
‪static array returnInstallPaths()
Definition: Extension.php:441
‪TYPO3\CMS\Extensionmanager\Utility\ListUtility\$extensionRepository
‪ExtensionRepository $extensionRepository
Definition: ListUtility.php:47