‪TYPO3CMS  9.5
ElementHistoryController.php
Go to the documentation of this file.
1 <?php
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
17 use Psr\Http\Message\ResponseInterface;
18 use Psr\Http\Message\ServerRequestInterface;
30 
37 {
41  protected ‪$view;
42 
46  protected ‪$historyObject;
47 
53  protected ‪$showDiff = 1;
54 
58  protected ‪$recordCache = [];
59 
65  protected ‪$moduleTemplate;
66 
72  protected ‪$editLock = false;
73 
77  public function ‪__construct()
78  {
79  $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
80  $this->view = $this->‪initializeView();
81  }
82 
90  public function ‪mainAction(ServerRequestInterface $request): ResponseInterface
91  {
92  $this->moduleTemplate->getDocHeaderComponent()->setMetaInformation([]);
93 
94  $parsedBody = $request->getParsedBody();
95  $queryParams = $request->getQueryParams();
96  $lastHistoryEntry = (int)($parsedBody['historyEntry'] ?? $queryParams['historyEntry'] ?? 0);
97  $rollbackFields = $parsedBody['rollbackFields'] ?? $queryParams['rollbackFields'] ?? null;
98  $element = $parsedBody['element'] ?? $queryParams['element'] ?? null;
99  $displaySettings = $this->‪prepareDisplaySettings($request);
100  $this->view->assign('currentSelection', $displaySettings);
101 
102  $this->showDiff = (int)$displaySettings['showDiff'];
103 
104  // Start history object
105  $this->historyObject = GeneralUtility::makeInstance(RecordHistory::class, $element, $rollbackFields);
106  $this->historyObject->setShowSubElements((int)$displaySettings['showSubElements']);
107  $this->historyObject->setLastHistoryEntry($lastHistoryEntry);
108  if ($displaySettings['maxSteps']) {
109  $this->historyObject->setMaxSteps((int)$displaySettings['maxSteps']);
110  }
111 
112  // Do the actual logic now (rollback, show a diff for certain changes,
113  // or show the full history of a page or a specific record)
114  $this->historyObject->createChangeLog();
115  if (!empty($this->historyObject->changeLog)) {
116  if ($this->historyObject->shouldPerformRollback()) {
117  $this->historyObject->performRollback();
118  } elseif ($lastHistoryEntry) {
119  $completeDiff = $this->historyObject->createMultipleDiff();
120  $this->‪displayMultipleDiff($completeDiff);
121  $this->view->assign('showDifferences', true);
122  $this->view->assign('fullViewUrl', $this->‪buildUrl(['historyEntry' => '']));
123  }
124  if ($this->historyObject->getElementData()) {
125  $this->‪displayHistory($this->historyObject->changeLog);
126  }
127  }
128 
130  $normalizedParams = $request->getAttribute('normalizedParams');
131  $elementData = $this->historyObject->getElementData();
132  if ($elementData) {
133  $this->‪setPagePath($elementData[0], $elementData[1]);
134  $this->editLock = $this->‪getEditLockFromElement($elementData[0], $elementData[1]);
135  // Get link to page history if the element history is shown
136  if ($elementData[0] !== 'pages') {
137  $this->view->assign('singleElement', true);
138  $parentPage = ‪BackendUtility::getRecord($elementData[0], $elementData[1], '*', '', false);
139  if ($parentPage['pid'] > 0 && ‪BackendUtility::readPageAccess($parentPage['pid'], $this->‪getBackendUser()->getPagePermsClause(‪Permission::PAGE_SHOW))) {
140  $this->view->assign('fullHistoryUrl', $this->‪buildUrl([
141  'element' => 'pages:' . $parentPage['pid'],
142  'historyEntry' => '',
143  'returnUrl' => $normalizedParams->getRequestUri(),
144  ]));
145  }
146  }
147  }
148 
149  $this->view->assign('TYPO3_REQUEST_URI', $normalizedParams->getRequestUrl());
150  $this->view->assign('editLock', $this->editLock);
151 
152  // Setting up the buttons and markers for docheader
153  $this->‪getButtons($request);
154  // Build the <body> for the module
155  $this->moduleTemplate->setContent($this->view->render());
156 
157  return new HtmlResponse($this->moduleTemplate->renderContent());
158  }
159 
166  protected function ‪setPagePath($table, $uid)
167  {
168  $uid = (int)$uid;
169 
170  if ($table === 'pages') {
171  $pageId = $uid;
172  } else {
173  $record = ‪BackendUtility::getRecord($table, $uid, '*', '', false);
174  $pageId = $record['pid'];
175  }
176 
177  $pageAccess = ‪BackendUtility::readPageAccess($pageId, $this->‪getBackendUser()->getPagePermsClause(‪Permission::PAGE_SHOW));
178  if (is_array($pageAccess)) {
179  $this->moduleTemplate->getDocHeaderComponent()->setMetaInformation($pageAccess);
180  }
181  }
182 
188  protected function ‪getButtons(ServerRequestInterface $request)
189  {
190  $buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar();
191 
192  $helpButton = $buttonBar->makeHelpButton()
193  ->setModuleName('xMOD_csh_corebe')
194  ->setFieldName('history_log');
195  $buttonBar->addButton($helpButton);
196 
197  // Get returnUrl parameter
198  $parsedBody = $request->getParsedBody();
199  $queryParams = $request->getQueryParams();
200  $returnUrl = GeneralUtility::sanitizeLocalUrl($parsedBody['returnUrl'] ?? $queryParams['returnUrl'] ?? '');
201 
202  if ($returnUrl) {
203  $backButton = $buttonBar->makeLinkButton()
204  ->setHref($returnUrl)
205  ->setTitle($this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:rm.closeDoc'))
206  ->setIcon($this->moduleTemplate->getIconFactory()->getIcon('actions-view-go-back', ‪Icon::SIZE_SMALL));
207  $buttonBar->addButton($backButton, ‪ButtonBar::BUTTON_POSITION_LEFT, 10);
208  }
209  }
210 
217  protected function ‪prepareDisplaySettings(ServerRequestInterface $request)
218  {
219  // Get current selection from UC, merge data, write it back to UC
220  $currentSelection = is_array($this->‪getBackendUser()->uc['moduleData']['history'])
221  ? $this->‪getBackendUser()->uc['moduleData']['history']
222  : ['maxSteps' => '', 'showDiff' => 1, 'showSubElements' => 1];
223  $parsedBody = $request->getParsedBody();
224  $queryParams = $request->getQueryParams();
225  $currentSelectionOverride = $parsedBody['settings'] ?? $queryParams['settings'] ?? null;
226 
227  if (is_array($currentSelectionOverride) && !empty($currentSelectionOverride)) {
228  $currentSelection = array_merge($currentSelection, $currentSelectionOverride);
229  $this->‪getBackendUser()->uc['moduleData']['history'] = $currentSelection;
230  $this->‪getBackendUser()->‪writeUC($this->‪getBackendUser()->uc);
231  }
232 
233  // Display selector for number of history entries
234  $selector['maxSteps'] = [
235  10 => [
236  'value' => 10
237  ],
238  20 => [
239  'value' => 20
240  ],
241  50 => [
242  'value' => 50
243  ],
244  100 => [
245  'value' => 100
246  ],
247  999 => [
248  'value' => 'maxSteps_all'
249  ]
250  ];
251  $selector['showDiff'] = [
252  0 => [
253  'value' => 'showDiff_no'
254  ],
255  1 => [
256  'value' => 'showDiff_inline'
257  ]
258  ];
259  $selector['showSubElements'] = [
260  0 => [
261  'value' => 'no'
262  ],
263  1 => [
264  'value' => 'yes'
265  ]
266  ];
267 
268  $scriptUrl = GeneralUtility::linkThisScript();
269 
270  foreach ($selector as $key => $values) {
271  foreach ($values as $singleKey => $singleVal) {
272  $selector[$key][$singleKey]['scriptUrl'] = htmlspecialchars(GeneralUtility::quoteJSvalue($scriptUrl . '&settings[' . $key . ']=' . $singleKey));
273  }
274  }
275  $this->view->assign('settings', $selector);
276  return $currentSelection;
277  }
278 
284  protected function ‪displayMultipleDiff(array $diff)
285  {
286  // Get all array keys needed
287  $arrayKeys = array_merge(array_keys($diff['newData']), array_keys($diff['insertsDeletes']), array_keys($diff['oldData']));
288  $arrayKeys = array_unique($arrayKeys);
289  if (!empty($arrayKeys)) {
290  $lines = [];
291  foreach ($arrayKeys as $key) {
292  $singleLine = [];
293  $elParts = explode(':', $key);
294  // Turn around diff because it should be a "rollback preview"
295  if ((int)$diff['insertsDeletes'][$key] === 1) {
296  // insert
297  $singleLine['insertDelete'] = 'delete';
298  } elseif ((int)$diff['insertsDeletes'][$key] === -1) {
299  $singleLine['insertDelete'] = 'insert';
300  }
301  // Build up temporary diff array
302  // turn around diff because it should be a "rollback preview"
303  if ($diff['newData'][$key]) {
304  $tmpArr = [
305  'newRecord' => $diff['oldData'][$key],
306  'oldRecord' => $diff['newData'][$key]
307  ];
308  $singleLine['differences'] = $this->‪renderDiff($tmpArr, $elParts[0], $elParts[1]);
309  }
310  $elParts = explode(':', $key);
311  $singleLine['revertRecordUrl'] = $this->‪buildUrl(['rollbackFields' => $key]);
312  $singleLine['title'] = $this->‪generateTitle($elParts[0], $elParts[1]);
313  $lines[] = $singleLine;
314  }
315  $this->view->assign('revertAllUrl', $this->‪buildUrl(['rollbackFields' => 'ALL']));
316  $this->view->assign('multipleDiff', $lines);
317  }
318  }
319 
325  protected function ‪displayHistory(array $historyEntries)
326  {
327  if (empty($historyEntries)) {
328  return;
329  }
330  $languageService = $this->‪getLanguageService();
331  $lines = [];
332  $beUserArray = ‪BackendUtility::getUserNames();
333 
334  // Traverse changeLog array:
335  foreach ($historyEntries as $entry) {
336  // Build up single line
337  $singleLine = [];
338 
339  // Get user names
340  $singleLine['backendUserUid'] = $entry['userid'];
341  $singleLine['backendUserName'] = $entry['userid'] ? $beUserArray[$entry['userid']]['username'] : '';
342  // Executed by switch user
343  if (!empty($entry['originaluserid'])) {
344  $singleLine['originalBackendUserName'] = $beUserArray[$entry['originaluserid']]['username'];
345  }
346 
347  // Diff link
348  $singleLine['diffUrl'] = $this->‪buildUrl(['historyEntry' => $entry['uid']]);
349  // Add time
350  $singleLine['time'] = ‪BackendUtility::datetime($entry['tstamp']);
351  // Add age
352  $singleLine['age'] = ‪BackendUtility::calcAge(‪$GLOBALS['EXEC_TIME'] - $entry['tstamp'], $languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.minutesHoursDaysYears'));
353 
354  $singleLine['title'] = $this->‪generateTitle($entry['tablename'], $entry['recuid']);
355  $singleLine['elementUrl'] = $this->‪buildUrl(['element' => $entry['tablename'] . ':' . $entry['recuid']]);
356  $singleLine['actiontype'] = $entry['actiontype'];
357  if ((int)$entry['actiontype'] === ‪RecordHistoryStore::ACTION_MODIFY) {
358  // show changes
359  if (!$this->showDiff) {
360  // Display field names instead of full diff
361  // Re-write field names with labels
362  $tmpFieldList = array_keys($entry['newRecord']);
363  foreach ($tmpFieldList as $key => $value) {
364  $tmp = str_replace(':', '', $languageService->sL(‪BackendUtility::getItemLabel($entry['tablename'], $value)));
365  if ($tmp) {
366  $tmpFieldList[$key] = $tmp;
367  } else {
368  // remove fields if no label available
369  unset($tmpFieldList[$key]);
370  }
371  }
372  $singleLine['fieldNames'] = implode(',', $tmpFieldList);
373  } else {
374  // Display diff
375  $singleLine['differences'] = $this->‪renderDiff($entry, $entry['tablename']);
376  }
377  }
378  // put line together
379  $lines[] = $singleLine;
380  }
381  $this->view->assign('history', $lines);
382  }
383 
392  protected function ‪renderDiff($entry, $table, $rollbackUid = 0): array
393  {
394  $lines = [];
395  if (is_array($entry['newRecord'])) {
396  /* @var DiffUtility $diffUtility */
397  $diffUtility = GeneralUtility::makeInstance(DiffUtility::class);
398  $diffUtility->stripTags = false;
399  $fieldsToDisplay = array_keys($entry['newRecord']);
400  $languageService = $this->‪getLanguageService();
401  foreach ($fieldsToDisplay as $fN) {
402  if (is_array(‪$GLOBALS['TCA'][$table]['columns'][$fN]) && ‪$GLOBALS['TCA'][$table]['columns'][$fN]['config']['type'] !== 'passthrough') {
403  // Create diff-result:
404  $diffres = $diffUtility->makeDiffDisplay(
405  ‪BackendUtility::getProcessedValue($table, $fN, $entry['oldRecord'][$fN], 0, true),
406  ‪BackendUtility::getProcessedValue($table, $fN, $entry['newRecord'][$fN], 0, true)
407  );
408  $rollbackUrl = '';
409  if ($rollbackUid) {
410  $rollbackUrl = $this->‪buildUrl(['rollbackFields' => $table . ':' . $rollbackUid . ':' . $fN]);
411  }
412  $lines[] = [
413  'title' => $languageService->sL(‪BackendUtility::getItemLabel($table, $fN)),
414  'rollbackUrl' => $rollbackUrl,
415  'result' => str_replace('\n', PHP_EOL, str_replace('\r\n', '\n', $diffres))
416  ];
417  }
418  }
419  }
420  return $lines;
421  }
422 
429  protected function ‪buildUrl($overrideParameters = []): string
430  {
431  $params = [];
432  // Setting default values based on GET parameters:
433  if ($this->historyObject->getElementData()) {
434  $params['element'] = $this->historyObject->getElementString();
435  }
436  $params['historyEntry'] = $this->historyObject->lastHistoryEntry;
437  // Merging overriding values:
438  $params = array_merge($params, $overrideParameters);
439  // Make the link:
440 
442  $uriBuilder = GeneralUtility::makeInstance(\‪TYPO3\CMS\Backend\Routing\UriBuilder::class);
443  return (string)$uriBuilder->buildUriFromRoute('record_history', $params);
444  }
445 
453  protected function ‪generateTitle($table, $uid): string
454  {
455  $title = $table . ':' . $uid;
456  if (!empty(‪$GLOBALS['TCA'][$table]['ctrl']['label'])) {
457  $record = $this->‪getRecord($table, $uid);
458  $title .= ' (' . ‪BackendUtility::getRecordTitle($table, $record, true) . ')';
459  }
460  return $title;
461  }
462 
470  protected function ‪getRecord($table, $uid)
471  {
472  if (!isset($this->recordCache[$table][$uid])) {
473  $this->recordCache[$table][$uid] = ‪BackendUtility::getRecord($table, $uid, '*', '', false);
474  }
475  return $this->recordCache[$table][$uid];
476  }
477 
483  protected function ‪initializeView()
484  {
486  ‪$view = GeneralUtility::makeInstance(StandaloneView::class);
487  ‪$view->‪setLayoutRootPaths([GeneralUtility::getFileAbsFileName('EXT:backend/Resources/Private/Layouts')]);
488  ‪$view->‪setPartialRootPaths([GeneralUtility::getFileAbsFileName('EXT:backend/Resources/Private/Partials')]);
489  ‪$view->‪setTemplateRootPaths([GeneralUtility::getFileAbsFileName('EXT:backend/Resources/Private/Templates')]);
490 
491  ‪$view->‪setTemplatePathAndFilename(GeneralUtility::getFileAbsFileName('EXT:backend/Resources/Private/Templates/RecordHistory/Main.html'));
492 
493  ‪$view->‪getRequest()->setControllerExtensionName('Backend');
494  return ‪$view;
495  }
496 
502  protected function ‪getLanguageService()
503  {
504  return ‪$GLOBALS['LANG'];
505  }
506 
512  protected function ‪getBackendUser()
513  {
514  return ‪$GLOBALS['BE_USER'];
515  }
516 
525  protected function ‪getEditLockFromElement($tableName, $elementUid): bool
526  {
527  // If the user is admin, then he may always edit the page.
528  if ($this->‪getBackendUser()->isAdmin()) {
529  return false;
530  }
531 
532  $record = ‪BackendUtility::getRecord($tableName, $elementUid, '*', '', false);
533  // we need the parent page record for the editlock info if element isn't a page
534  if ($tableName !== 'pages') {
535  $pageId = $record['pid'];
536  $record = ‪BackendUtility::getRecord('pages', $pageId, '*', '', false);
537  }
538 
539  return (bool)$record['editlock'];
540  }
541 }
‪TYPO3\CMS\Core\Utility\DiffUtility
Definition: DiffUtility.php:23
‪TYPO3\CMS\Core\Imaging\Icon\SIZE_SMALL
‪const SIZE_SMALL
Definition: Icon.php:29
‪TYPO3\CMS\Backend\Template\Components\ButtonBar\BUTTON_POSITION_LEFT
‪const BUTTON_POSITION_LEFT
Definition: ButtonBar.php:35
‪TYPO3\CMS\Backend\Template\Components\ButtonBar
Definition: ButtonBar.php:31
‪TYPO3\CMS\Core\Authentication\AbstractUserAuthentication\writeUC
‪writeUC($variable='')
Definition: AbstractUserAuthentication.php:1172
‪TYPO3\CMS\Backend\Utility\BackendUtility\datetime
‪static string datetime($value)
Definition: BackendUtility.php:1190
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\prepareDisplaySettings
‪array prepareDisplaySettings(ServerRequestInterface $request)
Definition: ElementHistoryController.php:211
‪TYPO3\CMS\Core\Imaging\Icon
Definition: Icon.php:25
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\getRecord
‪array null getRecord($table, $uid)
Definition: ElementHistoryController.php:464
‪TYPO3
‪TYPO3\CMS\Backend\Utility\BackendUtility\calcAge
‪static string calcAge($seconds, $labels='min|hrs|days|yrs|min|hour|day|year')
Definition: BackendUtility.php:1218
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$view
‪StandaloneView $view
Definition: ElementHistoryController.php:40
‪TYPO3\CMS\Backend\Controller\ContentElement
Definition: ElementHistoryController.php:2
‪TYPO3\CMS\Backend\Utility\BackendUtility\getItemLabel
‪static string getItemLabel($table, $col)
Definition: BackendUtility.php:1791
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$moduleTemplate
‪ModuleTemplate $moduleTemplate
Definition: ElementHistoryController.php:60
‪TYPO3\CMS\Core\DataHandling\History\RecordHistoryStore\ACTION_MODIFY
‪const ACTION_MODIFY
Definition: RecordHistoryStore.php:30
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\initializeView
‪StandaloneView initializeView()
Definition: ElementHistoryController.php:477
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\generateTitle
‪string generateTitle($table, $uid)
Definition: ElementHistoryController.php:447
‪TYPO3\CMS\Backend\Utility\BackendUtility\getUserNames
‪static array getUserNames($fields='username, usergroup, usergroup_cached_list, uid', $where='')
Definition: BackendUtility.php:1003
‪TYPO3\CMS\Backend\Template\ModuleTemplate
Definition: ModuleTemplate.php:40
‪TYPO3\CMS\Core\Type\Bitmask\Permission
Definition: Permission.php:23
‪TYPO3\CMS\Core\DataHandling\History\RecordHistoryStore
Definition: RecordHistoryStore.php:28
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\getBackendUser
‪TYPO3 CMS Core Authentication BackendUserAuthentication getBackendUser()
Definition: ElementHistoryController.php:506
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\renderDiff
‪array renderDiff($entry, $table, $rollbackUid=0)
Definition: ElementHistoryController.php:386
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\getButtons
‪getButtons(ServerRequestInterface $request)
Definition: ElementHistoryController.php:182
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\setPagePath
‪setPagePath($table, $uid)
Definition: ElementHistoryController.php:160
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\mainAction
‪ResponseInterface mainAction(ServerRequestInterface $request)
Definition: ElementHistoryController.php:84
‪TYPO3\CMS\Backend\History\RecordHistory
Definition: RecordHistory.php:30
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController
Definition: ElementHistoryController.php:37
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\buildUrl
‪string buildUrl($overrideParameters=[])
Definition: ElementHistoryController.php:423
‪TYPO3\CMS\Backend\Utility\BackendUtility\getRecordTitle
‪static string getRecordTitle($table, $row, $prep=false, $forceResult=true)
Definition: BackendUtility.php:1811
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setTemplatePathAndFilename
‪setTemplatePathAndFilename($templatePathAndFilename)
Definition: AbstractTemplateView.php:100
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$editLock
‪bool $editLock
Definition: ElementHistoryController.php:66
‪TYPO3\CMS\Core\Type\Bitmask\Permission\PAGE_SHOW
‪const PAGE_SHOW
Definition: Permission.php:32
‪TYPO3\CMS\Backend\Utility\BackendUtility
Definition: BackendUtility.php:72
‪TYPO3\CMS\Backend\Utility\BackendUtility\getRecord
‪static array null getRecord($table, $uid, $fields=' *', $where='', $useDeleteClause=true)
Definition: BackendUtility.php:130
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$recordCache
‪array $recordCache
Definition: ElementHistoryController.php:54
‪TYPO3\CMS\Backend\Utility\BackendUtility\getProcessedValue
‪static string null getProcessedValue( $table, $col, $value, $fixed_lgd_chars=0, $defaultPassthrough=false, $noRecordLookup=false, $uid=0, $forceResult=true, $pid=0)
Definition: BackendUtility.php:1933
‪TYPO3\CMS\Fluid\View\StandaloneView
Definition: StandaloneView.php:32
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:5
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\displayHistory
‪displayHistory(array $historyEntries)
Definition: ElementHistoryController.php:319
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$showDiff
‪int $showDiff
Definition: ElementHistoryController.php:50
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\getLanguageService
‪TYPO3 CMS Core Localization LanguageService getLanguageService()
Definition: ElementHistoryController.php:496
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setLayoutRootPaths
‪setLayoutRootPaths(array $layoutRootPaths)
Definition: AbstractTemplateView.php:164
‪TYPO3\CMS\Fluid\View\StandaloneView\getRequest
‪WebRequest getRequest()
Definition: StandaloneView.php:109
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setPartialRootPaths
‪setPartialRootPaths(array $partialRootPaths)
Definition: AbstractTemplateView.php:131
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\getEditLockFromElement
‪bool getEditLockFromElement($tableName, $elementUid)
Definition: ElementHistoryController.php:519
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:45
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$historyObject
‪RecordHistory $historyObject
Definition: ElementHistoryController.php:44
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\displayMultipleDiff
‪displayMultipleDiff(array $diff)
Definition: ElementHistoryController.php:278
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\__construct
‪__construct()
Definition: ElementHistoryController.php:71
‪TYPO3\CMS\Core\Http\HtmlResponse
Definition: HtmlResponse.php:25
‪TYPO3\CMS\Backend\Utility\BackendUtility\readPageAccess
‪static array bool readPageAccess($id, $perms_clause)
Definition: BackendUtility.php:635
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setTemplateRootPaths
‪setTemplateRootPaths(array $templateRootPaths)
Definition: AbstractTemplateView.php:111