‪TYPO3CMS  ‪main
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 
50  public function ‪fetchOriginLanguage(int $pageId, int $localizedLanguage): array
51  {
52  $queryBuilder = $this->‪getQueryBuilderWithWorkspaceRestriction('tt_content');
53 
54  $queryBuilder->select('tt_content_orig.sys_language_uid')
55  ->from('tt_content')
56  ->join(
57  'tt_content',
58  'tt_content',
59  'tt_content_orig',
60  $queryBuilder->expr()->eq(
61  'tt_content.l10n_source',
62  $queryBuilder->quoteIdentifier('tt_content_orig.uid')
63  )
64  )
65  ->where(
66  $queryBuilder->expr()->eq(
67  'tt_content.pid',
68  $queryBuilder->createNamedParameter($pageId, ‪Connection::PARAM_INT)
69  ),
70  $queryBuilder->expr()->eq(
71  'tt_content.sys_language_uid',
72  $queryBuilder->createNamedParameter($localizedLanguage, ‪Connection::PARAM_INT)
73  ),
74  $queryBuilder->expr()->neq(
75  'tt_content_orig.sys_language_uid',
76  $queryBuilder->createNamedParameter(-1, ‪Connection::PARAM_INT)
77  )
78  )
79  ->groupBy('tt_content_orig.sys_language_uid');
80  $this->‪getAllowedLanguageConstraintsForBackendUser($pageId, $queryBuilder, $this->‪getBackendUser(), 'tt_content_orig');
81 
82  return $queryBuilder->executeQuery()->fetchAssociative() ?: [];
83  }
84 
89  public function ‪getLocalizedRecordCount(int $pageId, int $languageId): int
90  {
91  $queryBuilder = $this->‪getQueryBuilderWithWorkspaceRestriction('tt_content');
92 
93  $rowCount = $queryBuilder->count('uid')
94  ->from('tt_content')
95  ->where(
96  $queryBuilder->expr()->eq(
97  'sys_language_uid',
98  $queryBuilder->createNamedParameter($languageId, ‪Connection::PARAM_INT)
99  ),
100  $queryBuilder->expr()->eq(
101  'pid',
102  $queryBuilder->createNamedParameter($pageId, ‪Connection::PARAM_INT)
103  ),
104  $queryBuilder->expr()->neq(
105  'l10n_source',
106  $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT)
107  )
108  )
109  ->executeQuery()
110  ->fetchOne();
111 
112  return (int)$rowCount;
113  }
114 
118  public function ‪fetchAvailableLanguages(int $pageId, int $languageId): array
119  {
120  $queryBuilder = $this->‪getQueryBuilderWithWorkspaceRestriction('tt_content');
121  $queryBuilder->select('sys_language_uid')
122  ->from('tt_content')
123  ->where(
124  $queryBuilder->expr()->eq(
125  'pid',
126  $queryBuilder->createNamedParameter($pageId, ‪Connection::PARAM_INT)
127  ),
128  $queryBuilder->expr()->neq(
129  'sys_language_uid',
130  $queryBuilder->createNamedParameter($languageId, ‪Connection::PARAM_INT)
131  )
132  )
133  ->groupBy('sys_language_uid');
134 
135  $this->‪getAllowedLanguageConstraintsForBackendUser($pageId, $queryBuilder, $this->‪getBackendUser());
136  ‪$languages = $queryBuilder->executeQuery()->fetchAllAssociative();
137  return ‪$languages ?: [];
138  }
139 
144  protected function ‪getAllowedLanguageConstraintsForBackendUser(int $pageId, QueryBuilder $queryBuilder, ‪BackendUserAuthentication $backendUser, string $alias = ''): void
145  {
146  if ($backendUser->‪isAdmin()) {
147  return;
148  }
149  // This always includes default language
150  $allowedLanguages = $this->translationConfigurationProvider->getSystemLanguages($pageId);
151  $queryBuilder->andWhere(
152  $queryBuilder->expr()->in(
153  ($alias === '' ? '' : ($alias . '.')) . 'sys_language_uid',
154  $queryBuilder->createNamedParameter(array_keys($allowedLanguages), ‪Connection::PARAM_INT_ARRAY)
155  )
156  );
157  }
158 
164  public function ‪getRecordsToCopyDatabaseResult(int $pageId, int $destLanguageId, int $languageId, string ‪$fields = '*')
165  {
166  $originalUids = [];
167 
168  // Get original uid of existing elements triggered language
169  $queryBuilder = $this->‪getQueryBuilderWithWorkspaceRestriction('tt_content');
170 
171  $originalUidsStatement = $queryBuilder
172  ->select('l10n_source')
173  ->from('tt_content')
174  ->where(
175  $queryBuilder->expr()->eq(
176  'sys_language_uid',
177  $queryBuilder->createNamedParameter($destLanguageId, ‪Connection::PARAM_INT)
178  ),
179  $queryBuilder->expr()->eq(
180  'pid',
181  $queryBuilder->createNamedParameter($pageId, ‪Connection::PARAM_INT)
182  )
183  )
184  ->executeQuery();
185 
186  while ($origUid = $originalUidsStatement->fetchOne()) {
187  $originalUids[] = (int)$origUid;
188  }
189 
190  $queryBuilder->select(...‪GeneralUtility::trimExplode(',', ‪$fields, true))
191  ->from('tt_content')
192  ->where(
193  $queryBuilder->expr()->eq(
194  'sys_language_uid',
195  $queryBuilder->createNamedParameter($languageId, ‪Connection::PARAM_INT)
196  ),
197  $queryBuilder->expr()->eq(
198  'pid',
199  $queryBuilder->createNamedParameter($pageId, ‪Connection::PARAM_INT)
200  )
201  )
202  ->orderBy('sorting');
203 
204  if (!empty($originalUids)) {
205  $queryBuilder
206  ->andWhere(
207  $queryBuilder->expr()->notIn(
208  'uid',
209  $queryBuilder->createNamedParameter($originalUids, ‪Connection::PARAM_INT_ARRAY)
210  )
211  );
212  }
213 
214  return $queryBuilder->executeQuery();
215  }
216 
217  protected function ‪getBackendUser(): ‪BackendUserAuthentication
218  {
219  return ‪$GLOBALS['BE_USER'];
220  }
221 
226  protected function ‪getQueryBuilderWithWorkspaceRestriction(string $tableName): QueryBuilder
227  {
228  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($tableName);
229  $queryBuilder->getRestrictions()
230  ->removeAll()
231  ->add(GeneralUtility::makeInstance(DeletedRestriction::class))
232  ->add(GeneralUtility::makeInstance(WorkspaceRestriction::class, $this->‪getBackendUser()->workspace));
233 
234  return $queryBuilder;
235  }
236 }
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:52
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository
Definition: LocalizationRepository.php:36
‪$languages
‪$languages
Definition: updateIsoDatabase.php:104
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\getBackendUser
‪getBackendUser()
Definition: LocalizationRepository.php:216
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication\isAdmin
‪bool isAdmin()
Definition: BackendUserAuthentication.php:241
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\getAllowedLanguageConstraintsForBackendUser
‪getAllowedLanguageConstraintsForBackendUser(int $pageId, QueryBuilder $queryBuilder, BackendUserAuthentication $backendUser, string $alias='')
Definition: LocalizationRepository.php:143
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\getLocalizedRecordCount
‪getLocalizedRecordCount(int $pageId, int $languageId)
Definition: LocalizationRepository.php:88
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\__construct
‪__construct(TranslationConfigurationProvider $translationConfigurationProvider=null)
Definition: LocalizationRepository.php:41
‪$fields
‪$fields
Definition: pages.php:5
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\fetchOriginLanguage
‪fetchOriginLanguage(int $pageId, int $localizedLanguage)
Definition: LocalizationRepository.php:49
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\fetchAvailableLanguages
‪fetchAvailableLanguages(int $pageId, int $languageId)
Definition: LocalizationRepository.php:117
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:62
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:41
‪TYPO3\CMS\Backend\Domain\Repository\Localization
Definition: LocalizationRepository.php:18
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\getQueryBuilderWithWorkspaceRestriction
‪getQueryBuilderWithWorkspaceRestriction(string $tableName)
Definition: LocalizationRepository.php:225
‪TYPO3\CMS\Backend\Configuration\TranslationConfigurationProvider
Definition: TranslationConfigurationProvider.php:39
‪$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:163
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT_ARRAY
‪const PARAM_INT_ARRAY
Definition: Connection.php:72
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static list< string > trimExplode(string $delim, string $string, bool $removeEmptyValues=false, int $limit=0)
Definition: GeneralUtility.php:822
‪TYPO3\CMS\Backend\Domain\Repository\Localization\LocalizationRepository\$translationConfigurationProvider
‪TranslationConfigurationProvider $translationConfigurationProvider
Definition: LocalizationRepository.php:39
‪TYPO3\CMS\Core\Database\Query\Restriction\WorkspaceRestriction
Definition: WorkspaceRestriction.php:39