‪TYPO3CMS  ‪main
RecordsXmlSitemapDataProvider.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\ServerRequestInterface;
30 
36 {
37  public function ‪__construct(ServerRequestInterface ‪$request, string ‪$key, array ‪$config = [], ‪ContentObjectRenderer ‪$cObj = null)
38  {
39  parent::__construct(‪$request, ‪$key, ‪$config, ‪$cObj);
40  $this->‪generateItems();
41  }
42 
46  public function ‪generateItems(): void
47  {
48  $table = $this->config['table'];
49 
50  if (empty($table)) {
52  'No configuration found for sitemap ' . $this->‪getKey(),
53  1535576053
54  );
55  }
56 
57  $pids = !empty($this->config['pid']) ? ‪GeneralUtility::intExplode(',', (string)$this->config['pid']) : [];
58  $lastModifiedField = $this->config['lastModifiedField'] ?? 'tstamp';
59  $sortField = $this->config['sortField'] ?? 'sorting';
60 
61  $changeFreqField = $this->config['changeFreqField'] ?? '';
62  $priorityField = $this->config['priorityField'] ?? '';
63 
64  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
65  ->getQueryBuilderForTable($table);
66 
67  $constraints = [];
68  if (!empty(‪$GLOBALS['TCA'][$table]['ctrl']['languageField'])) {
69  $constraints[] = $queryBuilder->expr()->in(
70  ‪$GLOBALS['TCA'][$table]['ctrl']['languageField'],
71  [
72  -1, // All languages
73  $this->‪getLanguageId(), // Current language
74  ]
75  );
76  }
77 
78  if (!empty($pids)) {
79  $recursiveLevel = isset($this->config['recursive']) ? (int)$this->config['recursive'] : 0;
80  $pids = GeneralUtility::makeInstance(PageRepository::class)->getPageIdsRecursive($pids, $recursiveLevel);
81  $constraints[] = $queryBuilder->expr()->in('pid', $pids);
82  }
83 
84  if (!empty($this->config['additionalWhere'])) {
85  $constraints[] = ‪QueryHelper::quoteDatabaseIdentifiers($queryBuilder->getConnection(), ‪QueryHelper::stripLogicalOperatorPrefix($this->config['additionalWhere']));
86  }
87 
88  $queryBuilder->getRestrictions()->add(
89  GeneralUtility::makeInstance(WorkspaceRestriction::class, $this->‪getCurrentWorkspaceAspect()->getId())
90  );
91 
92  $queryBuilder->select('*')
93  ->from($table);
94 
95  if (!empty($constraints)) {
96  $queryBuilder->where(
97  ...$constraints
98  );
99  }
100 
101  $rows = $queryBuilder->orderBy($sortField)
102  ->executeQuery()
103  ->fetchAllAssociative();
104 
105  foreach ($rows as $row) {
106  $item = [
107  'data' => $row,
108  'lastMod' => (int)$row[$lastModifiedField],
109  ];
110  if (!empty($changeFreqField)) {
111  $item['changefreq'] = $row[$changeFreqField];
112  }
113  $item['priority'] = !empty($priorityField) ? $row[$priorityField] : 0.5;
114  $this->items[] = $item;
115  }
116  }
117 
118  protected function ‪defineUrl(array $data): array
119  {
120  $pageId = $this->request->getAttribute('frontend.page.information')->getId();
121  $pageId = $this->config['url']['pageId'] ?? $pageId;
122  $additionalParams = [];
123 
124  $additionalParams = $this->‪getUrlFieldParameterMap($additionalParams, $data['data']);
125  $additionalParams = $this->‪getUrlAdditionalParams($additionalParams);
126 
127  $additionalParamsString = http_build_query(
128  $additionalParams,
129  '',
130  '&',
131  PHP_QUERY_RFC3986
132  );
133 
134  $typoLinkConfig = [
135  'parameter' => $pageId,
136  'additionalParams' => $additionalParamsString ? '&' . $additionalParamsString : '',
137  'forceAbsoluteUrl' => 1,
138  ];
139 
140  $data['loc'] = $this->cObj->createUrl($typoLinkConfig);
141 
142  return $data;
143  }
144 
145  protected function ‪getUrlFieldParameterMap(array $additionalParams, array $data): array
146  {
147  if (!empty($this->config['url']['fieldToParameterMap']) &&
148  \is_array($this->config['url']['fieldToParameterMap'])) {
149  foreach ($this->config['url']['fieldToParameterMap'] as $field => $urlPart) {
150  $additionalParams[$urlPart] = $data[$field];
151  }
152  }
153 
154  return $additionalParams;
155  }
156 
157  protected function ‪getUrlAdditionalParams(array $additionalParams): array
158  {
159  if (!empty($this->config['url']['additionalGetParameters']) &&
160  is_array($this->config['url']['additionalGetParameters'])) {
161  foreach ($this->config['url']['additionalGetParameters'] as $extension => $extensionConfig) {
162  foreach ($extensionConfig as ‪$key => $value) {
163  $additionalParams[$extension . '[' . ‪$key . ']'] = $value;
164  }
165  }
166  }
167 
168  return $additionalParams;
169  }
170 
171  protected function ‪getLanguageId(): int
172  {
173  $context = GeneralUtility::makeInstance(Context::class);
174  return (int)$context->getPropertyFromAspect('language', 'id');
175  }
176 
178  {
179  return GeneralUtility::makeInstance(Context::class)->getAspect('workspace');
180  }
181 }
‪TYPO3\CMS\Seo\XmlSitemap\RecordsXmlSitemapDataProvider\getCurrentWorkspaceAspect
‪getCurrentWorkspaceAspect()
Definition: RecordsXmlSitemapDataProvider.php:177
‪TYPO3\CMS\Core\Context\WorkspaceAspect
Definition: WorkspaceAspect.php:31
‪TYPO3\CMS\Core\Database\Query\QueryHelper\quoteDatabaseIdentifiers
‪static quoteDatabaseIdentifiers(Connection $connection, string $sql)
Definition: QueryHelper.php:224
‪TYPO3\CMS\Seo\XmlSitemap\AbstractXmlSitemapDataProvider\$key
‪string $key
Definition: AbstractXmlSitemapDataProvider.php:29
‪TYPO3\CMS\Seo\XmlSitemap\RecordsXmlSitemapDataProvider\getUrlAdditionalParams
‪getUrlAdditionalParams(array $additionalParams)
Definition: RecordsXmlSitemapDataProvider.php:157
‪TYPO3\CMS\Seo\XmlSitemap\RecordsXmlSitemapDataProvider\defineUrl
‪defineUrl(array $data)
Definition: RecordsXmlSitemapDataProvider.php:118
‪TYPO3\CMS\Seo\XmlSitemap\AbstractXmlSitemapDataProvider\$config
‪array $config
Definition: AbstractXmlSitemapDataProvider.php:31
‪TYPO3\CMS\Seo\XmlSitemap\RecordsXmlSitemapDataProvider\getLanguageId
‪getLanguageId()
Definition: RecordsXmlSitemapDataProvider.php:171
‪TYPO3\CMS\Core\Context\Context
Definition: Context.php:54
‪TYPO3\CMS\Seo\XmlSitemap\AbstractXmlSitemapDataProvider\getKey
‪getKey()
Definition: AbstractXmlSitemapDataProvider.php:44
‪TYPO3\CMS\Seo\XmlSitemap
Definition: AbstractXmlSitemapDataProvider.php:18
‪TYPO3\CMS\Core\Database\Query\QueryHelper
Definition: QueryHelper.php:32
‪TYPO3\CMS\Seo\XmlSitemap\AbstractXmlSitemapDataProvider\$request
‪ServerRequestInterface $request
Definition: AbstractXmlSitemapDataProvider.php:34
‪TYPO3\CMS\Seo\XmlSitemap\Exception\MissingConfigurationException
Definition: MissingConfigurationException.php:22
‪TYPO3\CMS\Seo\XmlSitemap\RecordsXmlSitemapDataProvider
Definition: RecordsXmlSitemapDataProvider.php:36
‪TYPO3\CMS\Seo\XmlSitemap\AbstractXmlSitemapDataProvider
Definition: AbstractXmlSitemapDataProvider.php:28
‪TYPO3\CMS\Core\Database\Query\QueryHelper\stripLogicalOperatorPrefix
‪static string stripLogicalOperatorPrefix(string $constraint)
Definition: QueryHelper.php:171
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer
Definition: ContentObjectRenderer.php:102
‪TYPO3\CMS\Core\Domain\Repository\PageRepository
Definition: PageRepository.php:69
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Seo\XmlSitemap\RecordsXmlSitemapDataProvider\getUrlFieldParameterMap
‪getUrlFieldParameterMap(array $additionalParams, array $data)
Definition: RecordsXmlSitemapDataProvider.php:145
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Utility\GeneralUtility\intExplode
‪static list< int > intExplode(string $delimiter, string $string, bool $removeEmptyValues=false)
Definition: GeneralUtility.php:756
‪TYPO3\CMS\Seo\XmlSitemap\AbstractXmlSitemapDataProvider\$cObj
‪ContentObjectRenderer $cObj
Definition: AbstractXmlSitemapDataProvider.php:32
‪TYPO3\CMS\Seo\XmlSitemap\RecordsXmlSitemapDataProvider\__construct
‪__construct(ServerRequestInterface $request, string $key, array $config=[], ContentObjectRenderer $cObj=null)
Definition: RecordsXmlSitemapDataProvider.php:37
‪TYPO3\CMS\Seo\XmlSitemap\RecordsXmlSitemapDataProvider\generateItems
‪generateItems()
Definition: RecordsXmlSitemapDataProvider.php:46
‪TYPO3\CMS\Core\Database\Query\Restriction\WorkspaceRestriction
Definition: WorkspaceRestriction.php:39