‪TYPO3CMS  11.5
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 
18 use Psr\Http\Message\ServerRequestInterface;
22 use TYPO3\CMS\Backend\Utility\BackendUtility;
29 use TYPO3\CMS\Core\Page\PageRenderer;
38 
44 {
50  protected ‪$pageRecord = [];
51 
57  protected ‪$isAccessibleForCurrentUser = false;
58 
64  protected ‪$linkAnalyzer;
65 
71  protected ‪$modTS = [];
72 
78  protected ‪$availableOptions = [];
79 
86  protected ‪$searchLevel = ['report' => 0, 'check' => 0];
87 
95  protected ‪$checkOpt = ['report' => [], 'check' => []];
96 
101  protected ‪$lastEditedRecord = [
102  'uid' => 0,
103  'table' => '',
104  'field' => '',
105  'timestamp' => 0,
106  ];
107 
111  protected ‪$hookObjectsArr = [];
112 
116  protected ‪$iconFactory;
117 
121  protected ‪$id;
122 
126  protected ‪$pObj;
127 
131  protected ‪$searchFields = [];
132 
136  protected ‪$brokenLinkRepository;
137 
141  protected ‪$pagesRepository;
142 
146  protected ‪$moduleTemplate;
147 
151  protected ‪$view;
152 
154  protected PageRenderer ‪$pageRenderer;
155 
156  public function ‪__construct(
161  PageRenderer ‪$pageRecord = null
162  ) {
163  $this->iconFactory = ‪$iconFactory ?? GeneralUtility::makeInstance(IconFactory::class);
164  $this->pagesRepository = ‪$pagesRepository ?? GeneralUtility::makeInstance(PagesRepository::class);
165  $this->moduleTemplateFactory = ‪$moduleTemplateFactory ?? GeneralUtility::makeInstance(
166  ModuleTemplateFactory::class,
167  GeneralUtility::makeInstance(PageRenderer::class),
168  $this->iconFactory,
169  GeneralUtility::makeInstance(FlashMessageService::class)
170  );
171  $this->brokenLinkRepository = ‪$brokenLinkRepository ??
172  GeneralUtility::makeInstance(BrokenLinkRepository::class);
173  $this->pageRenderer = ‪$pageRecord ??
174  GeneralUtility::makeInstance(PageRenderer::class);
175  }
176 
182  public function ‪init(‪$pObj, ServerRequestInterface $request)
183  {
184  $this->pObj = ‪$pObj;
185  $this->id = (int)($request->getParsedBody()['id'] ?? $request->getQueryParams()['id'] ?? 0);
186  $this->moduleTemplate = $this->moduleTemplateFactory->create($request);
187  $this->view = $this->‪createView('InfoModule');
188  }
189 
190  protected function ‪createView(string $templateName): ‪StandaloneView
191  {
192  ‪$view = GeneralUtility::makeInstance(StandaloneView::class);
193  ‪$view->‪setLayoutRootPaths(['EXT:linkvalidator/Resources/Private/Layouts']);
194  ‪$view->‪setPartialRootPaths(['EXT:linkvalidator/Resources/Private/Partials']);
195  ‪$view->‪setTemplateRootPaths(['EXT:linkvalidator/Resources/Private/Templates/Backend']);
196  ‪$view->‪setTemplate($templateName);
197  ‪$view->‪assign('pageId', $this->id);
198  return ‪$view;
199  }
200 
204  protected function ‪validateSettings(ServerRequestInterface $request)
205  {
206  $prefix = 'check';
207  $other = 'report';
208  if (empty($request->getParsedBody()['updateLinkList'] ?? false)) {
209  $prefix = 'report';
210  $other = 'check';
211  }
212 
213  // get information for last edited record
214  $this->lastEditedRecord['uid'] = $request->getQueryParams()['last_edited_record_uid'] ?? 0;
215  $this->lastEditedRecord['table'] = $request->getQueryParams()['last_edited_record_table'] ?? '';
216  $this->lastEditedRecord['field'] = $request->getQueryParams()['last_edited_record_field'] ?? '';
217  $this->lastEditedRecord['timestamp'] = $request->getQueryParams()['last_edited_record_timestamp'] ?? 0;
218 
219  // get searchLevel (number of levels of pages to check / show results)
220  $this->searchLevel[$prefix] = $request->getParsedBody()[$prefix . '_search_levels'] ?? $request->getQueryParams()[$prefix . '_search_levels'] ?? null;
221  if ($this->searchLevel[$prefix] !== null) {
222  $this->pObj->MOD_SETTINGS[$prefix . '_searchlevel'] = $this->searchLevel[$prefix];
223  } else {
224  $this->searchLevel[$prefix] = $this->pObj->MOD_SETTINGS[$prefix . '_searchlevel'] ?? 0;
225  }
226  if (isset($this->pObj->MOD_SETTINGS[$other . '_searchlevel'])) {
227  $this->searchLevel[$other] = $this->pObj->MOD_SETTINGS[$other . '_searchlevel'] ?? 0;
228  }
229 
230  // which linkTypes to check (internal, file, external, ...)
231  $set = $request->getParsedBody()[$prefix . '_SET'] ?? $request->getQueryParams()[$prefix . '_SET'] ?? [];
232  $submittedValues = $request->getParsedBody()[$prefix . '_values'] ?? [];
233 
234  foreach (‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['linkvalidator']['checkLinks'] ?? [] as $linkType => $value) {
235  // Compile list of all available types. Used for checking with button "Check Links".
236  if (str_contains($this->modTS['linktypes'], $linkType)) {
237  $this->availableOptions[$linkType] = 1;
238  }
239 
240  // 1) if "$prefix_values" = "1" : use POST variables
241  // 2) if not set, use stored configuration in $this->>pObj->MOD_SETTINGS
242  // 3) if not set, use default
243  unset($this->checkOpt[$prefix][$linkType]);
244  if (!empty($submittedValues)) {
245  $this->checkOpt[$prefix][$linkType] = $set[$linkType] ?? '0';
246  $this->pObj->MOD_SETTINGS[$prefix . '_' . $linkType] = $this->checkOpt[$prefix][$linkType];
247  } elseif (isset($this->pObj->MOD_SETTINGS[$prefix . '_' . $linkType])) {
248  $this->checkOpt[$prefix][$linkType] = $this->pObj->MOD_SETTINGS[$prefix . '_' . $linkType];
249  } else {
250  // use default
251  $this->checkOpt[$prefix][$linkType] = '0';
252  $this->pObj->MOD_SETTINGS[$prefix . '_' . $linkType] = $this->checkOpt[$prefix][$linkType];
253  }
254  if (isset($this->pObj->MOD_SETTINGS[$other . '_' . $linkType])) {
255  $this->checkOpt[$other][$linkType] = $this->pObj->MOD_SETTINGS[$other . '_' . $linkType];
256  }
257  }
258 
259  // save settings
260  $this->‪getBackendUser()->‪pushModuleData('web_info', $this->pObj->MOD_SETTINGS);
261  }
267  public function ‪main(ServerRequestInterface $request)
268  {
269  $this->‪getLanguageService()->‪includeLLFile('EXT:linkvalidator/Resources/Private/Language/Module/locallang.xlf');
270  if (isset($this->id)) {
271  $this->modTS = BackendUtility::getPagesTSconfig($this->id)['mod.']['linkvalidator.'] ?? [];
272  }
273  $this->‪validateSettings($request);
274  $this->‪initialize();
275 
276  if ($request->getParsedBody()['updateLinkList'] ?? false) {
277  $this->‪updateBrokenLinks();
278  } elseif ($this->lastEditedRecord['uid']) {
279  if ($this->modTS['actionAfterEditRecord'] === 'recheck') {
280  // recheck broken links for last edited reccord
281  $this->linkAnalyzer->recheckLinks(
282  $this->checkOpt['check'],
283  $this->lastEditedRecord['uid'],
284  $this->lastEditedRecord['table'],
285  $this->lastEditedRecord['field'],
286  (int)$this->lastEditedRecord['timestamp']
287  );
288  } else {
289  // mark broken links for last edited record as needing a recheck
290  $this->brokenLinkRepository->setNeedsRecheckForRecord(
291  (int)$this->lastEditedRecord['uid'],
292  $this->lastEditedRecord['table']
293  );
294  }
295  }
296 
297  $pageTitle = $this->pageRecord ? BackendUtility::getRecordTitle('pages', $this->pageRecord) : '';
298  $this->view->assign('title', $pageTitle);
299  $this->view->assign('content', $this->‪renderContent());
300  return $this->view->render();
301  }
302 
306  protected function ‪renderContent(): string
307  {
308  if (!$this->isAccessibleForCurrentUser) {
309  // If no access or if ID == zero
310  $this->moduleTemplate->addFlashMessage(
311  $this->‪getLanguageService()->getLL('no.access'),
312  $this->‪getLanguageService()->getLL('no.access.title'),
314  );
315  return '';
316  }
317 
318  $groupedBrokenLinkCounts = $this->linkAnalyzer->getLinkCounts();
319 
320  $reportsTabView = $this->‪createViewForBrokenLinksTab($groupedBrokenLinkCounts);
321  $menuItems = [
322  0 => [
323  'label' => $this->‪getLanguageService()->‪getLL('Report'),
324  'content' => $reportsTabView->render(),
325  ],
326  ];
327 
328  if ((bool)$this->modTS['showCheckLinkTab']) {
329  $reportsTabView = $this->‪createView('CheckLinksTab');
330  $reportsTabView->assignMultiple([
331  'prefix' => 'check',
332  'selectedLevel' => $this->searchLevel['check'],
333  'options' => $this->‪getCheckOptions($groupedBrokenLinkCounts, 'check'),
334  ]);
335  $menuItems[1] = [
336  'label' => $this->‪getLanguageService()->‪getLL('CheckLink'),
337  'content' => $reportsTabView->render(),
338  ];
339  }
340  return $this->moduleTemplate->getDynamicTabMenu($menuItems, 'report-linkvalidator');
341  }
342 
346  protected function ‪initialize()
347  {
348  foreach (‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['linkvalidator']['checkLinks'] ?? [] as $linkType => $className) {
349  $hookObject = GeneralUtility::makeInstance($className);
350  if (!$hookObject instanceof ‪LinktypeInterface) {
351  continue;
352  }
353  $this->hookObjectsArr[$linkType] = $hookObject;
354  }
355 
356  $this->pageRecord = BackendUtility::readPageAccess($this->id, $this->‪getBackendUser()->getPagePermsClause(‪Permission::PAGE_SHOW)) ?: [];
357  if (($this->id && $this->pageRecord !== []) || (!$this->id && $this->‪getBackendUser()->isAdmin())) {
358  $this->isAccessibleForCurrentUser = true;
359  }
360  // Don't access in workspace
361  if ($this->‪getBackendUser()->workspace !== 0) {
362  $this->isAccessibleForCurrentUser = false;
363  }
364 
365  $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/Linkvalidator/Linkvalidator');
366  $this->pageRenderer->addInlineLanguageLabelFile('EXT:linkvalidator/Resources/Private/Language/Module/locallang.xlf');
367 
368  $this->‪initializeLinkAnalyzer();
369  }
370 
374  protected function ‪initializeLinkAnalyzer()
375  {
376  $this->linkAnalyzer = GeneralUtility::makeInstance(LinkAnalyzer::class);
377  // Get the searchFields from TSconfig
378  foreach ($this->modTS['searchFields.'] as $table => $fieldList) {
379  ‪$fields = ‪GeneralUtility::trimExplode(',', $fieldList, true);
380  foreach (‪$fields as $field) {
381  if (!$this->searchFields || !is_array($this->searchFields[$table] ?? null) || !in_array(
382  $field,
383  $this->searchFields[$table],
384  true
385  )) {
386  $this->searchFields[$table][] = $field;
387  }
388  }
389  }
390 
391  $rootLineHidden = $this->pagesRepository->doesRootLineContainHiddenPages($this->pObj->pageinfo);
392  if (!$rootLineHidden || ($this->modTS['checkhidden'] ?? 0) == 1) {
393  $this->linkAnalyzer->init(
394  $this->searchFields,
395  $this->‪getPageList(),
396  $this->modTS
397  );
398  }
399  }
400 
404  protected function ‪updateBrokenLinks()
405  {
406  // convert ['external' => 1, 'db' => 0, ...] into ['external']
407  $linkTypes = [];
408  foreach ($this->checkOpt['check'] ?? [] as $linkType => $value) {
409  if ($value) {
410  $linkTypes[] = $linkType;
411  }
412  }
413  $this->linkAnalyzer->getLinkStatistics($linkTypes, $this->modTS['checkhidden']);
414  }
415 
422  protected function ‪createViewForBrokenLinksTab(array $amountOfBrokenLinks)
423  {
424  ‪$view = $this->‪createView('ReportTab');
426  'prefix' => 'report',
427  'selectedLevel' => $this->searchLevel['report'],
428  'options' => $this->‪getCheckOptions($amountOfBrokenLinks, 'report'),
429  ]);
430  // Table header
432 
433  $linkTypes = [];
434  if (is_array($this->checkOpt['report'])) {
435  $linkTypes = array_keys($this->checkOpt['report'], '1');
436  }
437  $items = [];
438  $rootLineHidden = $this->pagesRepository->doesRootLineContainHiddenPages($this->pObj->pageinfo);
439  if (!$rootLineHidden || (bool)$this->modTS['checkhidden'] && !empty($linkTypes)) {
440  $brokenLinks = $this->brokenLinkRepository->getAllBrokenLinksForPages(
441  $this->‪getPageList(),
442  $linkTypes,
443  $this->searchFields
444  );
445  foreach ($brokenLinks as $row) {
446  $items[] = $this->‪renderTableRow($row['table_name'], $row);
447  }
448  }
449  if (empty($items)) {
451  }
452  ‪$view->‪assign('brokenLinks', $items);
453  return ‪$view;
454  }
455 
462  protected function ‪getPageList(): array
463  {
464  $checkForHiddenPages = (bool)$this->modTS['checkhidden'];
465  $permsClause = (string)$this->‪getBackendUser()->‪getPagePermsClause(‪Permission::PAGE_SHOW);
466  $pageList = $this->pagesRepository->getAllSubpagesForPage(
467  $this->id,
468  (int)$this->searchLevel['report'],
469  $permsClause,
470  $checkForHiddenPages
471  );
472  // Always add the current page, because we are just displaying the results
473  $pageList[] = ‪$this->id;
474  $pageTranslations = $this->pagesRepository->getTranslationForPage(
475  $this->id,
476  $permsClause,
477  $checkForHiddenPages
478  );
479  return array_merge($pageList, $pageTranslations);
480  }
481 
485  protected function ‪createFlashMessagesForNoBrokenLinks(): void
486  {
487  $message = GeneralUtility::makeInstance(
488  FlashMessage::class,
489  $this->‪getLanguageService()->getLL('list.no.broken.links'),
490  $this->‪getLanguageService()->getLL('list.no.broken.links.title'),
492  false
493  );
494  $flashMessageService = GeneralUtility::makeInstance(FlashMessageService::class);
495  $defaultFlashMessageQueue = $flashMessageService->getMessageQueueByIdentifier('linkvalidator');
496  $defaultFlashMessageQueue->enqueue($message);
497  }
498 
503  protected function ‪getVariablesForTableHeader(): array
504  {
505  $languageService = $this->‪getLanguageService();
506  $variables = [
507  'tableheadPath' => $languageService->getLL('list.tableHead.path'),
508  'tableheadElement' => $languageService->getLL('list.tableHead.element'),
509  'tableheadHeadlink' => $languageService->getLL('list.tableHead.headlink'),
510  'tableheadLinktarget' => $languageService->getLL('list.tableHead.linktarget'),
511  'tableheadLinkmessage' => $languageService->getLL('list.tableHead.linkmessage'),
512  'tableheadLastcheck' => $languageService->getLL('list.tableHead.lastCheck'),
513  ];
514 
515  // Add CSH to the header of each column
516  foreach ($variables as $column => $label) {
517  $variables[$column] = BackendUtility::wrapInHelp('linkvalidator', $column, $label);
518  }
519  return $variables;
520  }
521 
529  protected function ‪renderTableRow($table, array $row)
530  {
531  $languageService = $this->‪getLanguageService();
532  $variables = [];
533  $fieldName = '';
534  // Restore the linktype object
535  $hookObj = $this->hookObjectsArr[$row['link_type']];
536 
537  // Construct link to edit the content element
538  $requestUri = ‪$GLOBALS['TYPO3_REQUEST']->getAttribute('normalizedParams')->getRequestUri() .
539  '&id=' . $this->id .
540  '&search_levels=' . $this->searchLevel['report'] .
541  // add record_uid as query parameter for rechecking after edit
542  '&last_edited_record_uid=' . $row['record_uid'] .
543  '&last_edited_record_table=' . $row['table_name'] .
544  '&last_edited_record_field=' . $row['field'] .
545  '&last_edited_record_timestamp=' . ‪$GLOBALS['EXEC_TIME'];
546 
547  $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
548  $url = (string)$uriBuilder->buildUriFromRoute('record_edit', [
549  'edit' => [
550  $table => [
551  $row['record_uid'] => 'edit',
552  ],
553  ],
554  'columnsOnly' => $row['field'],
555  'returnUrl' => $requestUri,
556  ]);
557  $variables['editUrl'] = $url;
558  // Get the language label for the field from TCA
559  if (‪$GLOBALS['TCA'][$table]['columns'][$row['field']]['label']) {
560  $fieldName = $languageService->sL(‪$GLOBALS['TCA'][$table]['columns'][$row['field']]['label']);
561  // Crop colon from end if present
562  if (substr($fieldName, -1, 1) === ':') {
563  $fieldName = substr($fieldName, 0, strlen($fieldName) - 1);
564  }
565  }
566  // Add element information
567  $variables['element'] = '
568  <span title="' . htmlspecialchars($table . ':' . $row['record_uid']) . '">
569  ' . $this->iconFactory->getIconForRecord($table, $row, ‪Icon::SIZE_SMALL)->render() . '
570  </span>
571  ' . (($row['headline'] ?? false) ? htmlspecialchars($row['headline']) : '<i>' . htmlspecialchars($languageService->getLL('list.no.headline')) . '</i>') . '
572  ' . htmlspecialchars(sprintf($languageService->getLL('list.field'), (!empty($fieldName) ? $fieldName : $row['field'])));
573  $variables['path'] = BackendUtility::getRecordPath($row['record_pid'], $this->‪getBackendUser()->getPagePermsClause(‪Permission::PAGE_SHOW), 0);
574  $variables['link_title'] = $row['link_title'];
575  $variables['linktarget'] = $hookObj->getBrokenUrl($row);
576  $response = $row['url_response'];
577  if ($response['valid'] ?? false) {
578  $linkMessage = '<span class="text-success">' . htmlspecialchars($languageService->getLL('list.msg.ok')) . '</span>';
579  } else {
580  $linkMessage = '<span class="text-danger">'
581  . nl2br(
582  // Encode for output
583  htmlspecialchars(
584  $hookObj->getErrorMessage($response['errorParams'] ?? ['errorType' => 'unknown', 'exception' => 'Invalid response']),
585  ENT_QUOTES,
586  'UTF-8',
587  false
588  )
589  )
590  . '</span>';
591  }
592  $variables['linkmessage'] = $linkMessage;
593  $lastRunDate = date(‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'], $row['last_check']);
594  $lastRunTime = date(‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['hhmm'], $row['last_check']);
595  $variables['lastcheck'] = htmlspecialchars(sprintf($languageService->getLL('list.msg.lastRun'), $lastRunDate, $lastRunTime));
596  $variables['needs_recheck'] = (bool)$row['needs_recheck'];
597  return $variables;
598  }
599 
607  protected function ‪getCheckOptions(array $brokenLinkOverView, $prefix)
608  {
609  $variables = [];
610  $variables['totalCountLabel'] = BackendUtility::wrapInHelp('linkvalidator', 'checkboxes', $this->‪getLanguageService()->getLL('overviews.nbtotal'));
611  $variables['totalCount'] = $brokenLinkOverView['total'] ?: '0';
612  $variables['optionsByType'] = [];
613  $linkTypes = ‪GeneralUtility::trimExplode(',', $this->modTS['linktypes'] ?? '', true);
614  $availableLinkTypes = array_keys($this->hookObjectsArr);
615  foreach ($availableLinkTypes as $type) {
616  if (!in_array($type, $linkTypes, true)) {
617  continue;
618  }
619  $label = $this->‪getLanguageService()->‪getLL('hooks.' . $type) ?: $type;
620  ‪$id = $prefix . '_SET_' . $type;
621  $checked = !empty($this->checkOpt[$prefix][$type]) ? ' checked="checked"' : '';
622  $variables['optionsByType'][$type] = [
623  'count' => (!empty($brokenLinkOverView[$type]) ? $brokenLinkOverView[$type] : '0'),
624  'checkbox' => '<input type="checkbox" class="form-check-input mt-1" value="1" id="' . ‪$id . '" name="' . $prefix . '_SET[' . $type . ']"' . $checked . '/>',
625  'label' => '<label class="form-check-label lh-lg" for="' . ‪$id . '">' . htmlspecialchars($label) . '</label>',
626  ];
627  }
628  return $variables;
629  }
630 
634  protected function ‪getLanguageService(): ‪LanguageService
635  {
636  return ‪$GLOBALS['LANG'];
637  }
638 
642  protected function ‪getBackendUser(): BackendUserAuthentication
643  {
644  return ‪$GLOBALS['BE_USER'];
645  }
646 }
‪TYPO3\CMS\Core\Imaging\Icon\SIZE_SMALL
‪const SIZE_SMALL
Definition: Icon.php:30
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static list< string > trimExplode($delim, $string, $removeEmptyValues=false, $limit=0)
Definition: GeneralUtility.php:999
‪TYPO3\CMS\Info\Controller\InfoModuleController
Definition: InfoModuleController.php:45
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication\getPagePermsClause
‪string getPagePermsClause($perms)
Definition: BackendUserAuthentication.php:460
‪TYPO3\CMS\Core\Imaging\Icon
Definition: Icon.php:26
‪TYPO3\CMS\Backend\Template\ModuleTemplateFactory
Definition: ModuleTemplateFactory.php:29
‪TYPO3\CMS\Extbase\Mvc\View\ViewInterface\assign
‪self assign($key, $value)
‪TYPO3\CMS\Linkvalidator\Repository\PagesRepository
Definition: PagesRepository.php:33
‪TYPO3\CMS\Core\Imaging\IconFactory
Definition: IconFactory.php:34
‪$fields
‪$fields
Definition: pages.php:5
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setTemplate
‪setTemplate($templateName)
Definition: AbstractTemplateView.php:102
‪TYPO3\CMS\Backend\Template\ModuleTemplate
Definition: ModuleTemplate.php:46
‪TYPO3\CMS\Core\Type\Bitmask\Permission
Definition: Permission.php:26
‪TYPO3\CMS\Linkvalidator\Linktype\LinktypeInterface
Definition: LinktypeInterface.php:22
‪TYPO3\CMS\Backend\Routing\UriBuilder
Definition: UriBuilder.php:40
‪TYPO3\CMS\Core\Authentication\AbstractUserAuthentication\pushModuleData
‪pushModuleData($module, $data, $noSave=0)
Definition: AbstractUserAuthentication.php:1034
‪TYPO3\CMS\Extbase\Mvc\View\ViewInterface\assignMultiple
‪self assignMultiple(array $values)
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:62
‪TYPO3\CMS\Core\Type\Bitmask\Permission\PAGE_SHOW
‪const PAGE_SHOW
Definition: Permission.php:35
‪TYPO3\CMS\Core\Messaging\AbstractMessage\OK
‪const OK
Definition: AbstractMessage.php:29
‪TYPO3\CMS\Core\Messaging\FlashMessage
Definition: FlashMessage.php:26
‪TYPO3\CMS\Fluid\View\StandaloneView
Definition: StandaloneView.php:31
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setLayoutRootPaths
‪setLayoutRootPaths(array $layoutRootPaths)
Definition: AbstractTemplateView.php:177
‪TYPO3\CMS\Core\Localization\LanguageService\includeLLFile
‪array includeLLFile($fileRef)
Definition: LanguageService.php:271
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:42
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setPartialRootPaths
‪setPartialRootPaths(array $partialRootPaths)
Definition: AbstractTemplateView.php:144
‪TYPO3\CMS\Linkvalidator\Report
Definition: LinkValidatorReport.php:16
‪TYPO3\CMS\Core\Localization\LanguageService\getLL
‪string getLL($index)
Definition: LanguageService.php:121
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪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:124