‪TYPO3CMS  ‪main
PageInformationController.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;
32 use TYPO3\CMS\Core\Imaging\IconSize;
35 
40 #[AsController]
42 {
44  protected array ‪$fieldConfiguration = [];
45  protected array ‪$fieldArray = [];
46 
50  protected array ‪$addElement_tdCssClass = [];
51 
52  public function ‪handleRequest(ServerRequestInterface $request): ResponseInterface
53  {
54  $this->‪init($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  $depth = (int)($moduleData->get('depth') ?? 0);
62  $pages = (string)($moduleData->get('pages') ?? '0');
63 
64  if (isset($this->fieldConfiguration[$pages])) {
65  $this->‪fieldArray = $this->fieldConfiguration[$pages]['fields'];
66  }
67 
68  if ($this->id) {
69  $this->view->assignMultiple([
70  'pageUid' => $this->id,
71  'depthDropdownOptions' => $allowedModuleOptions['depth'],
72  'depthDropdownCurrentValue' => $depth,
73  'pagesDropdownOptions' => $allowedModuleOptions['pages'],
74  'pagesDropdownCurrentValue' => $pages,
75  'content' => $this->‪getTable_pages($this->id, $depth, $request),
76  ]);
77  }
78  return $this->view->renderResponse('PageInformation');
79  }
80 
81  protected function ‪getAllowedModuleOptions(): array
82  {
83  $menu = [
84  'pages' => [],
85  'depth' => [
86  0 => $this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_0'),
87  1 => $this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_1'),
88  2 => $this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_2'),
89  3 => $this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_3'),
90  4 => $this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_4'),
91  999 => $this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.depth_infi'),
92  ],
93  ];
94 
95  $this->‪fillFieldConfiguration($this->id);
96  foreach ($this->fieldConfiguration as $key => $item) {
97  $menu['pages'][$key] = $item['label'];
98  }
99  return $menu;
100  }
101 
107  protected function ‪cleanTableNames(): string
108  {
109  // Get all table names:
110  $tableNames = array_flip(array_keys(‪$GLOBALS['TCA']));
111  // Unset common names:
112  unset(
113  $tableNames['pages'],
114  $tableNames['sys_filemounts'],
115  $tableNames['be_users'],
116  $tableNames['be_groups']
117  );
118  $allowedTableNames = [];
119  // Traverse table names and set them in allowedTableNames array IF they can be read-accessed by the user.
120  foreach (array_keys($tableNames) as $tableName) {
121  if (!(‪$GLOBALS['TCA'][$tableName]['ctrl']['hideTable'] ?? false) && $this->‪getBackendUser()->check('tables_select', $tableName)) {
122  $allowedTableNames[$tableName] = 'table_' . $tableName;
123  }
124  }
125  return implode(',', $allowedTableNames);
126  }
127 
131  protected function ‪fillFieldConfiguration(int $pageId): void
132  {
133  $modTSconfig = BackendUtility::getPagesTSconfig($pageId)['mod.']['web_info.']['fieldDefinitions.'] ?? [];
134  foreach ($modTSconfig as $key => $item) {
135  $fieldList = str_replace('###ALL_TABLES###', $this->‪cleanTableNames(), $item['fields']);
136  ‪$fields = ‪GeneralUtility::trimExplode(',', $fieldList, true);
137  $key = trim($key, '.');
138  $this->fieldConfiguration[$key] = [
139  'label' => $item['label'] ? $this->‪getLanguageService()->sL($item['label']) : $key,
140  'fields' => ‪$fields,
141  ];
142  }
143  }
144 
151  protected function ‪getTable_pages(int ‪$id, int $depth, ServerRequestInterface $request): string
152  {
153  $out = '';
154  $lang = $this->‪getLanguageService();
155  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
156  ->getQueryBuilderForTable('pages');
157  $queryBuilder->getRestrictions()
158  ->removeAll()
159  ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
160  $row = $queryBuilder
161  ->select('*')
162  ->from('pages')
163  ->where(
164  $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter(‪$id, ‪Connection::PARAM_INT)),
165  $this->getBackendUser()->getPagePermsClause(‪Permission::PAGE_SHOW)
166  )
167  ->executeQuery()
168  ->fetchAssociative();
169  BackendUtility::workspaceOL('pages', $row);
170  // If there was found a page:
171  if (is_array($row)) {
172  // Creating elements
173  $editUids = [];
174  // Getting children
175  $theRows = $this->‪getPageRecordsRecursive($row['uid'], $depth);
176  if ($this->‪getBackendUser()->doesUserHaveAccess($row, ‪Permission::PAGE_EDIT) && $row['uid'] > 0) {
177  $editUids[] = $row['uid'];
178  }
179  $out .= $this->‪pages_drawItem($row, $request);
180  // Traverse all pages selected:
181  foreach ($theRows as $sRow) {
182  if ($this->‪getBackendUser()->doesUserHaveAccess($sRow, ‪Permission::PAGE_EDIT)) {
183  $editUids[] = $sRow['uid'];
184  }
185  $out .= $this->‪pages_drawItem($sRow, $request);
186  }
187  // Header line is drawn
188  $headerCells = [];
189  $editIdList = implode(',', $editUids);
190  // Traverse fields (as set above) in order to create header values:
191  foreach ($this->‪fieldArray as $field) {
192  $editButton = '';
193  if (
194  $editIdList
195  && isset(‪$GLOBALS['TCA']['pages']['columns'][$field]) && $field !== 'uid'
196  && $this->‪getBackendUser()->check('tables_modify', 'pages')
197  && $this->‪getBackendUser()->check('non_exclude_fields', 'pages:' . $field)
198  ) {
199  $iTitle = sprintf(
200  $lang->sL('LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:editThisColumn'),
201  rtrim(trim($lang->sL(BackendUtility::getItemLabel('pages', $field))), ':')
202  );
203  $urlParameters = [
204  'edit' => [
205  'pages' => [
206  $editIdList => 'edit',
207  ],
208  ],
209  'columnsOnly' => $field,
210  'returnUrl' => $request->getAttribute('normalizedParams')->getRequestUri(),
211  ];
212  ‪$url = (string)$this->uriBuilder->buildUriFromRoute('record_edit', $urlParameters);
213  $editButton = '<a class="btn btn-default" href="' . htmlspecialchars(‪$url)
214  . '" title="' . htmlspecialchars($iTitle) . '">'
215  . $this->iconFactory->getIcon('actions-document-open', IconSize::SMALL)->render() . '</a>';
216  }
217  switch ($field) {
218  case 'title':
219  $headerCells[$field] = $editButton . '&nbsp;<strong>'
220  . $lang->sL(‪$GLOBALS['TCA']['pages']['columns'][$field]['label'])
221  . '</strong>';
222  break;
223  case 'uid':
224  $headerCells[$field] = '';
225  break;
226  case 'actual_backend_layout':
227  $headerCells[$field] = htmlspecialchars($lang->sL('LLL:EXT:info/Resources/Private/Language/locallang_webinfo.xlf:actual_backend_layout'));
228  break;
229  default:
230  if (str_starts_with($field, 'table_')) {
231  $f2 = substr($field, 6);
232  if (‪$GLOBALS['TCA'][$f2]) {
233  $headerCells[$field] = '&nbsp;' .
234  '<span title="' .
235  htmlspecialchars($lang->sL(‪$GLOBALS['TCA'][$f2]['ctrl']['title'])) .
236  '">' .
237  $this->iconFactory->getIconForRecord($f2, [], IconSize::SMALL)->render() .
238  '</span>';
239  }
240  } else {
241  $headerCells[$field] = $editButton . '&nbsp;<strong>'
242  . htmlspecialchars($lang->sL(‪$GLOBALS['TCA']['pages']['columns'][$field]['label']))
243  . '</strong>';
244  }
245  }
246  }
247  $out = '
248  <div class="table-fit">
249  <table class="table table-striped table-hover" id="PageInformationControllerTable">
250  <thead>
251  ' . $this->‪addElement($headerCells) . '
252  </thead>
253  <tbody>
254  ' . $out . '
255  </tbody>
256  </table>
257  </div>';
258  }
259 
260  return $out;
261  }
262 
272  protected function ‪getPageRecordsRecursive(int $pid, int $depth, string $iconPrefix = '', array $rows = []): array
273  {
274  $depth--;
275  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');
276  $queryBuilder->getRestrictions()
277  ->removeAll()
278  ->add(GeneralUtility::makeInstance(DeletedRestriction::class))
279  ->add(GeneralUtility::makeInstance(WorkspaceRestriction::class, $this->‪getBackendUser()->workspace));
280 
281  $queryBuilder
282  ->select('*')
283  ->from('pages')
284  ->where(
285  $queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($pid, ‪Connection::PARAM_INT)),
286  $queryBuilder->expr()->eq('sys_language_uid', $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT)),
287  $this->getBackendUser()->getPagePermsClause(‪Permission::PAGE_SHOW)
288  );
289 
290  if (!empty(‪$GLOBALS['TCA']['pages']['ctrl']['sortby'])) {
291  $queryBuilder->orderBy(‪$GLOBALS['TCA']['pages']['ctrl']['sortby']);
292  }
293 
294  if ($depth >= 0) {
295  $result = $queryBuilder->executeQuery();
296  $rowCount = $queryBuilder->count('uid')->executeQuery()->fetchOne();
297  $count = 0;
298  while ($row = $result->fetchAssociative()) {
299  BackendUtility::workspaceOL('pages', $row);
300  if (is_array($row)) {
301  $count++;
302  $row['treeIcons'] = $iconPrefix
303  . '<span class="treeline-icon treeline-icon-join'
304  . ($rowCount === $count ? 'bottom' : '')
305  . '"></span>';
306  $rows[] = $row;
307  // Get the branch
308  $spaceOutIcons = '<span class="treeline-icon treeline-icon-'
309  . ($rowCount === $count ? 'clear' : 'line')
310  . '"></span>';
311  $rows = $this->‪getPageRecordsRecursive(
312  $row['uid'],
313  $row['php_tree_stop'] ? 0 : $depth,
314  $iconPrefix . $spaceOutIcons,
315  $rows
316  );
317  }
318  }
319  }
320 
321  return $rows;
322  }
323 
327  protected function ‪pages_drawItem(array $row, ServerRequestInterface $request): string
328  {
329  $this->backendLayoutView = GeneralUtility::makeInstance(BackendLayoutView::class);
330  $backendLayouts = $this->‪getBackendLayouts($row, 'backend_layout');
331  $backendLayoutsNextLevel = $this->‪getBackendLayouts($row, 'backend_layout_next_level');
332  $userTsConfig = $this->‪getBackendUser()->getTSConfig();
333  $theIcon = $this->‪getIcon($row);
334  // Preparing and getting the data-array
335  $theData = [];
336  foreach ($this->‪fieldArray as $field) {
337  switch ($field) {
338  case 'title':
339  $showPageId = !empty($userTsConfig['options.']['pageTree.']['showPageIdWithTitle']);
340  $pTitle = htmlspecialchars((string)BackendUtility::getProcessedValue('pages', $field, $row[$field], 20));
341  $theData[$field] = ($row['treeIcons'] ?? '') . $theIcon . ($showPageId ? '[' . $row['uid'] . '] ' : '') . $pTitle;
342  break;
343  case 'php_tree_stop':
344  // Intended fall through
345  case 'TSconfig':
346  $theData[$field] = $row[$field] ? '<strong>x</strong>' : '&nbsp;';
347  break;
348  case 'actual_backend_layout':
349  $backendLayout = $this->backendLayoutView->getBackendLayoutForPage((int)$row['uid']);
350  $theData[$field] = $backendLayout !== null
351  ? htmlspecialchars($this->‪getLanguageService()->sL($backendLayout->getTitle()))
352  : '';
353  break;
354  case 'backend_layout':
355  $layoutValue = $backendLayouts[$row[$field]] ?? null;
356  $theData[$field] = $this->‪resolveBackendLayoutValue($layoutValue, $field, $row);
357  break;
358  case 'backend_layout_next_level':
359  $layoutValue = $backendLayoutsNextLevel[$row[$field]] ?? null;
360  $theData[$field] = $this->‪resolveBackendLayoutValue($layoutValue, $field, $row);
361  break;
362  case 'uid':
363  ‪$uid = 0;
364  $editButton = '';
365  if ($this->‪getBackendUser()->doesUserHaveAccess($row, 2) && $row['uid'] > 0) {
366  ‪$uid = (int)$row['uid'];
367  $urlParameters = [
368  'edit' => [
369  'pages' => [
370  $row['uid'] => 'edit',
371  ],
372  ],
373  'returnUrl' => $request->getAttribute('normalizedParams')->getRequestUri(),
374  ];
375  ‪$url = (string)$this->uriBuilder->buildUriFromRoute('record_edit', $urlParameters);
376  $attributes = ‪PreviewUriBuilder::create((int)$row['uid'])
377  ->withRootLine(BackendUtility::BEgetRootLine($row['uid']))
378  ->serializeDispatcherAttributes();
379  $editButton =
380  '<button ' . ($attributes ?? 'disabled="true"') . ' class="btn btn-default" title="' .
381  htmlspecialchars($this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.showPage')) . '">' .
382  $this->iconFactory->getIcon('actions-view-page', IconSize::SMALL)->render() .
383  '</button>';
384 
385  if ($this->‪getBackendUser()->check('tables_modify', 'pages')) {
386  $editButton .=
387  '<a class="btn btn-default" href="' . htmlspecialchars(‪$url) . '" title="' .
388  htmlspecialchars($this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:editDefaultLanguagePage')) . '">' .
389  $this->iconFactory->getIcon('actions-page-open', IconSize::SMALL)->render() .
390  '</a>';
391  }
392  }
393  // Since the uid is overwritten with the edit button markup we need to store
394  // the actual uid to be able to add it as data attribute to the table data cell.
395  // This also makes distinction between record rows and the header line simpler.
396  $theData['_UID_'] = ‪$uid;
397  $theData[$field] = '<div class="btn-group" role="group">' . $editButton . '</div>';
398  break;
399  case 'shortcut':
400  case 'shortcut_mode':
401  if ((int)$row['doktype'] === ‪PageRepository::DOKTYPE_SHORTCUT) {
402  $theData[$field] = $this->‪getPagesTableFieldValue($field, $row);
403  }
404  break;
405  default:
406  if (str_starts_with($field, 'table_')) {
407  $f2 = substr($field, 6);
408  if (‪$GLOBALS['TCA'][$f2]) {
409  $c = $this->‪numberOfRecords($f2, (int)$row['uid']);
410  $theData[$field] = ($c ?: '');
411  }
412  } else {
413  $theData[$field] = $this->‪getPagesTableFieldValue($field, $row);
414  }
415  }
416  }
417  $this->addElement_tdCssClass['title'] = $row['_CSSCLASS'] ?? '';
418  return $this->‪addElement($theData);
419  }
420 
424  protected function ‪getIcon(array $row): string
425  {
426  // Initialization
427  $icon = '<span title="' . BackendUtility::getRecordIconAltText($row, 'pages') . '">' . $this->iconFactory->getIconForRecord('pages', $row, IconSize::SMALL)->render() . '</span>';
428  // The icon with link
429  if ($this->‪getBackendUser()->recordEditAccessInternals('pages', $row)) {
430  $icon = BackendUtility::wrapClickMenuOnIcon($icon, 'pages', $row['uid']);
431  }
432  return $icon;
433  }
442  protected function ‪getPagesTableFieldValue(string $field, array $row): string
443  {
444  return htmlspecialchars((string)BackendUtility::getProcessedValue('pages', $field, $row[$field]));
445  }
446 
450  protected function ‪numberOfRecords(string $table, int $pid): int
451  {
452  if (!isset(‪$GLOBALS['TCA'][$table])) {
453  return 0;
454  }
455 
456  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table);
457  $queryBuilder->getRestrictions()
458  ->removeAll()
459  ->add(GeneralUtility::makeInstance(DeletedRestriction::class))
460  ->add(GeneralUtility::makeInstance(WorkspaceRestriction::class, $this->‪getBackendUser()->workspace));
461 
462  return (int)$queryBuilder->count('uid')
463  ->from($table)
464  ->where(
465  $queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($pid, ‪Connection::PARAM_INT))
466  )
467  ->executeQuery()
468  ->fetchOne();
469  }
470 
478  protected function ‪addElement(array $data): string
479  {
480  // Start up:
481  $attributes = '';
482  $rowTag = 'th';
483  if (isset($data['_UID_'])) {
484  $l10nParent = isset($data['_l10nparent_']) ? (int)$data['_l10nparent_'] : 0;
485  $attributes = ' data-uid="' . $data['_UID_'] . '" data-l10nparent="' . $l10nParent . '"';
486  $rowTag = 'td';
487  }
488  $out = '<tr' . $attributes . '>';
489  // Init rendering.
490  $colsp = '';
491  $lastKey = '';
492  $c = 0;
493  // __label is used as the label key to circumvent problems with uid used as label (see #67756)
494  // as it was introduced later on, check if it really exists before using it
496  if (array_key_exists('__label', $data)) {
497  ‪$fields[0] = '__label';
498  }
499  // Traverse field array which contains the data to present:
500  foreach (‪$fields as $vKey) {
501  if (isset($data[$vKey])) {
502  if ($lastKey) {
503  $cssClass = $this->addElement_tdCssClass[$lastKey] ?? '';
504  $out .= '
505  <' . $rowTag . ' class="' . $cssClass . ' nowrap"' . $colsp . '>' . $data[$lastKey] . '</' . $rowTag . '>';
506  }
507  $lastKey = $vKey;
508  $c = 1;
509  } else {
510  if (!$lastKey) {
511  $lastKey = $vKey;
512  }
513  $c++;
514  }
515  if ($c > 1) {
516  $colsp = ' colspan="' . $c . '"';
517  } else {
518  $colsp = '';
519  }
520  }
521  if ($lastKey) {
522  $cssClass = $this->addElement_tdCssClass[$lastKey] ?? '';
523  $out .= '
524  <' . $rowTag . ' class="' . $cssClass . ' nowrap"' . $colsp . '>' . $data[$lastKey] . '</' . $rowTag . '>';
525  }
526  $out .= '</tr>';
527  return $out;
528  }
529 
530  protected function ‪getBackendLayouts(array $row, string $field): array
531  {
532  if ($this->backendLayoutView === null) {
533  $this->backendLayoutView = GeneralUtility::makeInstance(BackendLayoutView::class);
534  }
535  $configuration = ['row' => $row, 'table' => 'pages', 'field' => $field, 'items' => []];
536  // Below we call the itemsProcFunc to retrieve properly resolved backend layout items,
537  // including the translated labels and the correct field values (backend layout identifiers).
538  $this->backendLayoutView->addBackendLayoutItems($configuration);
539  $backendLayouts = [];
540  foreach ($configuration['items'] ?? [] as $backendLayout) {
541  if (($backendLayout['label'] ?? false) && ($backendLayout['value'] ?? false)) {
542  $backendLayouts[$backendLayout['value']] = $backendLayout['label'];
543  }
544  }
545  return $backendLayouts;
546  }
547 
548  protected function ‪resolveBackendLayoutValue(?string $layoutValue, string $field, array $row): string
549  {
550  if ($layoutValue !== null) {
551  // Directly return the resolved layout value from BackendLayoutView
552  return htmlspecialchars($layoutValue);
553  }
554 
555  // Fetch field value from database (this is already htmlspecialchared')
556  $layoutValue = $this->‪getPagesTableFieldValue($field, $row);
557  if ($layoutValue !== '') {
558  // In case getPagesTableFieldValue returns a non-empty string, the database field
559  // is filled with an invalid value (the backend layout does not longer exists).
560  $layoutValue = sprintf(
561  $this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.noMatchingValue'),
562  $this->‪getPagesTableFieldValue($field, $row)
563  );
564  }
565 
566  return $layoutValue;
567  }
568 }
‪TYPO3\CMS\Info\Controller\InfoModuleController
Definition: InfoModuleController.php:49
‪TYPO3\CMS\Info\Controller\PageInformationController\getTable_pages
‪string getTable_pages(int $id, int $depth, ServerRequestInterface $request)
Definition: PageInformationController.php:151
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:52
‪TYPO3\CMS\Info\Controller\PageInformationController\$fieldConfiguration
‪array $fieldConfiguration
Definition: PageInformationController.php:44
‪TYPO3\CMS\Info\Controller\PageInformationController\$addElement_tdCssClass
‪array $addElement_tdCssClass
Definition: PageInformationController.php:50
‪TYPO3\CMS\Info\Controller\PageInformationController\$backendLayoutView
‪BackendLayoutView $backendLayoutView
Definition: PageInformationController.php:43
‪TYPO3\CMS\Info\Controller\PageInformationController\fillFieldConfiguration
‪fillFieldConfiguration(int $pageId)
Definition: PageInformationController.php:131
‪TYPO3\CMS\Info\Controller\InfoModuleController\getBackendUser
‪getBackendUser()
Definition: InfoModuleController.php:170
‪TYPO3\CMS\Core\Domain\Repository\PageRepository\DOKTYPE_SHORTCUT
‪const DOKTYPE_SHORTCUT
Definition: PageRepository.php:100
‪TYPO3\CMS\Info\Controller\InfoModuleController\getLanguageService
‪getLanguageService()
Definition: InfoModuleController.php:165
‪$fields
‪$fields
Definition: pages.php:5
‪TYPO3\CMS\Filelist\Type\fieldArray
‪@ fieldArray
Definition: Mode.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\Info\Controller\PageInformationController\getPagesTableFieldValue
‪string getPagesTableFieldValue(string $field, array $row)
Definition: PageInformationController.php:442
‪TYPO3\CMS\Backend\Routing\Exception\RouteNotFoundException
Definition: RouteNotFoundException.php:21
‪TYPO3\CMS\Info\Controller\PageInformationController\getPageRecordsRecursive
‪array getPageRecordsRecursive(int $pid, int $depth, string $iconPrefix='', array $rows=[])
Definition: PageInformationController.php:272
‪TYPO3\CMS\Info\Controller\PageInformationController
Definition: PageInformationController.php:42
‪TYPO3\CMS\Backend\Routing\PreviewUriBuilder\create
‪static static create(int $pageId)
Definition: PreviewUriBuilder.php:65
‪TYPO3\CMS\Info\Controller\PageInformationController\$fieldArray
‪array $fieldArray
Definition: PageInformationController.php:45
‪TYPO3\CMS\Info\Controller\PageInformationController\getIcon
‪getIcon(array $row)
Definition: PageInformationController.php:424
‪TYPO3\CMS\Core\Type\Bitmask\Permission\PAGE_SHOW
‪const PAGE_SHOW
Definition: Permission.php:35
‪TYPO3\CMS\Info\Controller\PageInformationController\handleRequest
‪handleRequest(ServerRequestInterface $request)
Definition: PageInformationController.php:52
‪TYPO3\CMS\Info\Controller\PageInformationController\getBackendLayouts
‪getBackendLayouts(array $row, string $field)
Definition: PageInformationController.php:530
‪TYPO3\CMS\Info\Controller\PageInformationController\cleanTableNames
‪cleanTableNames()
Definition: PageInformationController.php:107
‪TYPO3\CMS\Info\Controller\InfoModuleController\$id
‪int $id
Definition: InfoModuleController.php:57
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:41
‪TYPO3\CMS\Webhooks\Message\$url
‪identifier readonly UriInterface $url
Definition: LoginErrorOccurredMessage.php:36
‪TYPO3\CMS\Webhooks\Message\$uid
‪identifier readonly int $uid
Definition: PageModificationMessage.php:35
‪TYPO3\CMS\Backend\View\BackendLayoutView
Definition: BackendLayoutView.php:37
‪TYPO3\CMS\Info\Controller\PageInformationController\pages_drawItem
‪pages_drawItem(array $row, ServerRequestInterface $request)
Definition: PageInformationController.php:327
‪$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\Core\Type\Bitmask\Permission\PAGE_EDIT
‪const PAGE_EDIT
Definition: Permission.php:40
‪TYPO3\CMS\Backend\Attribute\AsController
Definition: AsController.php:25
‪TYPO3\CMS\Info\Controller\PageInformationController\getAllowedModuleOptions
‪getAllowedModuleOptions()
Definition: PageInformationController.php:81
‪TYPO3\CMS\Info\Controller\PageInformationController\resolveBackendLayoutValue
‪resolveBackendLayoutValue(?string $layoutValue, string $field, array $row)
Definition: PageInformationController.php:548
‪TYPO3\CMS\Core\Domain\Repository\PageRepository
Definition: PageRepository.php:69
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Info\Controller\PageInformationController\numberOfRecords
‪numberOfRecords(string $table, int $pid)
Definition: PageInformationController.php:450
‪TYPO3\CMS\Info\Controller\PageInformationController\addElement
‪string addElement(array $data)
Definition: PageInformationController.php:478
‪TYPO3\CMS\Info\Controller
‪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\Core\Database\Query\Restriction\WorkspaceRestriction
Definition: WorkspaceRestriction.php:39