‪TYPO3CMS  11.5
ElementHistoryController.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\ResponseInterface;
19 use Psr\Http\Message\ServerRequestInterface;
26 use TYPO3\CMS\Backend\Utility\BackendUtility;
37 
44 {
48  protected ‪$view;
49 
53  protected ‪$historyObject;
54 
60  protected ‪$showDiff = true;
61 
65  protected ‪$recordCache = [];
66 
72  protected ‪$moduleTemplate;
73 
77  protected string ‪$returnUrl = '';
78 
80  protected ‪UriBuilder ‪$uriBuilder;
82 
83  public function ‪__construct(
87  ) {
88  $this->iconFactory = ‪$iconFactory;
89  $this->uriBuilder = ‪$uriBuilder;
90  $this->moduleTemplateFactory = ‪$moduleTemplateFactory;
91  $this->view = $this->‪initializeView();
92  }
93 
101  public function ‪mainAction(ServerRequestInterface $request): ResponseInterface
102  {
103  $this->moduleTemplate = $this->moduleTemplateFactory->create($request);
104  $backendUser = $this->‪getBackendUser();
105  $this->moduleTemplate->getDocHeaderComponent()->setMetaInformation([]);
106  $buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar();
107 
108  $parsedBody = $request->getParsedBody();
109  $queryParams = $request->getQueryParams();
110 
111  $this->returnUrl = GeneralUtility::sanitizeLocalUrl($parsedBody['returnUrl'] ?? $queryParams['returnUrl'] ?? '');
112 
113  $lastHistoryEntry = (int)($parsedBody['historyEntry'] ?? $queryParams['historyEntry'] ?? 0);
114  $rollbackFields = $parsedBody['rollbackFields'] ?? $queryParams['rollbackFields'] ?? null;
115  $element = $parsedBody['element'] ?? $queryParams['element'] ?? null;
116  $moduleSettings = $this->‪processSettings($request);
117  $this->view->assign('isUserInWorkspace', $backendUser->workspace > 0);
118 
119  $this->showDiff = (bool)$moduleSettings['showDiff'];
120 
121  // Start history object
122  $this->historyObject = GeneralUtility::makeInstance(RecordHistory::class, $element, $rollbackFields);
123  $this->historyObject->setShowSubElements((bool)$moduleSettings['showSubElements']);
124  $this->historyObject->setLastHistoryEntryNumber($lastHistoryEntry);
125  if ($moduleSettings['maxSteps']) {
126  $this->historyObject->setMaxSteps((int)$moduleSettings['maxSteps']);
127  }
128 
129  // Do the actual logic now (rollback, show a diff for certain changes,
130  // or show the full history of a page or a specific record)
131  $changeLog = $this->historyObject->getChangeLog();
132  if (!empty($changeLog)) {
133  if ($rollbackFields !== null) {
134  $diff = $this->historyObject->getDiff($changeLog);
135  GeneralUtility::makeInstance(RecordHistoryRollback::class)->performRollback($rollbackFields, $diff);
136  } elseif ($lastHistoryEntry) {
137  $completeDiff = $this->historyObject->getDiff($changeLog);
138  $this->‪displayMultipleDiff($completeDiff);
139  $button = $buttonBar->makeLinkButton()
140  ->setHref($this->‪buildUrl(['historyEntry' => '']))
141  ->setIcon($this->iconFactory->getIcon('actions-view-go-back', ‪Icon::SIZE_SMALL))
142  ->setTitle($this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:fullView'))
143  ->setShowLabelText(true);
144  $buttonBar->addButton($button);
145  }
146  if ($this->historyObject->getElementString() !== '') {
147  $this->‪displayHistory($changeLog);
148  }
149  }
150 
151  $elementData = $this->historyObject->getElementInformation();
152  $editLock = false;
153  if (!empty($elementData)) {
154  [$elementTable, $elementUid] = $elementData;
155  $this->‪setPagePath($elementTable, $elementUid);
156  $editLock = $this->‪getEditLockFromElement($elementTable, $elementUid);
157  // Get link to page history if the element history is shown
158  if ($elementTable !== 'pages') {
159  $parentPage = BackendUtility::getRecord($elementTable, $elementUid, '*', '', false);
160  if ($parentPage['pid'] > 0 && BackendUtility::readPageAccess($parentPage['pid'], $backendUser->getPagePermsClause(‪Permission::PAGE_SHOW))) {
161  $button = $buttonBar->makeLinkButton()
162  ->setHref($this->‪buildUrl([
163  'element' => 'pages:' . $parentPage['pid'],
164  'historyEntry' => '',
165  ]))
166  ->setIcon($this->iconFactory->getIcon('apps-pagetree-page-default', ‪Icon::SIZE_SMALL))
167  ->setTitle($this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang_show_rechis.xlf:elementHistory_link'))
168  ->setShowLabelText(true);
169  $buttonBar->addButton($button, ‪ButtonBar::BUTTON_POSITION_LEFT, 2);
170  }
171  }
172  }
173 
174  $this->view->assign('editLock', $editLock);
175  $this->view->assign('moduleSettings', $moduleSettings);
176  $this->view->assign('settingsFormUrl', $this->‪buildUrl());
177 
178  // Setting up the buttons and markers for docheader
179  $this->‪getButtons();
180  // Build the <body> for the module
181  $this->moduleTemplate->setContent($this->view->render());
182 
183  return new HtmlResponse($this->moduleTemplate->renderContent());
184  }
185 
192  protected function ‪setPagePath($table, $uid)
193  {
194  $uid = (int)$uid;
195 
196  $record = BackendUtility::getRecord($table, $uid, '*', '', false);
197  if ($table === 'pages') {
198  $pageId = $uid;
199  } else {
200  $pageId = $record['pid'];
201  }
202 
203  $pageAccess = BackendUtility::readPageAccess($pageId, $this->‪getBackendUser()->getPagePermsClause(‪Permission::PAGE_SHOW));
204  if (is_array($pageAccess)) {
205  $this->moduleTemplate->getDocHeaderComponent()->setMetaInformation($pageAccess);
206  }
207  $this->view->assign('recordTable', $this->‪getLanguageService()->sL(‪$GLOBALS['TCA'][$table]['ctrl']['title']));
208  $this->view->assign('recordUid', $uid);
209  }
210 
211  protected function ‪getButtons(): void
212  {
213  $buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar();
214  $helpButton = $buttonBar->makeHelpButton()
215  ->setModuleName('xMOD_csh_corebe')
216  ->setFieldName('history_log');
217  $buttonBar->addButton($helpButton);
218 
219  if ($this->returnUrl) {
220  $backButton = $buttonBar->makeLinkButton()
221  ->setHref($this->returnUrl)
222  ->setTitle($this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:rm.closeDoc'))
223  ->setShowLabelText(true)
224  ->setIcon($this->iconFactory->getIcon('actions-close', ‪Icon::SIZE_SMALL));
225  $buttonBar->addButton($backButton, ‪ButtonBar::BUTTON_POSITION_LEFT, 10);
226  }
227  }
228 
229  protected function ‪processSettings(ServerRequestInterface $request): array
230  {
231  // Get current selection from UC, merge data, write it back to UC
232  $currentSelection = $this->‪getBackendUser()->getModuleData('history');
233  if (!is_array($currentSelection)) {
234  $currentSelection = ['maxSteps' => '', 'showDiff' => 1, 'showSubElements' => 1];
235  }
236  $currentSelectionOverride = $request->getParsedBody()['settings'] ?? null;
237  if (is_array($currentSelectionOverride) && !empty($currentSelectionOverride)) {
238  $currentSelection = array_merge($currentSelection, $currentSelectionOverride);
239  $this->‪getBackendUser()->pushModuleData('history', $currentSelection);
240  }
241  return $currentSelection;
242  }
243 
249  protected function ‪displayMultipleDiff(array $diff)
250  {
251  // Get all array keys needed
253  $arrayKeys = array_merge(array_keys($diff['newData']), array_keys($diff['insertsDeletes']), array_keys($diff['oldData']));
254  $arrayKeys = array_unique($arrayKeys);
255  if (!empty($arrayKeys)) {
256  $lines = [];
257  foreach ($arrayKeys as $key) {
258  $singleLine = [];
259  $elParts = explode(':', $key);
260  // Turn around diff because it should be a "rollback preview"
261  if ((int)($diff['insertsDeletes'][$key] ?? 0) === 1) {
262  // insert
263  $singleLine['insertDelete'] = 'delete';
264  } elseif ((int)($diff['insertsDeletes'][$key] ?? 0) === -1) {
265  $singleLine['insertDelete'] = 'insert';
266  }
267  // Build up temporary diff array
268  // turn around diff because it should be a "rollback preview"
269  if ($diff['newData'][$key] ?? false) {
270  $tmpArr = [
271  'newRecord' => $diff['oldData'][$key],
272  'oldRecord' => $diff['newData'][$key],
273  ];
274  $singleLine['differences'] = $this->‪renderDiff($tmpArr, $elParts[0], (int)$elParts[1], true);
275  }
276  $elParts = explode(':', $key);
277  $singleLine['revertRecordUrl'] = $this->‪buildUrl(['rollbackFields' => $key]);
278  $singleLine['title'] = $this->‪generateTitle($elParts[0], $elParts[1]);
279  $lines[] = $singleLine;
280  }
281  $this->view->assign('revertAllUrl', $this->‪buildUrl(['rollbackFields' => 'ALL']));
282  $this->view->assign('multipleDiff', $lines);
283  }
284  $this->view->assign('showDifferences', true);
285  }
286 
292  protected function ‪displayHistory(array $historyEntries)
293  {
294  if (empty($historyEntries)) {
295  return;
296  }
297  $languageService = $this->‪getLanguageService();
298  $lines = [];
299  $beUserArray = BackendUtility::getUserNames();
300 
301  // Traverse changeLog array:
302  foreach ($historyEntries as $entry) {
303  // Build up single line
304  $singleLine = [];
305 
306  // Get user names
307  $singleLine['backendUserUid'] = $entry['userid'];
308  $singleLine['backendUserName'] = $beUserArray[$entry['userid']]['username'] ?? '';
309  // Executed by switch user
310  if (!empty($entry['originaluserid'])) {
311  $singleLine['originalBackendUserUid'] = $entry['originaluserid'];
312  $singleLine['originalBackendUserName'] = $beUserArray[$entry['originaluserid']]['username'] ?? '';
313  }
314 
315  // Is a change in a workspace?
316  $singleLine['isChangedInWorkspace'] = (int)$entry['workspace'] > 0;
317 
318  // Diff link
319  $singleLine['diffUrl'] = $this->‪buildUrl(['historyEntry' => $entry['uid']]);
320  // Add time
321  $singleLine['time'] = BackendUtility::datetime($entry['tstamp']);
322  // Add age
323  $singleLine['age'] = BackendUtility::calcAge(‪$GLOBALS['EXEC_TIME'] - $entry['tstamp'], $languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.minutesHoursDaysYears'));
324 
325  $singleLine['title'] = $this->‪generateTitle($entry['tablename'], $entry['recuid']);
326  $singleLine['elementUrl'] = $this->‪buildUrl(['element' => $entry['tablename'] . ':' . $entry['recuid']]);
327  $singleLine['actiontype'] = $entry['actiontype'];
328  if ((int)$entry['actiontype'] === ‪RecordHistoryStore::ACTION_MODIFY) {
329  // show changes
330  if (!$this->showDiff) {
331  // Display field names instead of full diff
332  // Re-write field names with labels
334  $tmpFieldList = array_keys($entry['newRecord']);
335  foreach ($tmpFieldList as $key => $value) {
336  $tmp = str_replace(':', '', $languageService->sL(BackendUtility::getItemLabel($entry['tablename'], $value)));
337  if ($tmp) {
338  $tmpFieldList[$key] = $tmp;
339  } else {
340  // remove fields if no label available
341  unset($tmpFieldList[$key]);
342  }
343  }
344  $singleLine['fieldNames'] = implode(',', $tmpFieldList);
345  } else {
346  // Display diff
347  $singleLine['differences'] = $this->‪renderDiff($entry, $entry['tablename']);
348  }
349  }
350  // put line together
351  $lines[] = $singleLine;
352  }
353  $this->view->assign('history', $lines);
354  }
355 
365  protected function ‪renderDiff($entry, $table, $rollbackUid = 0, bool $showRollbackLink = false): array
366  {
367  $lines = [];
368  if (is_array($entry['newRecord'] ?? null)) {
369  /* @var DiffUtility $diffUtility */
370  $diffUtility = GeneralUtility::makeInstance(DiffUtility::class);
371  $diffUtility->stripTags = false;
372  $fieldsToDisplay = array_keys($entry['newRecord']);
373  $languageService = $this->‪getLanguageService();
374  foreach ($fieldsToDisplay as $fN) {
375  if (is_array(‪$GLOBALS['TCA'][$table]['columns'][$fN] ?? null) && (‪$GLOBALS['TCA'][$table]['columns'][$fN]['config']['type'] ?? '') !== 'passthrough') {
376  // Create diff-result:
377  $diffres = $diffUtility->makeDiffDisplay(
378  BackendUtility::getProcessedValue($table, $fN, ($entry['oldRecord'][$fN] ?? ''), 0, true),
379  BackendUtility::getProcessedValue($table, $fN, ($entry['newRecord'][$fN] ?? ''), 0, true)
380  );
381  $rollbackUrl = '';
382  if ($rollbackUid && $showRollbackLink) {
383  $rollbackUrl = $this->‪buildUrl(['rollbackFields' => $table . ':' . $rollbackUid . ':' . $fN]);
384  }
385  $lines[] = [
386  'title' => $languageService->sL(BackendUtility::getItemLabel($table, $fN)),
387  'rollbackUrl' => $rollbackUrl,
388  'result' => str_replace('\n', PHP_EOL, str_replace('\r\n', '\n', $diffres)),
389  ];
390  }
391  }
392  }
393  return $lines;
394  }
395 
402  protected function ‪buildUrl($overrideParameters = []): string
403  {
404  $params = [];
405 
406  // Setting default values based on GET parameters:
407  $elementString = $this->historyObject->getElementString();
408  if ($elementString !== '') {
409  $params['element'] = $elementString;
410  }
411  $params['historyEntry'] = $this->historyObject->getLastHistoryEntryNumber();
412 
413  if (!empty($this->returnUrl)) {
414  $params['returnUrl'] = ‪$this->returnUrl;
415  }
416 
417  // Merging overriding values:
418  $params = array_merge($params, $overrideParameters);
419 
420  // Make the link:
421  return (string)$this->uriBuilder->buildUriFromRoute('record_history', $params);
422  }
423 
431  protected function ‪generateTitle($table, $uid): string
432  {
433  $title = $table . ':' . $uid;
434  if (!empty(‪$GLOBALS['TCA'][$table]['ctrl']['label'])) {
435  $record = $this->‪getRecord($table, (int)$uid) ?? [];
436  $title .= ' (' . BackendUtility::getRecordTitle($table, $record, true) . ')';
437  }
438  return $title;
439  }
440 
448  protected function ‪getRecord($table, $uid)
449  {
450  if (!isset($this->recordCache[$table][$uid])) {
451  $this->recordCache[$table][$uid] = BackendUtility::getRecord($table, $uid, '*', '', false);
452  }
453  return $this->recordCache[$table][$uid];
454  }
455 
461  protected function ‪initializeView()
462  {
463  ‪$view = GeneralUtility::makeInstance(StandaloneView::class);
464  ‪$view->‪setLayoutRootPaths([GeneralUtility::getFileAbsFileName('EXT:backend/Resources/Private/Layouts')]);
465  ‪$view->‪setPartialRootPaths([GeneralUtility::getFileAbsFileName('EXT:backend/Resources/Private/Partials')]);
466  ‪$view->‪setTemplateRootPaths([GeneralUtility::getFileAbsFileName('EXT:backend/Resources/Private/Templates')]);
467 
468  ‪$view->‪setTemplatePathAndFilename(GeneralUtility::getFileAbsFileName('EXT:backend/Resources/Private/Templates/RecordHistory/Main.html'));
469 
471  return ‪$view;
472  }
473 
475  {
476  return ‪$GLOBALS['LANG'];
477  }
478 
479  protected function ‪getBackendUser(): ‪BackendUserAuthentication
480  {
481  return ‪$GLOBALS['BE_USER'];
482  }
483 
492  protected function ‪getEditLockFromElement($tableName, $elementUid): bool
493  {
494  // If the user is admin, then he may always edit the page.
495  if ($this->‪getBackendUser()->isAdmin()) {
496  return false;
497  }
498 
499  // Early return if $elementUid is zero
500  if ((int)$elementUid === 0) {
501  return !(‪$GLOBALS['TCA'][$tableName]['ctrl']['security']['ignoreRootLevelRestriction'] ?? false);
502  }
503 
504  $record = BackendUtility::getRecord($tableName, $elementUid, '*', '', false);
505  // we need the parent page record for the editlock info if element isn't a page
506  if ($tableName !== 'pages') {
507  $pageId = $record['pid'];
508  $record = BackendUtility::getRecord('pages', $pageId, '*', '', false);
509  }
510 
511  return (bool)$record['editlock'];
512  }
513 }
‪TYPO3\CMS\Core\Utility\DiffUtility
Definition: DiffUtility.php:25
‪TYPO3\CMS\Core\Imaging\Icon\SIZE_SMALL
‪const SIZE_SMALL
Definition: Icon.php:30
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\getLanguageService
‪getLanguageService()
Definition: ElementHistoryController.php:469
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\getBackendUser
‪getBackendUser()
Definition: ElementHistoryController.php:474
‪TYPO3\CMS\Backend\Template\Components\ButtonBar\BUTTON_POSITION_LEFT
‪const BUTTON_POSITION_LEFT
Definition: ButtonBar.php:36
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\renderDiff
‪array renderDiff($entry, $table, $rollbackUid=0, bool $showRollbackLink=false)
Definition: ElementHistoryController.php:360
‪TYPO3\CMS\Backend\Template\Components\ButtonBar
Definition: ButtonBar.php:32
‪TYPO3\CMS\Core\Imaging\Icon
Definition: Icon.php:26
‪TYPO3\CMS\Backend\Template\ModuleTemplateFactory
Definition: ModuleTemplateFactory.php:29
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\getRecord
‪array null getRecord($table, $uid)
Definition: ElementHistoryController.php:443
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$view
‪StandaloneView $view
Definition: ElementHistoryController.php:47
‪TYPO3\CMS\Backend\Controller\ContentElement
Definition: ElementHistoryController.php:16
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\__construct
‪__construct(IconFactory $iconFactory, UriBuilder $uriBuilder, ModuleTemplateFactory $moduleTemplateFactory)
Definition: ElementHistoryController.php:78
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$moduleTemplate
‪ModuleTemplate $moduleTemplate
Definition: ElementHistoryController.php:67
‪TYPO3\CMS\Backend\History\RecordHistoryRollback
Definition: RecordHistoryRollback.php:29
‪TYPO3\CMS\Core\DataHandling\History\RecordHistoryStore\ACTION_MODIFY
‪const ACTION_MODIFY
Definition: RecordHistoryStore.php:33
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\initializeView
‪StandaloneView initializeView()
Definition: ElementHistoryController.php:456
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$returnUrl
‪string $returnUrl
Definition: ElementHistoryController.php:72
‪TYPO3\CMS\Core\Imaging\IconFactory
Definition: IconFactory.php:34
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\generateTitle
‪string generateTitle($table, $uid)
Definition: ElementHistoryController.php:426
‪TYPO3\CMS\Backend\Template\ModuleTemplate
Definition: ModuleTemplate.php:46
‪TYPO3\CMS\Core\Type\Bitmask\Permission
Definition: Permission.php:26
‪TYPO3\CMS\Fluid\View\StandaloneView\getRequest
‪TYPO3 CMS Extbase Mvc Request getRequest()
Definition: StandaloneView.php:93
‪TYPO3\CMS\Core\DataHandling\History\RecordHistoryStore
Definition: RecordHistoryStore.php:31
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\setPagePath
‪setPagePath($table, $uid)
Definition: ElementHistoryController.php:187
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\mainAction
‪ResponseInterface mainAction(ServerRequestInterface $request)
Definition: ElementHistoryController.php:96
‪TYPO3\CMS\Backend\History\RecordHistory
Definition: RecordHistory.php:32
‪TYPO3\CMS\Backend\Routing\UriBuilder
Definition: UriBuilder.php:40
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController
Definition: ElementHistoryController.php:44
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$showDiff
‪bool $showDiff
Definition: ElementHistoryController.php:57
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\buildUrl
‪string buildUrl($overrideParameters=[])
Definition: ElementHistoryController.php:397
‪TYPO3\CMS\Extbase\Mvc\Request\setControllerExtensionName
‪setControllerExtensionName($controllerExtensionName)
Definition: Request.php:305
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setTemplatePathAndFilename
‪setTemplatePathAndFilename($templatePathAndFilename)
Definition: AbstractTemplateView.php:113
‪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\Backend\Controller\ContentElement\ElementHistoryController\processSettings
‪processSettings(ServerRequestInterface $request)
Definition: ElementHistoryController.php:224
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$recordCache
‪array $recordCache
Definition: ElementHistoryController.php:61
‪TYPO3\CMS\Fluid\View\StandaloneView
Definition: StandaloneView.php:31
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\getButtons
‪getButtons()
Definition: ElementHistoryController.php:206
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\displayHistory
‪displayHistory(array $historyEntries)
Definition: ElementHistoryController.php:287
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$iconFactory
‪IconFactory $iconFactory
Definition: ElementHistoryController.php:74
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setLayoutRootPaths
‪setLayoutRootPaths(array $layoutRootPaths)
Definition: AbstractTemplateView.php:177
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:42
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setPartialRootPaths
‪setPartialRootPaths(array $partialRootPaths)
Definition: AbstractTemplateView.php:144
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\getEditLockFromElement
‪bool getEditLockFromElement($tableName, $elementUid)
Definition: ElementHistoryController.php:487
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$historyObject
‪RecordHistory $historyObject
Definition: ElementHistoryController.php:51
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$moduleTemplateFactory
‪ModuleTemplateFactory $moduleTemplateFactory
Definition: ElementHistoryController.php:76
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\displayMultipleDiff
‪displayMultipleDiff(array $diff)
Definition: ElementHistoryController.php:244
‪TYPO3\CMS\Core\Http\HtmlResponse
Definition: HtmlResponse.php:26
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setTemplateRootPaths
‪setTemplateRootPaths(array $templateRootPaths)
Definition: AbstractTemplateView.php:124
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$uriBuilder
‪UriBuilder $uriBuilder
Definition: ElementHistoryController.php:75