‪TYPO3CMS  10.4
LinkValidatorReport.php
Go to the documentation of this file.
1 <?php
2 
3 /*
4  * This file is part of the TYPO3 CMS project.
5  *
6  * It is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU General Public License, either version 2
8  * of the License, or any later version.
9  *
10  * For the full copyright and license information, please read the
11  * LICENSE.txt file that was distributed with this source code.
12  *
13  * The TYPO3 project - inspiring people to share!
14  */
15 
17 
37 
43 {
49  protected ‪$pageRecord = [];
50 
56  protected ‪$isAccessibleForCurrentUser = false;
57 
63  protected ‪$linkAnalyzer;
64 
70  protected ‪$modTS = [];
71 
77  protected ‪$availableOptions = [];
78 
85  protected ‪$searchLevel = ['report' => 0, 'check' => 0];
86 
94  protected ‪$checkOpt = ['report' => [], 'check' => []];
95 
100  protected ‪$lastEditedRecord = [
101  'uid' => 0,
102  'table' => '',
103  'field' => '',
104  'timestamp' => 0
105  ];
106 
110  protected ‪$hookObjectsArr = [];
111 
115  protected ‪$iconFactory;
116 
120  protected ‪$id;
121 
125  protected ‪$pObj;
126 
130  protected ‪$searchFields = [];
131 
135  protected ‪$brokenLinkRepository;
136 
140  protected ‪$moduleTemplate;
141 
145  protected ‪$view;
146 
147  public function ‪__construct()
148  {
149  $this->brokenLinkRepository = GeneralUtility::makeInstance(BrokenLinkRepository::class);
150  }
151 
157  public function ‪init(‪$pObj)
158  {
159  $this->pObj = ‪$pObj;
160  $this->id = (int)GeneralUtility::_GP('id');
161  $this->brokenLinkRepository = GeneralUtility::makeInstance(BrokenLinkRepository::class);
162  $this->iconFactory = GeneralUtility::makeInstance(IconFactory::class);
163  $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
164  $this->view = $this->‪createView('InfoModule');
165  }
166 
167  protected function ‪createView(string $templateName): ‪StandaloneView
168  {
169  ‪$view = GeneralUtility::makeInstance(StandaloneView::class);
170  ‪$view->‪setLayoutRootPaths(['EXT:linkvalidator/Resources/Private/Layouts']);
171  ‪$view->‪setPartialRootPaths(['EXT:linkvalidator/Resources/Private/Partials']);
172  ‪$view->‪setTemplateRootPaths(['EXT:linkvalidator/Resources/Private/Templates/Backend']);
173  ‪$view->‪setTemplate($templateName);
174  ‪$view->‪assign('pageId', $this->id);
175  return ‪$view;
176  }
177 
181  protected function ‪validateSettings()
182  {
183  $prefix = 'check';
184  $other = 'report';
185  if (empty(GeneralUtility::_GP('updateLinkList'))) {
186  $prefix = 'report';
187  $other = 'check';
188  }
189 
190  // get information for last edited record
191  $this->lastEditedRecord['uid'] = GeneralUtility::_GP('last_edited_record_uid') ?? 0;
192  $this->lastEditedRecord['table'] = GeneralUtility::_GP('last_edited_record_table') ?? '';
193  $this->lastEditedRecord['field'] = GeneralUtility::_GP('last_edited_record_field') ?? '';
194  $this->lastEditedRecord['timestamp'] = GeneralUtility::_GP('last_edited_record_timestamp') ?? 0;
195 
196  // get searchLevel (number of levels of pages to check / show results)
197  $this->searchLevel[$prefix] = GeneralUtility::_GP($prefix . '_search_levels');
198  if (isset($this->searchLevel[$prefix])) {
199  $this->pObj->MOD_SETTINGS[$prefix . '_searchlevel'] = $this->searchLevel[$prefix];
200  } else {
201  $this->searchLevel[$prefix] = $this->pObj->MOD_SETTINGS[$prefix . '_searchlevel'];
202  }
203  if (isset($this->pObj->MOD_SETTINGS[$other . '_searchlevel'])) {
204  $this->searchLevel[$other] = $this->pObj->MOD_SETTINGS[$other . '_searchlevel'];
205  }
206 
207  // which linkTypes to check (internal, file, external, ...)
208  $set = GeneralUtility::_GP($prefix . '_SET');
209 
210  foreach (‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['linkvalidator']['checkLinks'] ?? [] as $linkType => $value) {
211  // Compile list of all available types. Used for checking with button "Check Links".
212  if (strpos($this->modTS['linktypes'], $linkType) !== false) {
213  $this->availableOptions[$linkType] = 1;
214  }
215 
216  // 1) if "$prefix_values" = "1" : use POST variables
217  // 2) if not set, use stored configuration in $this->>pObj->MOD_SETTINGS
218  // 3) if not set, use default
219  unset($this->checkOpt[$prefix][$linkType]);
220  if (!empty(GeneralUtility::_GP($prefix . '_values'))) {
221  if (isset($set[$linkType])) {
222  $this->checkOpt[$prefix][$linkType] = $set[$linkType];
223  } else {
224  $this->checkOpt[$prefix][$linkType] = '0';
225  }
226  $this->pObj->MOD_SETTINGS[$prefix . '_' . $linkType] = $this->checkOpt[$prefix][$linkType];
227  } elseif (isset($this->pObj->MOD_SETTINGS[$prefix . '_' . $linkType])) {
228  $this->checkOpt[$prefix][$linkType] = $this->pObj->MOD_SETTINGS[$prefix . '_' . $linkType];
229  } else {
230  // use default
231  $this->checkOpt[$prefix][$linkType] = '0';
232  $this->pObj->MOD_SETTINGS[$prefix . '_' . $linkType] = $this->checkOpt[$prefix][$linkType];
233  }
234  if (isset($this->pObj->MOD_SETTINGS[$other . '_' . $linkType])) {
235  $this->checkOpt[$other][$linkType] = $this->pObj->MOD_SETTINGS[$other . '_' . $linkType];
236  }
237  }
238 
239  // save settings
240  $this->‪getBackendUser()->‪pushModuleData('web_info', $this->pObj->MOD_SETTINGS);
241  }
247  public function ‪main()
248  {
249  $this->‪getLanguageService()->‪includeLLFile('EXT:linkvalidator/Resources/Private/Language/Module/locallang.xlf');
250  if (isset($this->id)) {
251  $this->modTS = ‪BackendUtility::getPagesTSconfig($this->id)['mod.']['linkvalidator.'] ?? [];
252  }
253  $this->‪validateSettings();
254  $this->‪initialize();
255 
256  if (GeneralUtility::_GP('updateLinkList')) {
257  $this->‪updateBrokenLinks();
258  } elseif ($this->lastEditedRecord['uid']) {
259  if ($this->modTS['actionAfterEditRecord'] === 'recheck') {
260  // recheck broken links for last edited reccord
261  $this->linkAnalyzer->recheckLinks(
262  $this->checkOpt['check'],
263  $this->lastEditedRecord['uid'],
264  $this->lastEditedRecord['table'],
265  $this->lastEditedRecord['field'],
266  (int)$this->lastEditedRecord['timestamp']
267  );
268  } else {
269  // mark broken links for last edited record as needing a recheck
270  $this->brokenLinkRepository->setNeedsRecheckForRecord(
271  (int)$this->lastEditedRecord['uid'],
272  $this->lastEditedRecord['table']
273  );
274  }
275  }
276 
277  $pageTitle = $this->pageRecord ? ‪BackendUtility::getRecordTitle('pages', $this->pageRecord) : '';
278  $this->view->assign('title', $pageTitle);
279  $this->view->assign('content', $this->‪renderContent());
280  return $this->view->render();
281  }
282 
286  protected function ‪renderContent(): string
287  {
288  if (!$this->isAccessibleForCurrentUser) {
289  // If no access or if ID == zero
290  $this->moduleTemplate->addFlashMessage(
291  $this->‪getLanguageService()->getLL('no.access'),
292  $this->‪getLanguageService()->getLL('no.access.title'),
294  );
295  return '';
296  }
297 
298  $groupedBrokenLinkCounts = $this->linkAnalyzer->getLinkCounts();
299 
300  $reportsTabView = $this->‪createViewForBrokenLinksTab($groupedBrokenLinkCounts);
301  $menuItems = [
302  0 => [
303  'label' => $this->‪getLanguageService()->‪getLL('Report'),
304  'content' => $reportsTabView->render()
305  ],
306  ];
307 
308  if ((bool)$this->modTS['showCheckLinkTab']) {
309  $reportsTabView = $this->‪createView('CheckLinksTab');
310  $reportsTabView->assignMultiple([
311  'prefix' => 'check',
312  'selectedLevel' => $this->searchLevel['check'],
313  'options' => $this->‪getCheckOptions($groupedBrokenLinkCounts, 'check'),
314  ]);
315  $menuItems[1] = [
316  'label' => $this->‪getLanguageService()->‪getLL('CheckLink'),
317  'content' => $reportsTabView->render()
318  ];
319  }
320  return $this->moduleTemplate->getDynamicTabMenu($menuItems, 'report-linkvalidator');
321  }
322 
326  protected function ‪initialize()
327  {
328  foreach (‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['linkvalidator']['checkLinks'] ?? [] as $linkType => $className) {
329  $this->hookObjectsArr[$linkType] = GeneralUtility::makeInstance($className);
330  }
331 
332  $this->pageRecord = ‪BackendUtility::readPageAccess($this->id, $this->‪getBackendUser()->getPagePermsClause(‪Permission::PAGE_SHOW));
333  if (($this->id && is_array($this->pageRecord)) || (!$this->id && $this->‪getBackendUser()->isAdmin())) {
334  $this->isAccessibleForCurrentUser = true;
335  }
336  // Don't access in workspace
337  if ($this->‪getBackendUser()->workspace !== 0) {
338  $this->isAccessibleForCurrentUser = false;
339  }
340 
341  $pageRenderer = $this->moduleTemplate->getPageRenderer();
342  $pageRenderer->addCssFile('EXT:linkvalidator/Resources/Public/Css/linkvalidator.css', 'stylesheet', 'screen');
343  $pageRenderer->loadRequireJsModule('TYPO3/CMS/Linkvalidator/Linkvalidator');
344  $pageRenderer->addInlineLanguageLabelFile('EXT:linkvalidator/Resources/Private/Language/Module/locallang.xlf');
345 
346  $this->‪initializeLinkAnalyzer();
347  }
348 
352  protected function ‪initializeLinkAnalyzer()
353  {
354  $this->linkAnalyzer = GeneralUtility::makeInstance(LinkAnalyzer::class);
355  // Get the searchFields from TSconfig
356  foreach ($this->modTS['searchFields.'] as $table => $fieldList) {
357  ‪$fields = ‪GeneralUtility::trimExplode(',', $fieldList, true);
358  foreach (‪$fields as $field) {
359  if (!$this->searchFields || !is_array($this->searchFields[$table]) || !in_array(
360  $field,
361  $this->searchFields[$table],
362  true
363  )) {
364  $this->searchFields[$table][] = $field;
365  }
366  }
367  }
368 
369  $rootLineHidden = $this->linkAnalyzer->getRootLineIsHidden($this->pObj->pageinfo);
370  if (!$rootLineHidden || $this->modTS['checkhidden'] == 1) {
371  $this->linkAnalyzer->init(
372  $this->searchFields,
373  $this->‪getPageList(),
374  $this->modTS
375  );
376  }
377  }
378 
382  protected function ‪updateBrokenLinks()
383  {
384  $this->linkAnalyzer->getLinkStatistics($this->checkOpt['check'], $this->modTS['checkhidden']);
385  }
386 
393  protected function ‪createViewForBrokenLinksTab(array $amountOfBrokenLinks)
394  {
395  ‪$view = $this->‪createView('ReportTab');
397  'prefix' => 'report',
398  'selectedLevel' => $this->searchLevel['report'],
399  'options' => $this->‪getCheckOptions($amountOfBrokenLinks, 'report'),
400  ]);
401  // Table header
403 
404  $linkTypes = [];
405  if (is_array($this->checkOpt['report'])) {
406  $linkTypes = array_keys($this->checkOpt['report'], '1');
407  }
408  $items = [];
409  $rootLineHidden = $this->linkAnalyzer->getRootLineIsHidden($this->pObj->pageinfo);
410  if (!$rootLineHidden || (bool)$this->modTS['checkhidden'] && !empty($linkTypes)) {
411  $brokenLinks = $this->brokenLinkRepository->getAllBrokenLinksForPages(
412  $this->‪getPageList(),
413  $linkTypes,
414  $this->searchFields
415  );
416  foreach ($brokenLinks as $row) {
417  $items[] = $this->‪renderTableRow($row['table_name'], $row);
418  }
419  }
420  if (empty($items)) {
422  }
423  ‪$view->‪assign('brokenLinks', $items);
424  return ‪$view;
425  }
426 
433  protected function ‪getPageList(): array
434  {
436  $pageList = $this->linkAnalyzer->extGetTreeList(
437  $this->id,
438  $this->searchLevel['report'],
439  0,
440  $permsClause,
441  $this->modTS['checkhidden']
442  );
443  // Always add the current page, because we are just displaying the results
444  $pageList .= ‪$this->id;
445  $pageList = $this->‪addPageTranslationsToPageList($pageList, $permsClause);
446  return ‪GeneralUtility::intExplode(',', $pageList, true);
447  }
448 
452  protected function ‪createFlashMessagesForNoBrokenLinks(): void
453  {
454  $message = GeneralUtility::makeInstance(
455  FlashMessage::class,
456  $this->‪getLanguageService()->getLL('list.no.broken.links'),
457  $this->‪getLanguageService()->getLL('list.no.broken.links.title'),
459  false
460  );
461  $flashMessageService = GeneralUtility::makeInstance(FlashMessageService::class);
462  $defaultFlashMessageQueue = $flashMessageService->getMessageQueueByIdentifier('linkvalidator');
463  $defaultFlashMessageQueue->enqueue($message);
464  }
465 
470  protected function ‪getVariablesForTableHeader(): array
471  {
472  $languageService = $this->‪getLanguageService();
473  $variables = [
474  'tableheadPath' => $languageService->getLL('list.tableHead.path'),
475  'tableheadElement' => $languageService->getLL('list.tableHead.element'),
476  'tableheadHeadlink' => $languageService->getLL('list.tableHead.headlink'),
477  'tableheadLinktarget' => $languageService->getLL('list.tableHead.linktarget'),
478  'tableheadLinkmessage' => $languageService->getLL('list.tableHead.linkmessage'),
479  'tableheadLastcheck' => $languageService->getLL('list.tableHead.lastCheck'),
480  ];
481 
482  // Add CSH to the header of each column
483  foreach ($variables as $column => $label) {
484  $variables[$column] = ‪BackendUtility::wrapInHelp('linkvalidator', $column, $label);
485  }
486  return $variables;
487  }
488 
496  protected function ‪renderTableRow($table, array $row)
497  {
498  $languageService = $this->‪getLanguageService();
499  $variables = [];
500  $fieldName = '';
501  // Restore the linktype object
502  $hookObj = $this->hookObjectsArr[$row['link_type']];
503 
504  // Construct link to edit the content element
505  $requestUri = GeneralUtility::getIndpEnv('REQUEST_URI') .
506  '&id=' . $this->id .
507  '&search_levels=' . $this->searchLevel['report'] .
508  // add record_uid as query parameter for rechecking after edit
509  '&last_edited_record_uid=' . $row['record_uid'] .
510  '&last_edited_record_table=' . $row['table_name'] .
511  '&last_edited_record_field=' . $row['field'] .
512  '&last_edited_record_timestamp=' . ‪$GLOBALS['EXEC_TIME'];
513 
514  $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
515  $url = (string)$uriBuilder->buildUriFromRoute('record_edit', [
516  'edit' => [
517  $table => [
518  $row['record_uid'] => 'edit'
519  ]
520  ],
521  'columnsOnly' => $row['field'],
522  'returnUrl' => $requestUri
523  ]);
524  $variables['editUrl'] = $url;
525  $elementHeadline = $row['headline'];
526  // Get the language label for the field from TCA
527  if (‪$GLOBALS['TCA'][$table]['columns'][$row['field']]['label']) {
528  $fieldName = $languageService->sL(‪$GLOBALS['TCA'][$table]['columns'][$row['field']]['label']);
529  // Crop colon from end if present
530  if (substr($fieldName, -1, 1) === ':') {
531  $fieldName = substr($fieldName, 0, strlen($fieldName) - 1);
532  }
533  }
534  // Fallback, if there is no label
535  $fieldName = !empty($fieldName) ? $fieldName : $row['field'];
536  // column "Element"
537  $element = '<span title="' . htmlspecialchars($table . ':' . $row['record_uid']) . '">' . $this->iconFactory->getIconForRecord($table, $row, ‪Icon::SIZE_SMALL)->render() . '</span>';
538  if (empty($elementHeadline)) {
539  $element .= '<i>' . htmlspecialchars($languageService->getLL('list.no.headline')) . '</i>';
540  } else {
541  $element .= htmlspecialchars($elementHeadline);
542  }
543  $element .= ' ' . htmlspecialchars(sprintf($languageService->getLL('list.field'), $fieldName));
544  $variables['element'] = $element;
545  $variables['path'] = ‪BackendUtility::getRecordPath($row['record_pid'], '', 0, 0);
546  $variables['link_title'] = $row['link_title'];
547  $variables['linktarget'] = $hookObj->getBrokenUrl($row);
548  $response = $row['url_response'];
549  if ($response['valid']) {
550  $linkMessage = '<span class="valid">' . htmlspecialchars($languageService->getLL('list.msg.ok')) . '</span>';
551  } else {
552  $linkMessage = '<span class="error">'
553  . nl2br(
554  // Encode for output
555  htmlspecialchars(
556  $hookObj->getErrorMessage($response['errorParams']),
557  ENT_QUOTES,
558  'UTF-8',
559  false
560  )
561  )
562  . '</span>';
563  }
564  $variables['linkmessage'] = $linkMessage;
565  $lastRunDate = date(‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'], $row['last_check']);
566  $lastRunTime = date(‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['hhmm'], $row['last_check']);
567  $variables['lastcheck'] = htmlspecialchars(sprintf($languageService->getLL('list.msg.lastRun'), $lastRunDate, $lastRunTime));
568  $variables['needs_recheck'] = (bool)$row['needs_recheck'];
569  return $variables;
570  }
571 
579  protected function ‪getCheckOptions(array $brokenLinkOverView, $prefix)
580  {
581  $variables = [];
582  $variables['totalCountLabel'] = ‪BackendUtility::wrapInHelp('linkvalidator', 'checkboxes', $this->‪getLanguageService()->getLL('overviews.nbtotal'));
583  $variables['totalCount'] = $brokenLinkOverView['total'] ?: '0';
584  $variables['optionsByType'] = [];
585  $linkTypes = ‪GeneralUtility::trimExplode(',', $this->modTS['linktypes'] ?? '', true);
586  $availableLinkTypes = array_keys($this->hookObjectsArr);
587  foreach ($availableLinkTypes as $type) {
588  if (!in_array($type, $linkTypes, true)) {
589  continue;
590  }
591  $label = $this->‪getLanguageService()->‪getLL('hooks.' . $type) ?: $type;
592  $variables['optionsByType'][$type] = [
593  'count' => $brokenLinkOverView[$type] ?: '0',
594  'checkbox' => '<input type="checkbox" class="' . $prefix . '"'
595  . ' id="' . $prefix . '_SET_' . $type
596  . '" name="' . $prefix . '_SET[' . $type . ']" value="1"'
597  . ' ' . ($this->checkOpt[$prefix][$type] ? 'checked="checked"' : '') . '/>',
598  'label' => '<label for="' . $prefix . '_SET_' . $type . '">&nbsp;' . htmlspecialchars($label) . '</label>'
599  ];
600  }
601  return $variables;
602  }
603 
607  protected function ‪getLanguageService(): ‪LanguageService
608  {
609  return ‪$GLOBALS['LANG'];
610  }
611 
615  protected function ‪getBackendUser(): BackendUserAuthentication
616  {
617  return ‪$GLOBALS['BE_USER'];
618  }
619 
620  protected function ‪addPageTranslationsToPageList(string $theList, string $permsClause): string
621  {
622  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');
623  $queryBuilder->getRestrictions()
624  ->removeAll()
625  ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
626 
627  $result = $queryBuilder
628  ->select('uid', 'title', 'hidden')
629  ->from('pages')
630  ->where(
631  $queryBuilder->expr()->eq(
632  'l10n_parent',
633  $queryBuilder->createNamedParameter($this->id, \PDO::PARAM_INT)
634  ),
636  )
637  ->execute();
638 
639  while ($row = $result->fetch()) {
640  if ($row['hidden'] === 0 || $this->modTS['checkhidden']) {
641  $theList .= ',' . $row['uid'];
642  }
643  }
644 
645  return $theList;
646  }
647 }
‪TYPO3\CMS\Core\Imaging\Icon\SIZE_SMALL
‪const SIZE_SMALL
Definition: Icon.php:30
‪TYPO3\CMS\Info\Controller\InfoModuleController
Definition: InfoModuleController.php:41
‪TYPO3\CMS\Core\Localization\LanguageService\includeLLFile
‪array includeLLFile($fileRef, $setGlobal=null, $mergeLocalOntoDefault=null)
Definition: LanguageService.php:297
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication\getPagePermsClause
‪string getPagePermsClause($perms)
Definition: BackendUserAuthentication.php:499
‪TYPO3\CMS\Core\Imaging\Icon
Definition: Icon.php:26
‪TYPO3\CMS\Core\Imaging\IconFactory
Definition: IconFactory.php:33
‪$fields
‪$fields
Definition: pages.php:5
‪TYPO3\CMS\Backend\Utility\BackendUtility\wrapInHelp
‪static string wrapInHelp($table, $field, $text='', array $overloadHelpText=[])
Definition: BackendUtility.php:2260
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setTemplate
‪setTemplate($templateName)
Definition: AbstractTemplateView.php:92
‪TYPO3\CMS\Backend\Template\ModuleTemplate
Definition: ModuleTemplate.php:43
‪TYPO3\CMS\Core\Type\Bitmask\Permission
Definition: Permission.php:24
‪TYPO3\CMS\Linkvalidator\Linktype\LinktypeInterface
Definition: LinktypeInterface.php:22
‪TYPO3\CMS\Core\Database\Query\QueryHelper
Definition: QueryHelper.php:32
‪TYPO3\CMS\Backend\Routing\UriBuilder
Definition: UriBuilder.php:38
‪TYPO3\CMS\Backend\Utility\BackendUtility\getPagesTSconfig
‪static array getPagesTSconfig($id)
Definition: BackendUtility.php:698
‪TYPO3\CMS\Core\Authentication\AbstractUserAuthentication\pushModuleData
‪pushModuleData($module, $data, $noSave=0)
Definition: AbstractUserAuthentication.php:1161
‪TYPO3\CMS\Backend\Utility\BackendUtility\getRecordTitle
‪static string getRecordTitle($table, $row, $prep=false, $forceResult=true)
Definition: BackendUtility.php:1541
‪TYPO3\CMS\Extbase\Mvc\View\ViewInterface\assign
‪TYPO3 CMS Extbase Mvc View ViewInterface assign($key, $value)
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:62
‪TYPO3\CMS\Core\Type\Bitmask\Permission\PAGE_SHOW
‪const PAGE_SHOW
Definition: Permission.php:33
‪TYPO3\CMS\Backend\Utility\BackendUtility
Definition: BackendUtility.php:75
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static string[] trimExplode($delim, $string, $removeEmptyValues=false, $limit=0)
Definition: GeneralUtility.php:1059
‪TYPO3\CMS\Core\Messaging\AbstractMessage\OK
‪const OK
Definition: AbstractMessage.php:29
‪TYPO3\CMS\Backend\Utility\BackendUtility\readPageAccess
‪static array false readPageAccess($id, $perms_clause)
Definition: BackendUtility.php:597
‪TYPO3\CMS\Core\Messaging\FlashMessage
Definition: FlashMessage.php:24
‪TYPO3\CMS\Fluid\View\StandaloneView
Definition: StandaloneView.php:34
‪TYPO3\CMS\Core\Database\Query\QueryHelper\stripLogicalOperatorPrefix
‪static string stripLogicalOperatorPrefix(string $constraint)
Definition: QueryHelper.php:165
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:5
‪TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction
Definition: DeletedRestriction.php:28
‪TYPO3\CMS\Core\Utility\GeneralUtility\intExplode
‪static int[] intExplode($delimiter, $string, $removeEmptyValues=false, $limit=0)
Definition: GeneralUtility.php:988
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setLayoutRootPaths
‪setLayoutRootPaths(array $layoutRootPaths)
Definition: AbstractTemplateView.php:167
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:42
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setPartialRootPaths
‪setPartialRootPaths(array $partialRootPaths)
Definition: AbstractTemplateView.php:134
‪TYPO3\CMS\Linkvalidator\Report
Definition: LinkValidatorReport.php:16
‪TYPO3\CMS\Core\Localization\LanguageService\getLL
‪string getLL($index)
Definition: LanguageService.php:154
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:46
‪TYPO3\CMS\Backend\Utility\BackendUtility\getRecordPath
‪static mixed getRecordPath($uid, $clause, $titleLimit, $fullTitleLimit=0)
Definition: BackendUtility.php:546
‪TYPO3\CMS\Extbase\Mvc\View\ViewInterface\assignMultiple
‪TYPO3 CMS Extbase Mvc View ViewInterface assignMultiple(array $values)
‪TYPO3\CMS\Core\Messaging\FlashMessageService
Definition: FlashMessageService.php:27
‪TYPO3\CMS\Core\Messaging\AbstractMessage\ERROR
‪const ERROR
Definition: AbstractMessage.php:31
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setTemplateRootPaths
‪setTemplateRootPaths(array $templateRootPaths)
Definition: AbstractTemplateView.php:114