‪TYPO3CMS  ‪main
TranslationStatusController.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\ResponseInterface;
21 use Psr\Http\Message\ServerRequestInterface;
25 use TYPO3\CMS\Backend\Utility\BackendUtility;
30 use TYPO3\CMS\Core\Imaging\IconSize;
36 
41 #[AsController]
43 {
47  protected array ‪$siteLanguages = [];
48  protected int ‪$currentDepth = 0;
49  protected int ‪$currentLanguageId = 0;
50 
51  public function ‪handleRequest(ServerRequestInterface $request): ResponseInterface
52  {
53  $this->‪init($request);
54  $this->‪initializeSiteLanguages($request);
55  $backendUser = $this->‪getBackendUser();
56  $moduleData = $request->getAttribute('moduleData');
57  $allowedModuleOptions = $this->‪getAllowedModuleOptions();
58  if ($moduleData->cleanUp($allowedModuleOptions)) {
59  $backendUser->pushModuleData($moduleData->getModuleIdentifier(), $moduleData->toArray());
60  }
61  $this->currentDepth = (int)$moduleData->get('depth');
62  $this->currentLanguageId = (int)$moduleData->get('lang');
63 
64  if ($this->id) {
65  $tree = $this->‪getTree();
66  $content = $this->‪renderL10nTable($tree, $request);
67  $this->view->assignMultiple([
68  'pageUid' => $this->id,
69  'depthDropdownOptions' => $allowedModuleOptions['depth'],
70  'depthDropdownCurrentValue' => $this->currentDepth,
71  'displayLangDropdown' => !empty($allowedModuleOptions['lang']),
72  'langDropdownOptions' => $allowedModuleOptions['lang'],
73  'langDropdownCurrentValue' => $this->currentLanguageId,
74  'content' => $content,
75  ]);
76  }
77  return $this->view->renderResponse('TranslationStatus');
78  }
79 
80  protected function ‪getTree(): ‪PageTreeView
81  {
82  // Initialize starting point of page tree
83  $treeStartingPoint = ‪$this->id;
84  $treeStartingRecord = BackendUtility::getRecordWSOL('pages', $treeStartingPoint);
85  $tree = GeneralUtility::makeInstance(PageTreeView::class);
86  $tree->init('AND ' . $this->‪getBackendUser()->getPagePermsClause(‪Permission::PAGE_SHOW));
87  $tree->addField('l18n_cfg');
88  $tree->tree[] = [
89  'row' => $treeStartingRecord,
90  ];
91  // Create the tree from starting point
92  if ($this->currentDepth) {
93  $tree->getTree($treeStartingPoint, $this->currentDepth);
94  }
95  return $tree;
96  }
97 
98  protected function ‪getAllowedModuleOptions(): array
99  {
100  $lang = $this->‪getLanguageService();
101  $menuArray = [
102  'depth' => [
103  0 => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_0'),
104  1 => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_1'),
105  2 => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_2'),
106  3 => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_3'),
107  4 => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_4'),
108  999 => $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_infi'),
109  ],
110  ];
111  // Languages:
112  $menuArray['lang'] = [];
113  foreach ($this->siteLanguages as $language) {
114  if ($language->getLanguageId() === 0) {
115  $menuArray['lang'][0] = $lang->sL('LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.allLanguages');
116  } else {
117  $menuArray['lang'][$language->getLanguageId()] = $language->getTitle();
118  }
119  }
120  return $menuArray;
121  }
122 
129  protected function ‪renderL10nTable(‪PageTreeView $tree, ServerRequestInterface $request): string
130  {
131  $lang = $this->‪getLanguageService();
132  $backendUser = $this->‪getBackendUser();
133  // Title length:
134  $titleLen = (int)$backendUser->uc['titleLen'];
135  // Put together the TREE:
136  ‪$output = '';
137  $langRecUids = [];
138 
139  $userTsConfig = $backendUser->getTSConfig();
140  $showPageId = !empty($userTsConfig['options.']['pageTree.']['showPageIdWithTitle']);
141 
142  $pageModule = 'web_layout';
143  $pageModuleAccess = $this->moduleProvider->accessGranted($pageModule, $backendUser);
144 
145  foreach ($tree->tree as $data) {
146  $tCells = [];
147  $langRecUids[0][] = $data['row']['uid'];
148  $pageTitle = ($showPageId ? '[' . (int)$data['row']['uid'] . '] ' : '') . ‪GeneralUtility::fixed_lgd_cs($data['row']['title'], $titleLen);
149  // Page icons / titles etc.
150  if ($pageModuleAccess) {
151  $pageModuleLink = (string)$this->uriBuilder->buildUriFromRoute($pageModule, ['id' => $data['row']['uid'], 'SET' => ['language' => 0]]);
152  $pageModuleLink = '<a href="' . htmlspecialchars($pageModuleLink) . '" title="' . $lang->sL('LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_editPage') . '">' . htmlspecialchars($pageTitle) . '</a>';
153  } else {
154  $pageModuleLink = htmlspecialchars($pageTitle);
155  }
156  $icon = '<span title="' . BackendUtility::getRecordIconAltText($data['row'], 'pages') . '">' . $this->iconFactory->getIconForRecord('pages', $data['row'], IconSize::SMALL)->render() . '</span>';
157  if ($this->‪getBackendUser()->recordEditAccessInternals('pages', $data['row'])) {
158  $icon = BackendUtility::wrapClickMenuOnIcon($icon, 'pages', $data['row']['uid']);
159  }
160 
161  $tCells[] = '<td' . (!empty($data['row']['_CSSCLASS']) ? ' class="' . $data['row']['_CSSCLASS'] . '"' : '') . '>' .
162  (!empty($data['depthData']) ? $data['depthData'] : '') .
163  ($data['HTML'] ?? '') .
164  $icon .
165  $pageModuleLink .
166  ((string)$data['row']['nav_title'] !== '' ? ' [Nav: <em>' . htmlspecialchars(‪GeneralUtility::fixed_lgd_cs($data['row']['nav_title'], $titleLen)) . '</em>]' : '') .
167  '</td>';
168  $previewUriBuilder = ‪PreviewUriBuilder::create((int)$data['row']['uid']);
169  // DEFAULT language:
170  $pageTranslationVisibility = new ‪PageTranslationVisibility((int)($data['row']['l18n_cfg'] ?? 0));
171  $status = $pageTranslationVisibility->shouldBeHiddenInDefaultLanguage() ? 'danger' : 'success';
172  // Create links:
173  $editUrl = (string)$this->uriBuilder->buildUriFromRoute('record_edit', [
174  'edit' => [
175  'pages' => [
176  $data['row']['uid'] => 'edit',
177  ],
178  ],
179  'returnUrl' => $request->getAttribute('normalizedParams')->getRequestUri(),
180  ]);
181  $info = '<button ' . ($previewUriBuilder->serializeDispatcherAttributes() ?? 'disabled="true"')
182  . ' class="btn btn-default" title="' . $lang->sL('LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_viewPage') . '">' .
183  $this->iconFactory->getIcon('actions-view-page', IconSize::SMALL)->render() . '</button>';
184  if ($backendUser->check('tables_modify', 'pages')) {
185  $info .= '<a href="' . htmlspecialchars($editUrl)
186  . '" class="btn btn-default" title="' . $lang->sL(
187  'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_editDefaultLanguagePage'
188  ) . '">' . $this->iconFactory->getIcon('actions-page-open', IconSize::SMALL)->render() . '</a>';
189  }
190  $info .= '&nbsp;';
191  $info .= $pageTranslationVisibility->shouldBeHiddenInDefaultLanguage() ? '<span title="' . htmlspecialchars($lang->sL('LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.l18n_cfg.I.1')) . '">D</span>' : '&nbsp;';
192  $info .= $pageTranslationVisibility->shouldHideTranslationIfNoTranslatedRecordExists() ? '<span title="' . htmlspecialchars($lang->sL('LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.l18n_cfg.I.2')) . '">N</span>' : '&nbsp;';
193  // Put into cell:
194  $tCells[] = '<td class="' . $status . ' col-border-left"><div class="btn-group">' . $info . '</div></td>';
195  $tCells[] = '<td class="' . $status . '" title="' . $lang->sL(
196  'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_CEcount'
197  ) . '" align="center">' . ($this->‪getContentElementCount((int)$data['row']['uid'], 0) ?: '-') . '</td>';
198  // Traverse system languages:
199  foreach ($this->siteLanguages as $siteLanguage) {
200  $languageId = $siteLanguage->getLanguageId();
201  if ($languageId === 0) {
202  continue;
203  }
204  if ($this->currentLanguageId === 0 || $this->currentLanguageId === $languageId) {
205  $row = $this->‪getLangStatus((int)$data['row']['uid'], $languageId);
206  if ($pageTranslationVisibility->shouldBeHiddenInDefaultLanguage() || $pageTranslationVisibility->shouldHideTranslationIfNoTranslatedRecordExists()) {
207  $status = 'danger';
208  } else {
209  $status = '';
210  }
211  if (is_array($row)) {
212  $langRecUids[$languageId][] = $row['uid'];
213  if (!$row['_HIDDEN']) {
214  $status = 'success';
215  }
216  $info = ($showPageId ? ' [' . (int)$row['uid'] . ']' : '') . ' ' . htmlspecialchars(
217  ‪GeneralUtility::fixed_lgd_cs($row['title'], $titleLen)
218  ) . ((string)$row['nav_title'] !== '' ? ' [Nav: <em>' . htmlspecialchars(
219  ‪GeneralUtility::fixed_lgd_cs($row['nav_title'], $titleLen)
220  ) . '</em>]' : '') . ($row['_COUNT'] > 1 ? '<div>' . $lang->sL(
221  'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_badThingThereAre'
222  ) . '</div>' : '');
223 
224  if ($pageModuleAccess) {
225  $pageModuleLink = (string)$this->uriBuilder->buildUriFromRoute($pageModule, ['id' => $data['row']['uid'], 'SET' => ['language' => $languageId]]);
226  $pageModuleLink = '<a href="' . htmlspecialchars($pageModuleLink) . '" title="' . $lang->sL('LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_editPageLang') . '">' . $info . '</a>';
227  } else {
228  $pageModuleLink = $info;
229  }
230  $icon = $this->iconFactory->getIconForRecord('pages', $row, IconSize::SMALL);
231  $iconMarkup = '<span title="' . BackendUtility::getRecordIconAltText($row, 'pages') . '">' . $icon->render() . '</span>';
232  $tCells[] = '<td class="' . $status . ' col-border-left">' .
233  BackendUtility::wrapClickMenuOnIcon($iconMarkup, 'pages', (int)$row['uid']) .
234  $pageModuleLink .
235  '</td>';
236  // Edit whole record:
237  // Create links:
238  $editUrl = (string)$this->uriBuilder->buildUriFromRoute('record_edit', [
239  'edit' => [
240  'pages' => [
241  $row['uid'] => 'edit',
242  ],
243  ],
244  'returnUrl' => $request->getAttribute('normalizedParams')->getRequestUri(),
245  ]);
246  // ViewPageLink
247  $info = '<button ' . ($previewUriBuilder
248  ->withLanguage($languageId)
249  ->serializeDispatcherAttributes() ?? 'disabled="true"')
250  . ' class="btn btn-default" title="' . $lang->sL('LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_viewPage') . '">' .
251  $this->iconFactory->getIcon('actions-view', IconSize::SMALL)->render() . '</button>';
252  $info .= '<a href="' . htmlspecialchars($editUrl)
253  . '" class="btn btn-default" title="' . $lang->sL(
254  'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_editLanguageOverlayRecord'
255  ) . '">' . $this->iconFactory->getIcon('actions-open', IconSize::SMALL)->render() . '</a>';
256  $tCells[] = '<td class="' . $status . '"><div class="btn-group">' . $info . '</div></td>';
257  $tCells[] = '<td class="' . $status . '" title="' . $lang->sL(
258  'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_CEcount'
259  ) . '" align="center">' . ($this->‪getContentElementCount((int)$data['row']['uid'], $languageId) ?: '-') . '</td>';
260  } else {
261  $idName = sprintf('new-overlay-%d-%d', $languageId, $data['row']['uid']);
262  $info = '<div class="form-check form-check-type-icon-toggle">'
263  . '<input type="checkbox" data-lang="' . $languageId . '" data-uid="' . (int)$data['row']['uid'] . '" name="newOL[' . $languageId . '][' . $data['row']['uid'] . ']" id="' . htmlspecialchars($idName) . '" class="form-check-input" value="1" />'
264  . '<label class="form-check-label" for="' . $idName . '">'
265  . '<span class="form-check-label-icon">'
266  . '<span class="form-check-label-icon-checked">' . $this->iconFactory->getIcon('actions-check', IconSize::SMALL)->render() . '</span>'
267  . '<span class="form-check-label-icon-unchecked">' . $this->iconFactory->getIcon('empty-empty', IconSize::SMALL)->render() . '</span>'
268  . '</span>'
269  . '</label>'
270  . '</div>';
271  $tCells[] = '<td class="' . $status . ' col-border-left">&nbsp;</td>';
272  $tCells[] = '<td class="' . $status . '">&nbsp;</td>';
273  $tCells[] = '<td class="' . $status . '">' . $info . '</td>';
274  }
275  }
276  }
277  ‪$output .= '
278  <tr>
279  ' . implode('
280  ', $tCells) . '
281  </tr>';
282  }
283  // Put together HEADER:
284  $headerCells = [];
285  $headerCells[] = '<th>' . $lang->sL('LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_page') . '</th>';
286  if ($backendUser->check('tables_modify', 'pages') && is_array($langRecUids[0])) {
287  $editUrl = (string)$this->uriBuilder->buildUriFromRoute('record_edit', [
288  'edit' => [
289  'pages' => [
290  implode(',', $langRecUids[0]) => 'edit',
291  ],
292  ],
293  'columnsOnly' => 'title,nav_title,l18n_cfg,hidden',
294  'returnUrl' => $request->getAttribute('normalizedParams')->getRequestUri(),
295  ]);
296  $editIco = '<a href="' . htmlspecialchars($editUrl)
297  . '" class="btn btn-default" title="' . $lang->sL(
298  'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_editPageProperties'
299  ) . '">' . $this->iconFactory->getIcon('actions-document-open', IconSize::SMALL)->render() . '</a>';
300  } else {
301  $editIco = '';
302  }
303  if (isset($this->siteLanguages[0])) {
304  $defaultLanguageLabel = $this->siteLanguages[0]->getTitle();
305  } else {
306  $defaultLanguageLabel = $lang->sL('LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_default');
307  }
308  $headerCells[] = '<th class="col-border-left" colspan="2">' . htmlspecialchars($defaultLanguageLabel) . '&nbsp;' . $editIco . '</th>';
309  foreach ($this->siteLanguages as $siteLanguage) {
310  $languageId = $siteLanguage->getLanguageId();
311  if ($languageId === 0) {
312  continue;
313  }
314  if ($this->currentLanguageId === 0 || $this->currentLanguageId === $languageId) {
315  // Title:
316  $headerCells[] = '<th class="col-border-left">' . htmlspecialchars($siteLanguage->getTitle()) . '</th>';
317  // Edit language overlay records:
318  if (is_array($langRecUids[$languageId] ?? null)) {
319  $editUrl = (string)$this->uriBuilder->buildUriFromRoute('record_edit', [
320  'edit' => [
321  'pages' => [
322  implode(',', $langRecUids[$languageId]) => 'edit',
323  ],
324  ],
325  'columnsOnly' => 'title,nav_title,hidden',
326  'returnUrl' => $request->getAttribute('normalizedParams')->getRequestUri(),
327  ]);
328  $editButton = '<a href="' . htmlspecialchars($editUrl)
329  . '" class="btn btn-default" title="' . $lang->sL(
330  'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_renderl10n_editLangOverlays'
331  ) . '">' . $this->iconFactory->getIcon('actions-document-open', IconSize::SMALL)->render() . '</a>';
332  } else {
333  $editButton = '';
334  }
335  // Create new overlay records:
336  $createLink = (string)$this->uriBuilder->buildUriFromRoute('tce_db', [
337  'redirect' => $request->getAttribute('normalizedParams')->getRequestUri(),
338  ]);
339  $newButton = '<a href="' . htmlspecialchars($createLink) . '" data-edit-url="' . htmlspecialchars($createLink) . '" class="btn btn-default disabled t3js-language-new" data-lang="' . $languageId . '" title="' . $lang->sL(
340  'LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:lang_getlangsta_createNewTranslationHeaders'
341  ) . '">' . $this->iconFactory->getIcon('actions-document-new', IconSize::SMALL)->render() . '</a>';
342 
343  $headerCells[] = '<th>' . $editButton . '</th>';
344  $headerCells[] = '<th>' . $newButton . '</th>';
345  }
346  }
347 
348  ‪$output =
349  '<div class="table-fit">' .
350  '<table class="table table-striped table-hover" id="langTable">' .
351  '<thead>' .
352  '<tr>' .
353  implode('', $headerCells) .
354  '</tr>' .
355  '</thead>' .
356  '<tbody>' .
357  ‪$output .
358  '</tbody>' .
359  '</table>' .
360  '</div>';
361  return ‪$output;
362  }
363 
371  protected function ‪getLangStatus(int $pageId, int $langId): bool|array
372  {
373  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
374  ->getQueryBuilderForTable('pages');
375  $queryBuilder
376  ->getRestrictions()
377  ->removeAll()
378  ->add(GeneralUtility::makeInstance(WorkspaceRestriction::class, $this->‪getBackendUser()->workspace))
379  ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
380  $result = $queryBuilder
381  ->select('*')
382  ->from('pages')
383  ->where(
384  $queryBuilder->expr()->eq(
385  ‪$GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField'],
386  $queryBuilder->createNamedParameter($pageId, ‪Connection::PARAM_INT)
387  )
388  )
389  ->andWhere(
390  $queryBuilder->expr()->eq(
391  ‪$GLOBALS['TCA']['pages']['ctrl']['languageField'],
392  $queryBuilder->createNamedParameter($langId, ‪Connection::PARAM_INT)
393  )
394  )
395  ->executeQuery();
396 
397  $row = $result->fetchAssociative();
398  BackendUtility::workspaceOL('pages', $row);
399  if (is_array($row)) {
400  $row['_COUNT'] = $queryBuilder->count('uid')->executeQuery()->fetchOne();
401  $row['_HIDDEN'] = $row['hidden'] || (int)$row['endtime'] > 0 && (int)$row['endtime'] < ‪$GLOBALS['EXEC_TIME'] || ‪$GLOBALS['EXEC_TIME'] < (int)$row['starttime'];
402  }
403  $result->free();
404  return $row;
405  }
406 
414  protected function ‪getContentElementCount(int $pageId, int $sysLang): int
415  {
416  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
417  ->getQueryBuilderForTable('tt_content');
418  $queryBuilder->getRestrictions()
419  ->removeAll()
420  ->add(GeneralUtility::makeInstance(DeletedRestriction::class))
421  ->add(GeneralUtility::makeInstance(WorkspaceRestriction::class, $this->‪getBackendUser()->workspace));
422  return (int)$queryBuilder
423  ->count('uid')
424  ->from('tt_content')
425  ->where(
426  $queryBuilder->expr()->eq(
427  'pid',
428  $queryBuilder->createNamedParameter($pageId, ‪Connection::PARAM_INT)
429  )
430  )
431  ->andWhere(
432  $queryBuilder->expr()->eq(
433  'sys_language_uid',
434  $queryBuilder->createNamedParameter($sysLang, ‪Connection::PARAM_INT)
435  )
436  )
437  ->executeQuery()
438  ->fetchOne();
439  }
440 
445  protected function ‪initializeSiteLanguages(ServerRequestInterface $request): void
446  {
448  $currentSite = $request->getAttribute('site');
449  $this->siteLanguages = $currentSite->getAvailableLanguages($this->‪getBackendUser(), false, $this->id);
450  }
451 }
‪TYPO3\CMS\Info\Controller\TranslationStatusController\$currentLanguageId
‪int $currentLanguageId
Definition: TranslationStatusController.php:49
‪TYPO3\CMS\Info\Controller\InfoModuleController
Definition: InfoModuleController.php:49
‪TYPO3\CMS\Core\Site\Entity\SiteInterface
Definition: SiteInterface.php:26
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:52
‪TYPO3\CMS\Core\Utility\GeneralUtility\fixed_lgd_cs
‪static string fixed_lgd_cs(string $string, int $chars, string $appendString='...')
Definition: GeneralUtility.php:92
‪TYPO3\CMS\Info\Controller\TranslationStatusController\$siteLanguages
‪array $siteLanguages
Definition: TranslationStatusController.php:47
‪TYPO3\CMS\Info\Controller\TranslationStatusController\handleRequest
‪handleRequest(ServerRequestInterface $request)
Definition: TranslationStatusController.php:51
‪TYPO3\CMS\Info\Controller\TranslationStatusController
Definition: TranslationStatusController.php:43
‪TYPO3\CMS\Info\Controller\InfoModuleController\getBackendUser
‪getBackendUser()
Definition: InfoModuleController.php:170
‪TYPO3\CMS\Info\Controller\TranslationStatusController\$currentDepth
‪int $currentDepth
Definition: TranslationStatusController.php:48
‪TYPO3\CMS\Info\Controller\InfoModuleController\getLanguageService
‪getLanguageService()
Definition: InfoModuleController.php:165
‪TYPO3\CMS\Core\Type\Bitmask\PageTranslationVisibility
Definition: PageTranslationVisibility.php:30
‪TYPO3\CMS\Info\Controller\TranslationStatusController\renderL10nTable
‪string renderL10nTable(PageTreeView $tree, ServerRequestInterface $request)
Definition: TranslationStatusController.php:129
‪TYPO3\CMS\Backend\Tree\View\PageTreeView
Definition: PageTreeView.php:28
‪TYPO3\CMS\Core\Type\Bitmask\Permission
Definition: Permission.php:26
‪TYPO3\CMS\Info\Controller\InfoModuleController\init
‪init(ServerRequestInterface $request)
Definition: InfoModuleController.php:71
‪TYPO3\CMS\Core\Site\Entity\SiteLanguage
Definition: SiteLanguage.php:27
‪TYPO3\CMS\Info\Controller\TranslationStatusController\getLangStatus
‪array bool getLangStatus(int $pageId, int $langId)
Definition: TranslationStatusController.php:371
‪TYPO3\CMS\Backend\Routing\PreviewUriBuilder\create
‪static static create(int $pageId)
Definition: PreviewUriBuilder.php:65
‪TYPO3\CMS\Core\Type\Bitmask\Permission\PAGE_SHOW
‪const PAGE_SHOW
Definition: Permission.php:35
‪TYPO3\CMS\Info\Controller\TranslationStatusController\getContentElementCount
‪int getContentElementCount(int $pageId, int $sysLang)
Definition: TranslationStatusController.php:414
‪TYPO3\CMS\Info\Controller\TranslationStatusController\getTree
‪getTree()
Definition: TranslationStatusController.php:80
‪TYPO3\CMS\Info\Controller\InfoModuleController\$id
‪int $id
Definition: InfoModuleController.php:57
‪$output
‪$output
Definition: annotationChecker.php:114
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:41
‪$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\Routing\PreviewUriBuilder
Definition: PreviewUriBuilder.php:44
‪TYPO3\CMS\Info\Controller\TranslationStatusController\getAllowedModuleOptions
‪getAllowedModuleOptions()
Definition: TranslationStatusController.php:98
‪TYPO3\CMS\Backend\Attribute\AsController
Definition: AsController.php:25
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Info\Controller\TranslationStatusController\initializeSiteLanguages
‪initializeSiteLanguages(ServerRequestInterface $request)
Definition: TranslationStatusController.php:445
‪TYPO3\CMS\Info\Controller
‪TYPO3\CMS\Core\Database\Query\Restriction\WorkspaceRestriction
Definition: WorkspaceRestriction.php:39