‪TYPO3CMS  11.5
LocalizationRepository.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 Doctrine\DBAL\Result;
25 use TYPO3\CMS\Core\Database\Query\QueryBuilder;
29 
36 {
41 
43  {
44  $this->translationConfigurationProvider = ‪$translationConfigurationProvider ?? GeneralUtility::makeInstance(TranslationConfigurationProvider::class);
45  }
46 
54  public function ‪fetchOriginLanguage(int $pageId, int $localizedLanguage): array
55  {
56  $queryBuilder = $this->‪getQueryBuilderWithWorkspaceRestriction('tt_content');
57 
58  $queryBuilder->select('tt_content_orig.sys_language_uid')
59  ->from('tt_content')
60  ->join(
61  'tt_content',
62  'tt_content',
63  'tt_content_orig',
64  $queryBuilder->expr()->eq(
65  'tt_content.l10n_source',
66  $queryBuilder->quoteIdentifier('tt_content_orig.uid')
67  )
68  )
69  ->where(
70  $queryBuilder->expr()->eq(
71  'tt_content.pid',
72  $queryBuilder->createNamedParameter($pageId, ‪Connection::PARAM_INT)
73  ),
74  $queryBuilder->expr()->eq(
75  'tt_content.sys_language_uid',
76  $queryBuilder->createNamedParameter($localizedLanguage, ‪Connection::PARAM_INT)
77  ),
78  $queryBuilder->expr()->neq(
79  'tt_content_orig.sys_language_uid',
80  $queryBuilder->createNamedParameter(-1, ‪Connection::PARAM_INT)
81  )
82  )
83  ->groupBy('tt_content_orig.sys_language_uid');
84  $this->‪getAllowedLanguageConstraintsForBackendUser($pageId, $queryBuilder, $this->‪getBackendUser(), 'tt_content_orig');
85 
86  return $queryBuilder->executeQuery()->fetchAssociative() ?: [];
87  }
88 
97  public function ‪getLocalizedRecordCount(int $pageId, int $languageId): int
98  {
99  $queryBuilder = $this->‪getQueryBuilderWithWorkspaceRestriction('tt_content');
100 
101  $rowCount = $queryBuilder->count('uid')
102  ->from('tt_content')
103  ->where(
104  $queryBuilder->expr()->eq(
105  'sys_language_uid',
106  $queryBuilder->createNamedParameter($languageId, ‪Connection::PARAM_INT)
107  ),
108  $queryBuilder->expr()->eq(
109  'pid',
110  $queryBuilder->createNamedParameter($pageId, ‪Connection::PARAM_INT)
111  ),
112  $queryBuilder->expr()->neq(
113  'l10n_source',
114  $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT)
115  )
116  )
117  ->executeQuery()
118  ->fetchOne();
119 
120  return (int)$rowCount;
121  }
122 
130  public function ‪fetchAvailableLanguages(int $pageId, int $languageId): array
131  {
132  $queryBuilder = $this->‪getQueryBuilderWithWorkspaceRestriction('tt_content');
133  $queryBuilder->select('sys_language_uid')
134  ->from('tt_content')
135  ->where(
136  $queryBuilder->expr()->eq(
137  'pid',
138  $queryBuilder->createNamedParameter($pageId, ‪Connection::PARAM_INT)
139  ),
140  $queryBuilder->expr()->neq(
141  'sys_language_uid',
142  $queryBuilder->createNamedParameter($languageId, ‪Connection::PARAM_INT)
143  )
144  )
145  ->groupBy('sys_language_uid');
146 
147  $this->‪getAllowedLanguageConstraintsForBackendUser($pageId, $queryBuilder, $this->‪getBackendUser());
148  $languages = $queryBuilder->executeQuery()->fetchAllAssociative();
149  return $languages ?: [];
150  }
151 
161  protected function ‪getAllowedLanguageConstraintsForBackendUser(int $pageId, QueryBuilder $queryBuilder, ‪BackendUserAuthentication $backendUser, string $alias = ''): void
162  {
163  if ($backendUser->‪isAdmin()) {
164  return;
165  }
166  // This always includes default language
167  $allowedLanguages = $this->translationConfigurationProvider->getSystemLanguages($pageId);
168  $queryBuilder->andWhere(
169  $queryBuilder->expr()->in(
170  ($alias === '' ? '' : ($alias . '.')) . 'sys_language_uid',
171  $queryBuilder->createNamedParameter(array_keys($allowedLanguages), Connection::PARAM_INT_ARRAY)
172  )
173  );
174  }
175 
185  public function ‪getRecordsToCopyDatabaseResult(int $pageId, int $destLanguageId, int $languageId, string ‪$fields = '*')
186  {
187  $originalUids = [];
188 
189  // Get original uid of existing elements triggered language
190  $queryBuilder = $this->‪getQueryBuilderWithWorkspaceRestriction('tt_content');
191 
192  $originalUidsStatement = $queryBuilder
193  ->select('l10n_source')
194  ->from('tt_content')
195  ->where(
196  $queryBuilder->expr()->eq(
197  'sys_language_uid',
198  $queryBuilder->createNamedParameter($destLanguageId, ‪Connection::PARAM_INT)
199  ),
200  $queryBuilder->expr()->eq(
201  'pid',
202  $queryBuilder->createNamedParameter($pageId, ‪Connection::PARAM_INT)
203  )
204  )
205  ->executeQuery();
206 
207  while ($origUid = $originalUidsStatement->fetchOne()) {
208  $originalUids[] = (int)$origUid;
209  }
210 
211  $queryBuilder->select(...‪GeneralUtility::trimExplode(',', ‪$fields, true))
212  ->from('tt_content')
213  ->where(
214  $queryBuilder->expr()->eq(
215  'sys_language_uid',
216  $queryBuilder->createNamedParameter($languageId, ‪Connection::PARAM_INT)
217  ),
218  $queryBuilder->expr()->eq(
219  'pid',
220  $queryBuilder->createNamedParameter($pageId, ‪Connection::PARAM_INT)
221  )
222  )
223  ->orderBy('sorting');
224 
225  if (!empty($originalUids)) {
226  $queryBuilder
227  ->andWhere(
228  $queryBuilder->expr()->notIn(
229  'uid',
230  $queryBuilder->createNamedParameter($originalUids, Connection::PARAM_INT_ARRAY)
231  )
232  );
233  }
234 
235  return $queryBuilder->executeQuery();
236  }
237 
243  protected function ‪getBackendUser(): BackendUserAuthentication
244  {
245  return ‪$GLOBALS['BE_USER'];
246  }
247 
255  protected function ‪getQueryBuilderWithWorkspaceRestriction(string $tableName): QueryBuilder
256  {
257  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($tableName);
258  $queryBuilder->getRestrictions()
259  ->removeAll()
260  ->add(GeneralUtility::makeInstance(DeletedRestriction::class))
261  ->add(GeneralUtility::makeInstance(WorkspaceRestriction::class, (int)$this->‪getBackendUser()->workspace));
262 
263  return $queryBuilder;
264  }
265 }
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static list< string > trimExplode($delim, $string, $removeEmptyValues=false, $limit=0)
Definition: GeneralUtility.php:999
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:49
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository
Definition: LocalizationRepository.php:36
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication\isAdmin
‪bool isAdmin()
Definition: BackendUserAuthentication.php:245
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\getAllowedLanguageConstraintsForBackendUser
‪getAllowedLanguageConstraintsForBackendUser(int $pageId, QueryBuilder $queryBuilder, BackendUserAuthentication $backendUser, string $alias='')
Definition: LocalizationRepository.php:160
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\__construct
‪__construct(TranslationConfigurationProvider $translationConfigurationProvider=null)
Definition: LocalizationRepository.php:41
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\getQueryBuilderWithWorkspaceRestriction
‪QueryBuilder getQueryBuilderWithWorkspaceRestriction(string $tableName)
Definition: LocalizationRepository.php:254
‪$fields
‪$fields
Definition: pages.php:5
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\getLocalizedRecordCount
‪int getLocalizedRecordCount(int $pageId, int $languageId)
Definition: LocalizationRepository.php:96
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\fetchAvailableLanguages
‪array fetchAvailableLanguages(int $pageId, int $languageId)
Definition: LocalizationRepository.php:129
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:62
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:38
‪TYPO3\CMS\Backend\Domain\Repository\Localization
Definition: LocalizationRepository.php:18
‪TYPO3\CMS\Backend\Configuration\TranslationConfigurationProvider
Definition: TranslationConfigurationProvider.php:37
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction
Definition: DeletedRestriction.php:28
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\getRecordsToCopyDatabaseResult
‪Result getRecordsToCopyDatabaseResult(int $pageId, int $destLanguageId, int $languageId, string $fields=' *')
Definition: LocalizationRepository.php:184
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\fetchOriginLanguage
‪array fetchOriginLanguage(int $pageId, int $localizedLanguage)
Definition: LocalizationRepository.php:53
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\getBackendUser
‪BackendUserAuthentication getBackendUser()
Definition: LocalizationRepository.php:242
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\$translationConfigurationProvider
‪TranslationConfigurationProvider $translationConfigurationProvider
Definition: LocalizationRepository.php:39
‪TYPO3\CMS\Core\Database\Query\Restriction\WorkspaceRestriction
Definition: WorkspaceRestriction.php:40