‪TYPO3CMS  10.4
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;
33 
40 {
44  protected ‪$view;
45 
49  protected ‪$historyObject;
50 
56  protected ‪$showDiff = 1;
57 
61  protected ‪$recordCache = [];
62 
68  protected ‪$moduleTemplate;
69 
75  protected ‪$editLock = false;
76 
80  public function ‪__construct()
81  {
82  $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
83  $this->view = $this->‪initializeView();
84  }
85 
93  public function ‪mainAction(ServerRequestInterface $request): ResponseInterface
94  {
95  $this->moduleTemplate->getDocHeaderComponent()->setMetaInformation([]);
96 
97  $parsedBody = $request->getParsedBody();
98  $queryParams = $request->getQueryParams();
99  $lastHistoryEntry = (int)($parsedBody['historyEntry'] ?? $queryParams['historyEntry'] ?? 0);
100  $rollbackFields = $parsedBody['rollbackFields'] ?? $queryParams['rollbackFields'] ?? null;
101  $element = $parsedBody['element'] ?? $queryParams['element'] ?? null;
102  $displaySettings = $this->‪prepareDisplaySettings($request);
103  $this->view->assign('currentSelection', $displaySettings);
104 
105  $this->showDiff = (int)$displaySettings['showDiff'];
106 
107  // Start history object
108  $this->historyObject = GeneralUtility::makeInstance(RecordHistory::class, $element, $rollbackFields);
109  $this->historyObject->setShowSubElements((int)$displaySettings['showSubElements']);
110  $this->historyObject->setLastHistoryEntryNumber($lastHistoryEntry);
111  if ($displaySettings['maxSteps']) {
112  $this->historyObject->setMaxSteps((int)$displaySettings['maxSteps']);
113  }
114 
115  // Do the actual logic now (rollback, show a diff for certain changes,
116  // or show the full history of a page or a specific record)
117  $changeLog = $this->historyObject->getChangeLog();
118  if (!empty($changeLog)) {
119  if ($rollbackFields !== null) {
120  GeneralUtility::makeInstance(RecordHistoryRollback::class)
121  ->performRollback($rollbackFields, $this->historyObject->getDiff($changeLog));
122  $this->historyObject->legacyUpdates();
123  } elseif ($lastHistoryEntry) {
124  $completeDiff = $this->historyObject->getDiff($changeLog);
125  $this->‪displayMultipleDiff($completeDiff);
126  $this->view->assign('showDifferences', true);
127  $this->view->assign('fullViewUrl', $this->‪buildUrl(['historyEntry' => '']));
128  }
129  if ($this->historyObject->getElementString() !== '') {
130  $this->‪displayHistory($changeLog);
131  }
132  }
133 
135  $normalizedParams = $request->getAttribute('normalizedParams');
136  $elementData = $this->historyObject->getElementInformation();
137  if (!empty($elementData)) {
138  $this->‪setPagePath($elementData[0], $elementData[1]);
139  $this->editLock = $this->‪getEditLockFromElement($elementData[0], $elementData[1]);
140  // Get link to page history if the element history is shown
141  if ($elementData[0] !== 'pages') {
142  $this->view->assign('singleElement', true);
143  $parentPage = ‪BackendUtility::getRecord($elementData[0], $elementData[1], '*', '', false);
144  if ($parentPage['pid'] > 0 && ‪BackendUtility::readPageAccess($parentPage['pid'], $this->‪getBackendUser()->getPagePermsClause(‪Permission::PAGE_SHOW))) {
145  $this->view->assign('fullHistoryUrl', $this->‪buildUrl([
146  'element' => 'pages:' . $parentPage['pid'],
147  'historyEntry' => '',
148  'returnUrl' => $normalizedParams->getRequestUri(),
149  ]));
150  }
151  }
152  }
153 
154  $this->view->assign('editLock', $this->editLock);
155 
156  // Setting up the buttons and markers for docheader
157  $this->‪getButtons($request);
158  // Build the <body> for the module
159  $this->moduleTemplate->setContent($this->view->render());
160 
161  return new HtmlResponse($this->moduleTemplate->renderContent());
162  }
163 
170  protected function ‪setPagePath($table, $uid)
171  {
172  $uid = (int)$uid;
173 
174  if ($table === 'pages') {
175  $pageId = $uid;
176  } else {
177  $record = ‪BackendUtility::getRecord($table, $uid, '*', '', false);
178  $pageId = $record['pid'];
179  }
180 
181  $pageAccess = ‪BackendUtility::readPageAccess($pageId, $this->‪getBackendUser()->getPagePermsClause(‪Permission::PAGE_SHOW));
182  if (is_array($pageAccess)) {
183  $this->moduleTemplate->getDocHeaderComponent()->setMetaInformation($pageAccess);
184  }
185  }
186 
192  protected function ‪getButtons(ServerRequestInterface $request)
193  {
194  $buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar();
195 
196  $helpButton = $buttonBar->makeHelpButton()
197  ->setModuleName('xMOD_csh_corebe')
198  ->setFieldName('history_log');
199  $buttonBar->addButton($helpButton);
200 
201  // Get returnUrl parameter
202  $parsedBody = $request->getParsedBody();
203  $queryParams = $request->getQueryParams();
204  $returnUrl = GeneralUtility::sanitizeLocalUrl($parsedBody['returnUrl'] ?? $queryParams['returnUrl'] ?? '');
205 
206  if ($returnUrl) {
207  $backButton = $buttonBar->makeLinkButton()
208  ->setHref($returnUrl)
209  ->setTitle($this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:rm.closeDoc'))
210  ->setIcon($this->moduleTemplate->getIconFactory()->getIcon('actions-view-go-back', ‪Icon::SIZE_SMALL));
211  $buttonBar->addButton($backButton, ‪ButtonBar::BUTTON_POSITION_LEFT, 10);
212  }
213  }
214 
221  protected function ‪prepareDisplaySettings(ServerRequestInterface $request)
222  {
223  $selector = [];
224  // Get current selection from UC, merge data, write it back to UC
225  $currentSelection = is_array($this->‪getBackendUser()->uc['moduleData']['history'])
226  ? $this->‪getBackendUser()->uc['moduleData']['history']
227  : ['maxSteps' => '', 'showDiff' => 1, 'showSubElements' => 1];
228  $parsedBody = $request->getParsedBody();
229  $queryParams = $request->getQueryParams();
230  $currentSelectionOverride = $parsedBody['settings'] ?? $queryParams['settings'] ?? null;
231 
232  if (is_array($currentSelectionOverride) && !empty($currentSelectionOverride)) {
233  $currentSelection = array_merge($currentSelection, $currentSelectionOverride);
234  $this->‪getBackendUser()->uc['moduleData']['history'] = $currentSelection;
235  $this->‪getBackendUser()->‪writeUC($this->‪getBackendUser()->uc);
236  }
237 
238  // Display selector for number of history entries
239  $selector['maxSteps'] = [
240  10 => [
241  'value' => 10
242  ],
243  20 => [
244  'value' => 20
245  ],
246  50 => [
247  'value' => 50
248  ],
249  100 => [
250  'value' => 100
251  ],
252  999 => [
253  'value' => 'maxSteps_all'
254  ]
255  ];
256  $selector['showDiff'] = [
257  0 => [
258  'value' => 'showDiff_no'
259  ],
260  1 => [
261  'value' => 'showDiff_inline'
262  ]
263  ];
264  $selector['showSubElements'] = [
265  0 => [
266  'value' => 'no'
267  ],
268  1 => [
269  'value' => 'yes'
270  ]
271  ];
272 
273  $scriptUrl = GeneralUtility::linkThisScript();
274 
275  foreach ($selector as $key => $values) {
276  foreach ($values as $singleKey => $singleVal) {
277  $selector[$key][$singleKey]['scriptUrl'] = $scriptUrl . '&settings[' . $key . ']=' . $singleKey;
278  }
279  }
280  $this->view->assign('settings', $selector);
281  return $currentSelection;
282  }
283 
289  protected function ‪displayMultipleDiff(array $diff)
290  {
291  // Get all array keys needed
293  $arrayKeys = array_merge(array_keys($diff['newData']), array_keys($diff['insertsDeletes']), array_keys($diff['oldData']));
294  $arrayKeys = array_unique($arrayKeys);
295  if (!empty($arrayKeys)) {
296  $lines = [];
297  foreach ($arrayKeys as $key) {
298  $singleLine = [];
299  $elParts = explode(':', $key);
300  // Turn around diff because it should be a "rollback preview"
301  if ((int)$diff['insertsDeletes'][$key] === 1) {
302  // insert
303  $singleLine['insertDelete'] = 'delete';
304  } elseif ((int)$diff['insertsDeletes'][$key] === -1) {
305  $singleLine['insertDelete'] = 'insert';
306  }
307  // Build up temporary diff array
308  // turn around diff because it should be a "rollback preview"
309  if ($diff['newData'][$key]) {
310  $tmpArr = [
311  'newRecord' => $diff['oldData'][$key],
312  'oldRecord' => $diff['newData'][$key]
313  ];
314  $singleLine['differences'] = $this->‪renderDiff($tmpArr, $elParts[0], (int)$elParts[1]);
315  }
316  $elParts = explode(':', $key);
317  $singleLine['revertRecordUrl'] = $this->‪buildUrl(['rollbackFields' => $key]);
318  $singleLine['title'] = $this->‪generateTitle($elParts[0], $elParts[1]);
319  $lines[] = $singleLine;
320  }
321  $this->view->assign('revertAllUrl', $this->‪buildUrl(['rollbackFields' => 'ALL']));
322  $this->view->assign('multipleDiff', $lines);
323  }
324  }
325 
331  protected function ‪displayHistory(array $historyEntries)
332  {
333  if (empty($historyEntries)) {
334  return;
335  }
336  $languageService = $this->‪getLanguageService();
337  $lines = [];
338  $beUserArray = ‪BackendUtility::getUserNames();
339 
340  // Traverse changeLog array:
341  foreach ($historyEntries as $entry) {
342  // Build up single line
343  $singleLine = [];
344 
345  // Get user names
346  $singleLine['backendUserUid'] = $entry['userid'];
347  $singleLine['backendUserName'] = $entry['userid'] ? $beUserArray[$entry['userid']]['username'] : '';
348  // Executed by switch user
349  if (!empty($entry['originaluserid'])) {
350  $singleLine['originalBackendUserName'] = $beUserArray[$entry['originaluserid']]['username'];
351  }
352 
353  // Diff link
354  $singleLine['diffUrl'] = $this->‪buildUrl(['historyEntry' => $entry['uid']]);
355  // Add time
356  $singleLine['time'] = ‪BackendUtility::datetime($entry['tstamp']);
357  // Add age
358  $singleLine['age'] = ‪BackendUtility::calcAge(‪$GLOBALS['EXEC_TIME'] - $entry['tstamp'], $languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.minutesHoursDaysYears'));
359 
360  $singleLine['title'] = $this->‪generateTitle($entry['tablename'], $entry['recuid']);
361  $singleLine['elementUrl'] = $this->‪buildUrl(['element' => $entry['tablename'] . ':' . $entry['recuid']]);
362  $singleLine['actiontype'] = $entry['actiontype'];
363  if ((int)$entry['actiontype'] === ‪RecordHistoryStore::ACTION_MODIFY) {
364  // show changes
365  if (!$this->showDiff) {
366  // Display field names instead of full diff
367  // Re-write field names with labels
369  $tmpFieldList = array_keys($entry['newRecord']);
370  foreach ($tmpFieldList as $key => $value) {
371  $tmp = str_replace(':', '', $languageService->sL(‪BackendUtility::getItemLabel($entry['tablename'], $value)));
372  if ($tmp) {
373  $tmpFieldList[$key] = $tmp;
374  } else {
375  // remove fields if no label available
376  unset($tmpFieldList[$key]);
377  }
378  }
379  $singleLine['fieldNames'] = implode(',', $tmpFieldList);
380  } else {
381  // Display diff
382  $singleLine['differences'] = $this->‪renderDiff($entry, $entry['tablename']);
383  }
384  }
385  // put line together
386  $lines[] = $singleLine;
387  }
388  $this->view->assign('history', $lines);
389  }
390 
399  protected function ‪renderDiff($entry, $table, $rollbackUid = 0): array
400  {
401  $lines = [];
402  if (is_array($entry['newRecord'])) {
403  /* @var DiffUtility $diffUtility */
404  $diffUtility = GeneralUtility::makeInstance(DiffUtility::class);
405  $diffUtility->stripTags = false;
406  $fieldsToDisplay = array_keys($entry['newRecord']);
407  $languageService = $this->‪getLanguageService();
408  foreach ($fieldsToDisplay as $fN) {
409  if (is_array(‪$GLOBALS['TCA'][$table]['columns'][$fN]) && ‪$GLOBALS['TCA'][$table]['columns'][$fN]['config']['type'] !== 'passthrough') {
410  // Create diff-result:
411  $diffres = $diffUtility->makeDiffDisplay(
412  ‪BackendUtility::getProcessedValue($table, $fN, $entry['oldRecord'][$fN], 0, true),
413  ‪BackendUtility::getProcessedValue($table, $fN, $entry['newRecord'][$fN], 0, true)
414  );
415  $rollbackUrl = '';
416  if ($rollbackUid) {
417  $rollbackUrl = $this->‪buildUrl(['rollbackFields' => $table . ':' . $rollbackUid . ':' . $fN]);
418  }
419  $lines[] = [
420  'title' => $languageService->sL(‪BackendUtility::getItemLabel($table, $fN)),
421  'rollbackUrl' => $rollbackUrl,
422  'result' => str_replace('\n', PHP_EOL, str_replace('\r\n', '\n', $diffres))
423  ];
424  }
425  }
426  }
427  return $lines;
428  }
429 
436  protected function ‪buildUrl($overrideParameters = []): string
437  {
438  $params = [];
439 
440  // Setting default values based on GET parameters:
441  $elementString = $this->historyObject->getElementString();
442  if ($elementString !== '') {
443  $params['element'] = $elementString;
444  }
445  $params['historyEntry'] = $this->historyObject->getLastHistoryEntryNumber();
446 
447  // Merging overriding values:
448  $params = array_merge($params, $overrideParameters);
449 
450  // Make the link:
451  $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
452  return (string)$uriBuilder->buildUriFromRoute('record_history', $params);
453  }
454 
462  protected function ‪generateTitle($table, $uid): string
463  {
464  $title = $table . ':' . $uid;
465  if (!empty(‪$GLOBALS['TCA'][$table]['ctrl']['label'])) {
466  $record = $this->‪getRecord($table, (int)$uid) ?? [];
467  $title .= ' (' . ‪BackendUtility::getRecordTitle($table, $record, true) . ')';
468  }
469  return $title;
470  }
471 
479  protected function ‪getRecord($table, $uid)
480  {
481  if (!isset($this->recordCache[$table][$uid])) {
482  $this->recordCache[$table][$uid] = ‪BackendUtility::getRecord($table, $uid, '*', '', false);
483  }
484  return $this->recordCache[$table][$uid];
485  }
486 
492  protected function ‪initializeView()
493  {
495  ‪$view = GeneralUtility::makeInstance(StandaloneView::class);
496  ‪$view->‪setLayoutRootPaths([GeneralUtility::getFileAbsFileName('EXT:backend/Resources/Private/Layouts')]);
497  ‪$view->‪setPartialRootPaths([GeneralUtility::getFileAbsFileName('EXT:backend/Resources/Private/Partials')]);
498  ‪$view->‪setTemplateRootPaths([GeneralUtility::getFileAbsFileName('EXT:backend/Resources/Private/Templates')]);
499 
500  ‪$view->‪setTemplatePathAndFilename(GeneralUtility::getFileAbsFileName('EXT:backend/Resources/Private/Templates/RecordHistory/Main.html'));
501 
503  return ‪$view;
504  }
505 
511  protected function ‪getLanguageService()
512  {
513  return ‪$GLOBALS['LANG'];
514  }
515 
521  protected function ‪getBackendUser()
522  {
523  return ‪$GLOBALS['BE_USER'];
524  }
525 
534  protected function ‪getEditLockFromElement($tableName, $elementUid): bool
535  {
536  // If the user is admin, then he may always edit the page.
537  if ($this->‪getBackendUser()->isAdmin()) {
538  return false;
539  }
540 
541  $record = ‪BackendUtility::getRecord($tableName, $elementUid, '*', '', false);
542  // we need the parent page record for the editlock info if element isn't a page
543  if ($tableName !== 'pages') {
544  $pageId = $record['pid'];
545  $record = ‪BackendUtility::getRecord('pages', $pageId, '*', '', false);
546  }
547 
548  return (bool)$record['editlock'];
549  }
550 }
‪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\Template\Components\ButtonBar\BUTTON_POSITION_LEFT
‪const BUTTON_POSITION_LEFT
Definition: ButtonBar.php:36
‪TYPO3\CMS\Backend\Template\Components\ButtonBar
Definition: ButtonBar.php:32
‪TYPO3\CMS\Core\Authentication\AbstractUserAuthentication\writeUC
‪writeUC($variable='')
Definition: AbstractUserAuthentication.php:1120
‪TYPO3\CMS\Backend\Utility\BackendUtility\datetime
‪static string datetime($value)
Definition: BackendUtility.php:989
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\prepareDisplaySettings
‪array prepareDisplaySettings(ServerRequestInterface $request)
Definition: ElementHistoryController.php:215
‪TYPO3\CMS\Core\Imaging\Icon
Definition: Icon.php:26
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\getRecord
‪array null getRecord($table, $uid)
Definition: ElementHistoryController.php:473
‪TYPO3\CMS\Backend\Utility\BackendUtility\calcAge
‪static string calcAge($seconds, $labels='min|hrs|days|yrs|min|hour|day|year')
Definition: BackendUtility.php:1017
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$view
‪StandaloneView $view
Definition: ElementHistoryController.php:43
‪TYPO3\CMS\Backend\Controller\ContentElement
Definition: ElementHistoryController.php:16
‪TYPO3\CMS\Backend\Utility\BackendUtility\getItemLabel
‪static string getItemLabel($table, $col)
Definition: BackendUtility.php:1521
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$moduleTemplate
‪ModuleTemplate $moduleTemplate
Definition: ElementHistoryController.php:63
‪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:486
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\generateTitle
‪string generateTitle($table, $uid)
Definition: ElementHistoryController.php:456
‪TYPO3\CMS\Backend\Utility\BackendUtility\getUserNames
‪static array getUserNames($fields='username, usergroup, usergroup_cached_list, uid', $where='')
Definition: BackendUtility.php:818
‪TYPO3\CMS\Backend\Template\ModuleTemplate
Definition: ModuleTemplate.php:43
‪TYPO3\CMS\Core\Type\Bitmask\Permission
Definition: Permission.php:24
‪TYPO3\CMS\Fluid\View\StandaloneView\getRequest
‪TYPO3 CMS Extbase Mvc Request getRequest()
Definition: StandaloneView.php:116
‪TYPO3\CMS\Core\DataHandling\History\RecordHistoryStore
Definition: RecordHistoryStore.php:31
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\getBackendUser
‪TYPO3 CMS Core Authentication BackendUserAuthentication getBackendUser()
Definition: ElementHistoryController.php:515
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\renderDiff
‪array renderDiff($entry, $table, $rollbackUid=0)
Definition: ElementHistoryController.php:393
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\getButtons
‪getButtons(ServerRequestInterface $request)
Definition: ElementHistoryController.php:186
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\setPagePath
‪setPagePath($table, $uid)
Definition: ElementHistoryController.php:164
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\mainAction
‪ResponseInterface mainAction(ServerRequestInterface $request)
Definition: ElementHistoryController.php:87
‪TYPO3\CMS\Backend\History\RecordHistory
Definition: RecordHistory.php:33
‪TYPO3\CMS\Backend\Routing\UriBuilder
Definition: UriBuilder.php:38
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController
Definition: ElementHistoryController.php:40
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\buildUrl
‪string buildUrl($overrideParameters=[])
Definition: ElementHistoryController.php:430
‪TYPO3\CMS\Backend\Utility\BackendUtility\getRecordTitle
‪static string getRecordTitle($table, $row, $prep=false, $forceResult=true)
Definition: BackendUtility.php:1541
‪TYPO3\CMS\Extbase\Mvc\Request\setControllerExtensionName
‪setControllerExtensionName($controllerExtensionName)
Definition: Request.php:193
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setTemplatePathAndFilename
‪setTemplatePathAndFilename($templatePathAndFilename)
Definition: AbstractTemplateView.php:103
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$editLock
‪bool $editLock
Definition: ElementHistoryController.php:69
‪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\Backend\Utility\BackendUtility\getRecord
‪static array null getRecord($table, $uid, $fields=' *', $where='', $useDeleteClause=true)
Definition: BackendUtility.php:95
‪TYPO3\CMS\Backend\Utility\BackendUtility\readPageAccess
‪static array false readPageAccess($id, $perms_clause)
Definition: BackendUtility.php:597
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$recordCache
‪array $recordCache
Definition: ElementHistoryController.php:57
‪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:1664
‪TYPO3\CMS\Fluid\View\StandaloneView
Definition: StandaloneView.php:34
‪$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:325
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$showDiff
‪int $showDiff
Definition: ElementHistoryController.php:53
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\getLanguageService
‪TYPO3 CMS Core Localization LanguageService getLanguageService()
Definition: ElementHistoryController.php:505
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setLayoutRootPaths
‪setLayoutRootPaths(array $layoutRootPaths)
Definition: AbstractTemplateView.php:167
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setPartialRootPaths
‪setPartialRootPaths(array $partialRootPaths)
Definition: AbstractTemplateView.php:134
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\getEditLockFromElement
‪bool getEditLockFromElement($tableName, $elementUid)
Definition: ElementHistoryController.php:528
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:46
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\$historyObject
‪RecordHistory $historyObject
Definition: ElementHistoryController.php:47
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\displayMultipleDiff
‪displayMultipleDiff(array $diff)
Definition: ElementHistoryController.php:283
‪TYPO3\CMS\Backend\Controller\ContentElement\ElementHistoryController\__construct
‪__construct()
Definition: ElementHistoryController.php:74
‪TYPO3\CMS\Core\Http\HtmlResponse
Definition: HtmlResponse.php:26
‪TYPO3\CMS\Fluid\View\AbstractTemplateView\setTemplateRootPaths
‪setTemplateRootPaths(array $templateRootPaths)
Definition: AbstractTemplateView.php:114