‪TYPO3CMS  ‪main
ImportSiteConfigurationsOnPackageInitialization.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\Log\LoggerAwareInterface;
21 use Psr\Log\LoggerAwareTrait;
22 use Symfony\Component\Finder\Finder;
32 
36 final class ‪ImportSiteConfigurationsOnPackageInitialization implements LoggerAwareInterface
37 {
38  use LoggerAwareTrait;
39 
40  public function ‪__construct(
41  private readonly ‪Registry $registry,
42  private readonly ‪SiteConfiguration $siteConfiguration,
43  private readonly ‪SiteWriter $siteWriter,
44  ) {}
45 
46  #[AsEventListener(after: ImportContentOnPackageInitialization::class)]
47  public function ‪__invoke(‪PackageInitializationEvent $event): void
48  {
49  if (!$event->‪hasStorageEntry(ImportContentOnPackageInitialization::class)
50  || !($import = $event->‪getStorageEntry(ImportContentOnPackageInitialization::class)->getResult()['import'] ?? null) instanceof ‪Import
51  ) {
52  return;
53  }
54 
55  $extensionKey = $event->‪getExtensionKey();
56  $importAbsFolder = $event->‪getPackage()->getPackagePath() . 'Initialisation/Site';
57  if (!is_dir($importAbsFolder)) {
58  return;
59  }
60  $destinationFolder = ‪Environment::getConfigPath() . '/sites';
61  ‪GeneralUtility::mkdir($destinationFolder);
62  $existingSites = $this->siteConfiguration->resolveAllExistingSites(false);
63  // @todo: Get rid of symfony finder here: We should use low level tools
64  // here to locate such files.
65  ‪$finder = GeneralUtility::makeInstance(Finder::class);
66  ‪$finder->directories()->in($importAbsFolder);
67  if (‪$finder->hasResults()) {
68  foreach (‪$finder as $siteConfigDirectory) {
69  ‪$siteIdentifier = $siteConfigDirectory->getBasename();
70  if (isset($existingSites[‪$siteIdentifier])) {
71  $this->logger->warning('Skipped importing site configuration from {key} due to existing site identifier {site}', [
72  'key' => $extensionKey,
73  'site' => ‪$siteIdentifier,
74  ]);
75  continue;
76  }
77  $targetDir = $destinationFolder . '/' . ‪$siteIdentifier;
78  if (!$this->registry->get('siteConfigImport', ‪$siteIdentifier) && !is_dir($targetDir)) {
79  ‪GeneralUtility::mkdir($targetDir);
80  GeneralUtility::copyDirectory($siteConfigDirectory->getPathname(), $targetDir);
81  $this->registry->set('siteConfigImport', ‪$siteIdentifier, 1);
82  }
83  }
84  }
85  $newSites = array_diff_key($this->siteConfiguration->resolveAllExistingSites(false), $existingSites);
86 
87  $importedPages = $import->getImportMapId()['pages'] ?? [];
88  $newSiteIdentifierList = [];
89  foreach ($newSites as $newSite) {
90  $exportedPageId = $newSite->getRootPageId();
91  ‪$siteIdentifier = $newSite->getIdentifier();
92  $newSiteIdentifierList[] = ‪$siteIdentifier;
93  $importedPageId = $importedPages[$exportedPageId] ?? null;
94  if ($importedPageId === null) {
95  $this->logger->warning('Imported site configuration with identifier {site} could not be mapped to imported page id', [
96  'site' => ‪$siteIdentifier,
97  ]);
98  continue;
99  }
100  $configuration = $this->siteConfiguration->load(‪$siteIdentifier);
101  $configuration['rootPageId'] = $importedPageId;
102  try {
103  $this->siteWriter->write(‪$siteIdentifier, $configuration);
105  $this->logger->warning(
106  sprintf(
107  'Imported site configuration with identifier %s could not be written: %s',
108  $newSite->getIdentifier(),
109  $e->getMessage()
110  )
111  );
112  continue;
113  }
114  }
115  $event->‪addStorageEntry(__CLASS__, $newSiteIdentifierList);
116  }
117 }
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir
‪static bool mkdir(string $newFolder)
Definition: GeneralUtility.php:1638
‪TYPO3\CMS\Impexp\Initialization\ImportSiteConfigurationsOnPackageInitialization\__construct
‪__construct(private readonly Registry $registry, private readonly SiteConfiguration $siteConfiguration, private readonly SiteWriter $siteWriter,)
Definition: ImportSiteConfigurationsOnPackageInitialization.php:40
‪TYPO3\CMS\Core\Configuration\Exception\SiteConfigurationWriteException
Definition: SiteConfigurationWriteException.php:27
‪$finder
‪if(PHP_SAPI !=='cli') $finder
Definition: header-comment.php:22
‪TYPO3\CMS\Core\Attribute\AsEventListener
Definition: AsEventListener.php:25
‪TYPO3\CMS\Impexp\Initialization
Definition: ImportContentOnPackageInitialization.php:18
‪TYPO3\CMS\Core\Registry
Definition: Registry.php:33
‪TYPO3\CMS\Core\Package\Event\PackageInitializationEvent\getExtensionKey
‪getExtensionKey()
Definition: PackageInitializationEvent.php:42
‪TYPO3\CMS\Core\Configuration\SiteConfiguration
Definition: SiteConfiguration.php:47
‪TYPO3\CMS\Core\Core\Environment\getConfigPath
‪static getConfigPath()
Definition: Environment.php:212
‪TYPO3\CMS\Core\Package\Event\PackageInitializationEvent\getStorageEntry
‪getStorageEntry(string $identifier)
Definition: PackageInitializationEvent.php:67
‪TYPO3\CMS\Core\Package\Event\PackageInitializationEvent
Definition: PackageInitializationEvent.php:30
‪TYPO3\CMS\Impexp\Import
Definition: Import.php:51
‪TYPO3\CMS\Core\Package\Event\PackageInitializationEvent\hasStorageEntry
‪hasStorageEntry(string $identifier)
Definition: PackageInitializationEvent.php:62
‪TYPO3\CMS\Core\Configuration\SiteWriter
Definition: SiteWriter.php:39
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Webhooks\Message\$siteIdentifier
‪identifier readonly int readonly array readonly string readonly string $siteIdentifier
Definition: PageModificationMessage.php:38
‪TYPO3\CMS\Core\Package\Event\PackageInitializationEvent\addStorageEntry
‪addStorageEntry(string $identifier, mixed $data)
Definition: PackageInitializationEvent.php:76
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Impexp\Initialization\ImportSiteConfigurationsOnPackageInitialization
Definition: ImportSiteConfigurationsOnPackageInitialization.php:37
‪TYPO3\CMS\Core\Package\Event\PackageInitializationEvent\getPackage
‪getPackage()
Definition: PackageInitializationEvent.php:47
‪TYPO3\CMS\Impexp\Initialization\ImportSiteConfigurationsOnPackageInitialization\__invoke
‪__invoke(PackageInitializationEvent $event)
Definition: ImportSiteConfigurationsOnPackageInitialization.php:47