‪TYPO3CMS  11.5
RemoteServer.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 
21 use TYPO3\CMS\Backend\Utility\BackendUtility;
31 use ‪TYPO3\CMS\Core\SysLog\Action\Database as DatabaseAction;
43 
49 {
50  use ‪LogDataTrait;
51 
55  protected ‪$gridDataService;
56 
60  protected ‪$stagesService;
61 
66 
70  protected ‪$differenceHandler;
71 
72  public function ‪__construct()
73  {
74  $this->workspaceService = GeneralUtility::makeInstance(WorkspaceService::class);
75  $this->gridDataService = GeneralUtility::makeInstance(GridDataService::class);
76  $this->stagesService = GeneralUtility::makeInstance(StagesService::class);
77  }
78 
85  public function ‪checkIntegrity(\stdClass $parameters)
86  {
87  $integrity = $this->‪createIntegrityService($this->‪getAffectedElements($parameters));
88  $integrity->check();
89  $response = [
90  'result' => $integrity->getStatusRepresentation(),
91  ];
92  return $response;
93  }
94 
101  public function ‪getWorkspaceInfos($parameter)
102  {
103  // To avoid too much work we use -1 to indicate that every page is relevant
104  $pageId = $parameter->id > 0 ? $parameter->id : -1;
105  if (!isset($parameter->language) || !‪MathUtility::canBeInterpretedAsInteger($parameter->language)) {
106  $parameter->language = null;
107  }
108  if (!isset($parameter->stage) || !‪MathUtility::canBeInterpretedAsInteger($parameter->stage)) {
109  // -99 disables stage filtering
110  $parameter->stage = -99;
111  }
112  $versions = $this->workspaceService->selectVersionsInWorkspace(
113  $this->‪getCurrentWorkspace(),
114  $parameter->stage,
115  $pageId,
116  $parameter->depth,
117  'tables_select',
118  $parameter->language
119  );
120  $data = $this->gridDataService->generateGridListFromVersions($versions, $parameter, $this->‪getCurrentWorkspace());
121  return $data;
122  }
123 
130  public function ‪getRowDetails($parameter)
131  {
132  $diffReturnArray = [];
133  $liveReturnArray = [];
134  $diffUtility = $this->‪getDifferenceHandler();
135  $liveRecord = (array)BackendUtility::getRecord($parameter->table, $parameter->t3ver_oid);
136  $versionRecord = (array)BackendUtility::getRecord($parameter->table, $parameter->uid);
137  $versionState = ‪VersionState::cast((int)($versionRecord['t3ver_state'] ?? 0));
138  $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
139  $icon_Live = $iconFactory->getIconForRecord($parameter->table, $liveRecord, ‪Icon::SIZE_SMALL)->getIdentifier();
140  $icon_Workspace = $iconFactory->getIconForRecord($parameter->table, $versionRecord, ‪Icon::SIZE_SMALL)->getIdentifier();
141  $stagePosition = $this->stagesService->getPositionOfCurrentStage($parameter->stage);
142  $fieldsOfRecords = array_keys($liveRecord);
143  $isNewOrDeletePlaceholder = $versionState->equals(‪VersionState::NEW_PLACEHOLDER) || $versionState->equals(‪VersionState::DELETE_PLACEHOLDER);
144  $suitableFields = ($isNewOrDeletePlaceholder && ($parameter->filterFields ?? false)) ? array_flip($this->‪getSuitableFields($parameter->table, $parameter->t3ver_oid)) : [];
145  foreach ($fieldsOfRecords as $fieldName) {
146  if (
147  empty(‪$GLOBALS['TCA'][$parameter->table]['columns'][$fieldName]['config'])
148  ) {
149  continue;
150  }
151  // Disable internal fields
152  if ((‪$GLOBALS['TCA'][$parameter->table]['ctrl']['transOrigDiffSourceField'] ?? '') === $fieldName) {
153  continue;
154  }
155  if ((‪$GLOBALS['TCA'][$parameter->table]['ctrl']['origUid'] ?? '') === $fieldName) {
156  continue;
157  }
158  // Get the field's label. If not available, use the field name
159  $fieldTitle = $this->‪getLanguageService()->sL(BackendUtility::getItemLabel($parameter->table, $fieldName));
160  if (empty($fieldTitle)) {
161  $fieldTitle = $fieldName;
162  }
163  // Gets the TCA configuration for the current field
164  $configuration = ‪$GLOBALS['TCA'][$parameter->table]['columns'][$fieldName]['config'];
165  // check for exclude fields
166  $isFieldExcluded = (bool)(‪$GLOBALS['TCA'][$parameter->table]['columns'][$fieldName]['exclude'] ?? false);
167  if ($this->‪getBackendUser()->isAdmin() || !$isFieldExcluded || GeneralUtility::inList($this->‪getBackendUser()->groupData['non_exclude_fields'], $parameter->table . ':' . $fieldName)) {
168  // call diff class only if there is a difference
169  if ($configuration['type'] === 'inline' && $configuration['foreign_table'] === 'sys_file_reference') {
170  $useThumbnails = false;
171  if (!empty($configuration['overrideChildTca']['columns']['uid_local']['config']['appearance']['elementBrowserAllowed']) && !empty(‪$GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'])) {
172  $fileExtensions = ‪GeneralUtility::trimExplode(',', ‪$GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'], true);
173  $allowedExtensions = ‪GeneralUtility::trimExplode(',', $configuration['overrideChildTca']['columns']['uid_local']['config']['appearance']['elementBrowserAllowed'], true);
174  $differentExtensions = array_diff($allowedExtensions, $fileExtensions);
175  $useThumbnails = empty($differentExtensions);
176  }
177 
178  $liveFileReferences = (array)BackendUtility::resolveFileReferences(
179  $parameter->table,
180  $fieldName,
181  $liveRecord,
182  0
183  );
184  $versionFileReferences = (array)BackendUtility::resolveFileReferences(
185  $parameter->table,
186  $fieldName,
187  $versionRecord,
188  $this->getCurrentWorkspace()
189  );
190  $fileReferenceDifferences = $this->prepareFileReferenceDifferences(
191  $liveFileReferences,
192  $versionFileReferences,
193  $useThumbnails
194  );
195 
196  if ($fileReferenceDifferences === null) {
197  continue;
198  }
199 
200  $diffReturnArray[] = [
201  'field' => $fieldName,
202  'label' => $fieldTitle,
203  'content' => $fileReferenceDifferences['differences'],
204  ];
205  $liveReturnArray[] = [
206  'field' => $fieldName,
207  'label' => $fieldTitle,
208  'content' => $fileReferenceDifferences['live'],
209  ];
210  } elseif ($isNewOrDeletePlaceholder && isset($suitableFields[$fieldName])) {
211  // If this is a new or delete placeholder, add diff view for all appropriate fields
212  $newOrDeleteRecord[$fieldName] = BackendUtility::getProcessedValue(
213  $parameter->table,
214  $fieldName,
215  $liveRecord[$fieldName], // Both (live and version) values are the same
216  0,
217  true,
218  false,
219  $liveRecord['uid'] // Relations of new/delete placeholder do always contain the live uid
220  ) ?? '';
221 
222  // Don't add empty fields
223  if ($newOrDeleteRecord[$fieldName] === '') {
224  continue;
225  }
226 
227  $diffReturnArray[] = [
228  'field' => $fieldName,
229  'label' => $fieldTitle,
230  'content' => $versionState->equals(‪VersionState::NEW_PLACEHOLDER)
231  ? $diffUtility->makeDiffDisplay('', $newOrDeleteRecord[$fieldName])
232  : $diffUtility->makeDiffDisplay($newOrDeleteRecord[$fieldName], ''),
233  ];
234 
235  // Generally not needed by Core, but let's make it available for further processing in hooks
236  $liveReturnArray[] = [
237  'field' => $fieldName,
238  'label' => $fieldTitle,
239  'content' => $newOrDeleteRecord[$fieldName],
240  ];
241  } elseif ((string)$liveRecord[$fieldName] !== (string)$versionRecord[$fieldName]) {
242  // Select the human readable values before diff
243  $liveRecord[$fieldName] = BackendUtility::getProcessedValue(
244  $parameter->table,
245  $fieldName,
246  $liveRecord[$fieldName],
247  0,
248  true,
249  false,
250  $liveRecord['uid']
251  );
252  $versionRecord[$fieldName] = BackendUtility::getProcessedValue(
253  $parameter->table,
254  $fieldName,
255  $versionRecord[$fieldName],
256  0,
257  true,
258  false,
259  $versionRecord['uid']
260  );
261 
262  $diffReturnArray[] = [
263  'field' => $fieldName,
264  'label' => $fieldTitle,
265  'content' => $diffUtility->makeDiffDisplay($liveRecord[$fieldName], $versionRecord[$fieldName]),
266  ];
267  $liveReturnArray[] = [
268  'field' => $fieldName,
269  'label' => $fieldTitle,
270  'content' => $liveRecord[$fieldName],
271  ];
272  }
273  }
274  }
275  // Hook for modifying the difference and live arrays
276  // (this may be used by custom or dynamically-defined fields)
277  foreach (‪$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['workspaces']['modifyDifferenceArray'] ?? [] as $className) {
278  $hookObject = GeneralUtility::makeInstance($className);
279  if (method_exists($hookObject, 'modifyDifferenceArray')) {
280  $hookObject->modifyDifferenceArray($parameter, $diffReturnArray, $liveReturnArray, $diffUtility);
281  }
282  }
283 
284  $historyService = GeneralUtility::makeInstance(HistoryService::class);
285  $history = $historyService->getHistory($parameter->table, $parameter->t3ver_oid);
286  $stageChanges = $historyService->getStageChanges($parameter->table, (int)$parameter->t3ver_oid);
287  $stageChangesFromSysLog = $this->‪getStageChangesFromSysLog($parameter->table, (int)$parameter->t3ver_oid);
288  $commentsForRecord = $this->‪getCommentsForRecord($stageChanges, $stageChangesFromSysLog);
289 
290  if ($this->stagesService->isPrevStageAllowedForUser($parameter->stage)) {
291  $prevStage = $this->stagesService->getPrevStage($parameter->stage);
292  if (isset($prevStage[0])) {
293  $prevStage = current($prevStage);
294  }
295  }
296  if ($this->stagesService->isNextStageAllowedForUser($parameter->stage)) {
297  $nextStage = $this->stagesService->getNextStage($parameter->stage);
298  if (isset($nextStage[0])) {
299  $nextStage = current($nextStage);
300  }
301  }
302 
303  return [
304  'total' => 1,
305  'data' => [
306  [
307  // these parts contain HTML (don't escape)
308  'diff' => $diffReturnArray,
309  'live_record' => $liveReturnArray,
310  'icon_Live' => $icon_Live,
311  'icon_Workspace' => $icon_Workspace,
312  // this part is already escaped in getCommentsForRecord()
313  'comments' => $commentsForRecord,
314  // escape/sanitize the others
315  'path_Live' => htmlspecialchars(BackendUtility::getRecordPath($liveRecord['pid'], '', 999)),
316  'label_Stage' => htmlspecialchars($this->stagesService->getStageTitle($parameter->stage)),
317  'label_PrevStage' => $prevStage ?? false,
318  'label_NextStage' => $nextStage ?? false,
319  'stage_position' => (int)$stagePosition['position'],
320  'stage_count' => (int)$stagePosition['count'],
321  'parent' => [
322  'table' => htmlspecialchars($parameter->table),
323  'uid' => (int)$parameter->uid,
324  ],
325  'history' => [
326  'data' => $history,
327  'total' => count($history),
328  ],
329  ],
330  ],
331  ];
332  }
333 
342  protected function prepareFileReferenceDifferences(array $liveFileReferences, array $versionFileReferences, $useThumbnails = false)
343  {
344  $randomValue = ‪StringUtility::getUniqueId('file');
345 
346  $liveValues = [];
347  $versionValues = [];
348  $candidates = [];
349  $substitutes = [];
350 
351  // Process live references
352  foreach ($liveFileReferences as $identifier => $liveFileReference) {
353  $identifierWithRandomValue = $randomValue . '__' . $liveFileReference->getUid() . '__' . $randomValue;
354  $candidates[$identifierWithRandomValue] = $liveFileReference;
355  $liveValues[] = $identifierWithRandomValue;
356  }
357 
358  // Process version references
359  foreach ($versionFileReferences as $identifier => $versionFileReference) {
360  $identifierWithRandomValue = $randomValue . '__' . $versionFileReference->getUid() . '__' . $randomValue;
361  $candidates[$identifierWithRandomValue] = $versionFileReference;
362  $versionValues[] = $identifierWithRandomValue;
363  }
364 
365  // Combine values and surround by spaces
366  // (to reduce the chunks Diff will find)
367  $liveInformation = ' ' . implode(' ', $liveValues) . ' ';
368  $versionInformation = ' ' . implode(' ', $versionValues) . ' ';
369 
370  // Return if information has not changed
371  if ($liveInformation === $versionInformation) {
372  return null;
373  }
374 
379  foreach ($candidates as $identifierWithRandomValue => $fileReference) {
380  if ($useThumbnails) {
381  $thumbnailFile = $fileReference->getOriginalFile()->process(
383  ['width' => 40, 'height' => 40]
384  );
385  $thumbnailMarkup = '<img src="' . htmlspecialchars($thumbnailFile->getPublicUrl() ?? '') . '" />';
386  $substitutes[$identifierWithRandomValue] = $thumbnailMarkup;
387  } else {
388  $substitutes[$identifierWithRandomValue] = $fileReference->getPublicUrl();
389  }
390  }
391 
392  $differences = $this->‪getDifferenceHandler()->‪makeDiffDisplay($liveInformation, $versionInformation);
393  $liveInformation = str_replace(array_keys($substitutes), array_values($substitutes), trim($liveInformation));
394  $differences = str_replace(array_keys($substitutes), array_values($substitutes), trim($differences));
395 
396  return [
397  'live' => $liveInformation,
398  'differences' => $differences,
399  ];
400  }
401 
409  protected function ‪getCommentsForRecord(array $historyEntries, array $additionalChangesFromLog): array
410  {
411  $allStageChanges = [];
412  $avatar = GeneralUtility::makeInstance(Avatar::class);
413 
414  foreach ($historyEntries as $entry) {
415  $preparedEntry = [];
416  $beUserRecord = BackendUtility::getRecord('be_users', $entry['userid']);
417  $preparedEntry['stage_title'] = htmlspecialchars($this->stagesService->getStageTitle($entry['history_data']['next']));
418  $preparedEntry['previous_stage_title'] = htmlspecialchars($this->stagesService->getStageTitle($entry['history_data']['current']));
419  $preparedEntry['user_uid'] = (int)$entry['userid'];
420  $preparedEntry['user_username'] = is_array($beUserRecord) ? htmlspecialchars($beUserRecord['username']) : '';
421  $preparedEntry['tstamp'] = htmlspecialchars(BackendUtility::datetime($entry['tstamp']));
422  $preparedEntry['user_comment'] = nl2br(htmlspecialchars($entry['history_data']['comment']));
423  $preparedEntry['user_avatar'] = $beUserRecord ? $avatar->render($beUserRecord) : '';
424  $allStageChanges[] = $preparedEntry;
425  }
426 
427  // see if there are more
428  foreach ($additionalChangesFromLog as $sysLogRow) {
429  $sysLogEntry = [];
430  $data = $this->‪unserializeLogData($sysLogRow['log_data'] ?? '');
431  $beUserRecord = BackendUtility::getRecord('be_users', $sysLogRow['userid']);
432  $sysLogEntry['stage_title'] = htmlspecialchars($this->stagesService->getStageTitle($data['stage']));
433  $sysLogEntry['previous_stage_title'] = '';
434  $sysLogEntry['user_uid'] = (int)$sysLogRow['userid'];
435  $sysLogEntry['user_username'] = is_array($beUserRecord) ? htmlspecialchars($beUserRecord['username']) : '';
436  $sysLogEntry['tstamp'] = htmlspecialchars(BackendUtility::datetime($sysLogRow['tstamp']));
437  $sysLogEntry['user_comment'] = nl2br(htmlspecialchars($data['comment']));
438  $sysLogEntry['user_avatar'] = $avatar->render($beUserRecord);
439  $allStageChanges[] = $sysLogEntry;
440  }
441 
442  // There might be "old" sys_log entries, so they need to be checked as well
443  return $allStageChanges;
444  }
445 
450  protected function ‪getStageChangesFromSysLog(string $table, int $uid): array
451  {
452  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_log');
453 
454  return $queryBuilder
455  ->select('log_data', 'tstamp', 'userid')
456  ->from('sys_log')
457  ->where(
458  $queryBuilder->expr()->eq(
459  'action',
460  $queryBuilder->createNamedParameter(DatabaseAction::UPDATE, ‪Connection::PARAM_INT)
461  ),
462  $queryBuilder->expr()->eq(
463  'details_nr',
464  $queryBuilder->createNamedParameter(30, ‪Connection::PARAM_INT)
465  ),
466  $queryBuilder->expr()->eq(
467  'tablename',
468  $queryBuilder->createNamedParameter($table, ‪Connection::PARAM_STR)
469  ),
470  $queryBuilder->expr()->eq(
471  'recuid',
472  $queryBuilder->createNamedParameter($uid, ‪Connection::PARAM_INT)
473  )
474  )
475  ->orderBy('tstamp', 'DESC')
476  ->executeQuery()
477  ->fetchAllAssociative();
478  }
479 
481  {
482  return ‪$GLOBALS['BE_USER'];
483  }
484 
485  protected function ‪getLanguageService(): ‪LanguageService
486  {
487  return ‪$GLOBALS['LANG'];
488  }
489 
495  protected function ‪getDifferenceHandler()
496  {
497  if (!isset($this->differenceHandler)) {
498  $this->differenceHandler = GeneralUtility::makeInstance(DiffUtility::class);
499  $this->differenceHandler->stripTags = false;
500  }
502  }
503 
512  protected function ‪createIntegrityService(array $affectedElements)
513  {
514  $integrityService = GeneralUtility::makeInstance(IntegrityService::class);
515  $integrityService->setAffectedElements($affectedElements);
516  return $integrityService;
517  }
518 
528  protected function ‪getAffectedElements(\stdClass $parameters)
529  {
530  $affectedElements = [];
531  if ($parameters->type === 'selection') {
532  foreach ((array)$parameters->selection as $element) {
533  $affectedElements[] = ‪CombinedRecord::create($element->table, $element->liveId, $element->versionId);
534  }
535  } elseif ($parameters->type === 'all') {
536  $versions = $this->workspaceService->selectVersionsInWorkspace(
537  $this->‪getCurrentWorkspace(),
538  -99,
539  -1,
540  0,
541  'tables_select',
542  $this->‪validateLanguageParameter($parameters)
543  );
544  foreach ($versions as $table => $tableElements) {
545  foreach ($tableElements as $element) {
546  $affectedElement = ‪CombinedRecord::create($table, $element['t3ver_oid'], $element['uid']);
547  $affectedElement->getVersionRecord()->setRow($element);
548  $affectedElements[] = $affectedElement;
549  }
550  }
551  }
552  return $affectedElements;
553  }
554 
562  protected function ‪validateLanguageParameter(\stdClass $parameters)
563  {
564  $language = null;
565  if (isset($parameters->language) && ‪MathUtility::canBeInterpretedAsInteger($parameters->language)) {
566  $language = $parameters->language;
567  }
568  return $language;
569  }
570 
576  protected function ‪getCurrentWorkspace()
577  {
578  return $this->workspaceService->getCurrentWorkspace();
579  }
580 
588  protected function ‪getSuitableFields(string $table, int $uid): array
589  {
590  $formDataCompiler = GeneralUtility::makeInstance(
591  FormDataCompiler::class,
592  GeneralUtility::makeInstance(TcaDatabaseRecord::class)
593  );
594 
595  try {
596  $result = $formDataCompiler->compile(['command' => 'edit', 'tableName' => $table, 'vanillaUid' => $uid]);
597  $fieldList = array_unique(array_values($result['columnsToProcess']));
598  } catch (\Exception $exception) {
599  $fieldList = [];
600  }
601 
602  return array_unique(array_merge(
603  $fieldList,
604  ‪GeneralUtility::trimExplode(',', (string)(‪$GLOBALS['TCA'][$table]['ctrl']['searchFields'] ?? ''))
605  ));
606  }
607 }
‪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\Core\Utility\GeneralUtility\trimExplode
‪static list< string > trimExplode($delim, $string, $removeEmptyValues=false, $limit=0)
Definition: GeneralUtility.php:999
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getCurrentWorkspace
‪int getCurrentWorkspace()
Definition: RemoteServer.php:571
‪TYPO3\CMS\Core\Resource\ProcessedFile\CONTEXT_IMAGEPREVIEW
‪const CONTEXT_IMAGEPREVIEW
Definition: ProcessedFile.php:53
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:49
‪TYPO3\CMS\Core\Utility\MathUtility\canBeInterpretedAsInteger
‪static bool canBeInterpretedAsInteger($var)
Definition: MathUtility.php:74
‪TYPO3\CMS\Core\Versioning\VersionState\NEW_PLACEHOLDER
‪const NEW_PLACEHOLDER
Definition: VersionState.php:53
‪TYPO3\CMS\Workspaces\Domain\Model\CombinedRecord
Definition: CombinedRecord.php:24
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\$workspaceService
‪WorkspaceService $workspaceService
Definition: RemoteServer.php:61
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getBackendUser
‪getBackendUser()
Definition: RemoteServer.php:475
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\validateLanguageParameter
‪int null validateLanguageParameter(\stdClass $parameters)
Definition: RemoteServer.php:557
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\$differenceHandler
‪DiffUtility null $differenceHandler
Definition: RemoteServer.php:65
‪TYPO3\CMS\Core\Imaging\Icon
Definition: Icon.php:26
‪TYPO3\CMS\Backend\Backend\Avatar\Avatar
Definition: Avatar.php:33
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\$gridDataService
‪GridDataService $gridDataService
Definition: RemoteServer.php:53
‪TYPO3\CMS\Core\Resource\FileReference
Definition: FileReference.php:33
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\createIntegrityService
‪IntegrityService createIntegrityService(array $affectedElements)
Definition: RemoteServer.php:507
‪TYPO3\CMS\Workspaces\Domain\Model\CombinedRecord\create
‪static CombinedRecord create($table, $liveId, $versionId)
Definition: CombinedRecord.php:45
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\__construct
‪__construct()
Definition: RemoteServer.php:67
‪TYPO3\CMS\Core\SysLog\Action\Database
Definition: Database.php:24
‪TYPO3\CMS\Core\Imaging\IconFactory
Definition: IconFactory.php:34
‪TYPO3\CMS\Core\Versioning\VersionState\DELETE_PLACEHOLDER
‪const DELETE_PLACEHOLDER
Definition: VersionState.php:61
‪TYPO3\CMS\Core\Log\LogDataTrait\unserializeLogData
‪array null unserializeLogData($logData)
Definition: LogDataTrait.php:33
‪TYPO3\CMS\Core\Database\Connection\PARAM_STR
‪const PARAM_STR
Definition: Connection.php:54
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getWorkspaceInfos
‪array getWorkspaceInfos($parameter)
Definition: RemoteServer.php:96
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getSuitableFields
‪array getSuitableFields(string $table, int $uid)
Definition: RemoteServer.php:583
‪TYPO3\CMS\Core\Type\Enumeration\cast
‪static static cast($value)
Definition: Enumeration.php:186
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getStageChangesFromSysLog
‪getStageChangesFromSysLog(string $table, int $uid)
Definition: RemoteServer.php:445
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getLanguageService
‪getLanguageService()
Definition: RemoteServer.php:480
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer
Definition: RemoteServer.php:49
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getRowDetails
‪array getRowDetails($parameter)
Definition: RemoteServer.php:125
‪TYPO3\CMS\Workspaces\Service\IntegrityService
Definition: IntegrityService.php:27
‪TYPO3\CMS\Workspaces\Controller\Remote
Definition: ActionHandler.php:16
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:62
‪TYPO3\CMS\Workspaces\Service\HistoryService
Definition: HistoryService.php:31
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getAffectedElements
‪array getAffectedElements(\stdClass $parameters)
Definition: RemoteServer.php:523
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\checkIntegrity
‪array checkIntegrity(\stdClass $parameters)
Definition: RemoteServer.php:80
‪TYPO3\CMS\Workspaces\Service\WorkspaceService
Definition: WorkspaceService.php:36
‪TYPO3\CMS\Core\Utility\DiffUtility\makeDiffDisplay
‪string makeDiffDisplay($str1, $str2)
Definition: DiffUtility.php:39
‪TYPO3\CMS\Workspaces\Service\StagesService
Definition: StagesService.php:32
‪TYPO3\CMS\Core\Versioning\VersionState
Definition: VersionState.php:24
‪TYPO3\CMS\Core\Resource\ProcessedFile
Definition: ProcessedFile.php:45
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:38
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static string getUniqueId($prefix='')
Definition: StringUtility.php:128
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getCommentsForRecord
‪array getCommentsForRecord(array $historyEntries, array $additionalChangesFromLog)
Definition: RemoteServer.php:404
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Utility\MathUtility
Definition: MathUtility.php:22
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:42
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Backend\Form\FormDataCompiler
Definition: FormDataCompiler.php:25
‪TYPO3\CMS\Backend\Form\FormDataGroup\TcaDatabaseRecord
Definition: TcaDatabaseRecord.php:25
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:22
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getDifferenceHandler
‪DiffUtility getDifferenceHandler()
Definition: RemoteServer.php:490
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\$stagesService
‪StagesService $stagesService
Definition: RemoteServer.php:57
‪TYPO3\CMS\Core\Log\LogDataTrait
Definition: LogDataTrait.php:25
‪TYPO3\CMS\Workspaces\Service\GridDataService
Definition: GridDataService.php:43