‪TYPO3CMS  ‪main
FrontendGenerationPageIndexingTrigger.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\EventDispatcher\EventDispatcherInterface;
30 
38 {
39  public function ‪__construct(
40  protected readonly ‪ExtensionConfiguration $extensionConfiguration,
41  protected readonly ‪TimeTracker $timeTracker,
42  protected readonly ‪PageTitleProviderManager $pageTitleProviderManager,
43  protected readonly ‪Indexer $indexer,
44  private readonly EventDispatcherInterface $eventDispatcher,
45  ) {}
46 
51  #[AsEventListener('indexed-search')]
53  {
54  if (!$event->‪isCachingEnabled()) {
55  return;
56  }
57  $tsfe = $event->‪getController();
58  // Determine if page should be indexed, and if so, configure and initialize indexer
59  if (!($tsfe->config['config']['index_enable'] ?? false)) {
60  return;
61  }
62 
63  // Indexer configuration from Extension Manager interface:
64  $disableFrontendIndexing = (bool)$this->extensionConfiguration->get('indexed_search', 'disableFrontendIndexing');
65  $forceIndexing = $this->eventDispatcher->dispatch(new ‪EnableIndexingEvent($event->‪getRequest()))->isIndexingEnabled();
66 
67  $this->timeTracker->push('Index page');
68  if ($disableFrontendIndexing && !$forceIndexing) {
69  $this->timeTracker->setTSlogMessage('Index page? No, Ordinary Frontend indexing during rendering is disabled.');
70  return;
71  }
72 
73  if ($tsfe->page['no_search'] ?? false) {
74  $this->timeTracker->setTSlogMessage('Index page? No, The "No Search" flag has been set in the page properties!');
75  return;
76  }
78  $languageAspect = $tsfe->getContext()->getAspect('language');
79  if ($languageAspect->getId() !== $languageAspect->getContentId()) {
80  $this->timeTracker->setTSlogMessage('Index page? No, languageId was different from contentId which indicates that the page contains fall-back content and that would be falsely indexed as localized content.');
81  return;
82  }
83  // Init and start indexing
84  $this->indexer->forceIndexing = $forceIndexing;
85  $this->indexer->init($this->‪initializeIndexerConfiguration($tsfe, $languageAspect));
86  $this->indexer->indexTypo3PageContent();
87  $this->timeTracker->pull();
88  }
89 
95  {
96  $pageArguments = $tsfe->‪getPageArguments();
97  $configuration = [
98  // Page id
99  'id' => $tsfe->id,
100  // Page type
101  'type' => $pageArguments->getPageType(),
102  // site language id of the language of the indexing.
103  'sys_language_uid' => $languageAspect->‪getId(),
104  // MP variable, if any (Mount Points)
105  'MP' => $tsfe->MP,
106  // Group list
107  'gr_list' => implode(',', $tsfe->‪getContext()->getPropertyFromAspect('frontend.user', 'groupIds', [0, -1])),
108  // page arguments array
109  'staticPageArguments' => $pageArguments->getStaticArguments(),
110  // The creation date of the TYPO3 page
111  'crdate' => $tsfe->page['crdate'],
112  'rootline_uids' => [],
113  ];
114 
115  // Root line uids
116  foreach ($tsfe->config['rootLine'] as $rlkey => $rldat) {
117  $configuration['rootline_uids'][$rlkey] = $rldat['uid'];
118  }
119  // Content of page
120  // Content string (HTML of TYPO3 page)
121  $configuration['content'] = $tsfe->content;
122 
123  // Alternative title for indexing
124  // @see https://forge.typo3.org/issues/88041
125  $configuration['indexedDocTitle'] = $this->pageTitleProviderManager->getTitle();
126 
127  // Most recent modification time (seconds) of the content on the page. Used to evaluate whether it should be re-indexed.
128  $configuration['mtime'] = $tsfe->register['SYS_LASTCHANGED'] ?? $tsfe->page['SYS_LASTCHANGED'];
129  // Configuration of behavior
130  $configuration['index_externals'] = $tsfe->config['config']['index_externals'] ?? true;
131  // Whether to index external documents like PDF, DOC etc. (if possible)
132  $configuration['index_descrLgd'] = $tsfe->config['config']['index_descrLgd'] ?? 0;
133  // Length of description text (max 250, default 200)
134  $configuration['index_metatags'] = $tsfe->config['config']['index_metatags'] ?? true;
135  // Set to zero
136  $configuration['recordUid'] = 0;
137  $configuration['freeIndexUid'] = 0;
138  $configuration['freeIndexSetId'] = 0;
139  return $configuration;
140  }
141 }
‪TYPO3\CMS\Frontend\Event\AfterCacheableContentIsGeneratedEvent\getRequest
‪getRequest()
Definition: AfterCacheableContentIsGeneratedEvent.php:37
‪TYPO3\CMS\Frontend\Event\AfterCacheableContentIsGeneratedEvent\isCachingEnabled
‪isCachingEnabled()
Definition: AfterCacheableContentIsGeneratedEvent.php:47
‪TYPO3\CMS\Core\Context\LanguageAspect\getId
‪getId()
Definition: LanguageAspect.php:103
‪TYPO3\CMS\Core\Configuration\ExtensionConfiguration
Definition: ExtensionConfiguration.php:47
‪TYPO3\CMS\Core\Attribute\AsEventListener
Definition: AsEventListener.php:25
‪TYPO3\CMS\IndexedSearch\EventListener
Definition: FrontendGenerationPageIndexingTrigger.php:18
‪TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController\getContext
‪getContext()
Definition: TypoScriptFrontendController.php:2438
‪TYPO3\CMS\Frontend\Event\AfterCacheableContentIsGeneratedEvent\getController
‪getController()
Definition: AfterCacheableContentIsGeneratedEvent.php:42
‪TYPO3\CMS\Frontend\Event\AfterCacheableContentIsGeneratedEvent
Definition: AfterCacheableContentIsGeneratedEvent.php:29
‪TYPO3\CMS\IndexedSearch\Event\EnableIndexingEvent
Definition: EnableIndexingEvent.php:23
‪TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController\getPageArguments
‪getPageArguments()
Definition: TypoScriptFrontendController.php:2446
‪TYPO3\CMS\IndexedSearch\EventListener\FrontendGenerationPageIndexingTrigger\initializeIndexerConfiguration
‪initializeIndexerConfiguration(TypoScriptFrontendController $tsfe, LanguageAspect $languageAspect)
Definition: FrontendGenerationPageIndexingTrigger.php:94
‪TYPO3\CMS\IndexedSearch\EventListener\FrontendGenerationPageIndexingTrigger
Definition: FrontendGenerationPageIndexingTrigger.php:38
‪TYPO3\CMS\Core\PageTitle\PageTitleProviderManager
Definition: PageTitleProviderManager.php:31
‪TYPO3\CMS\Core\Context\LanguageAspect
Definition: LanguageAspect.php:57
‪TYPO3\CMS\IndexedSearch\EventListener\FrontendGenerationPageIndexingTrigger\indexPageContent
‪indexPageContent(AfterCacheableContentIsGeneratedEvent $event)
Definition: FrontendGenerationPageIndexingTrigger.php:52
‪TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController
Definition: TypoScriptFrontendController.php:102
‪TYPO3\CMS\IndexedSearch\EventListener\FrontendGenerationPageIndexingTrigger\__construct
‪__construct(protected readonly ExtensionConfiguration $extensionConfiguration, protected readonly TimeTracker $timeTracker, protected readonly PageTitleProviderManager $pageTitleProviderManager, protected readonly Indexer $indexer, private readonly EventDispatcherInterface $eventDispatcher,)
Definition: FrontendGenerationPageIndexingTrigger.php:39
‪TYPO3\CMS\IndexedSearch\Indexer
Definition: Indexer.php:39
‪TYPO3\CMS\Core\TimeTracker\TimeTracker
Definition: TimeTracker.php:32