‪TYPO3CMS  ‪main
RemoteServer.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\EventDispatcher\EventDispatcherInterface;
21 use Psr\Http\Message\ServerRequestInterface;
25 use TYPO3\CMS\Backend\Utility\BackendUtility;
31 use TYPO3\CMS\Core\Imaging\IconSize;
36 use ‪TYPO3\CMS\Core\SysLog\Action\Database as DatabaseAction;
44 use TYPO3\CMS\Workspaces\Event\ModifyVersionDifferencesEvent;
50 
56 {
57  use ‪LogDataTrait;
58 
59  public function ‪__construct(
60  protected readonly ‪GridDataService $gridDataService,
61  protected readonly ‪StagesService $stagesService,
62  protected readonly ‪WorkspaceService $workspaceService,
63  protected readonly EventDispatcherInterface $eventDispatcher,
64  private readonly ‪FormDataCompiler $formDataCompiler,
65  protected readonly ‪FlexFormValueFormatter $flexFormValueFormatter,
66  ) {}
67 
73  public function ‪checkIntegrity(\stdClass $parameters)
74  {
75  $integrity = $this->‪createIntegrityService($this->‪getAffectedElements($parameters));
76  $integrity->check();
77  $response = [
78  'result' => $integrity->getStatusRepresentation(),
79  ];
80  return $response;
81  }
82 
89  public function ‪getWorkspaceInfos($parameter, ServerRequestInterface $request)
90  {
91  // To avoid too much work we use -1 to indicate that every page is relevant
92  $pageId = $parameter->id > 0 ? $parameter->id : -1;
93  if (!isset($parameter->language) || !‪MathUtility::canBeInterpretedAsInteger($parameter->language)) {
94  $parameter->language = null;
95  }
96  if (!isset($parameter->stage) || !‪MathUtility::canBeInterpretedAsInteger($parameter->stage)) {
97  // -99 disables stage filtering
98  $parameter->stage = -99;
99  }
100  $versions = $this->workspaceService->selectVersionsInWorkspace(
101  $this->‪getCurrentWorkspace(),
102  (int)$parameter->stage,
103  $pageId,
104  (int)$parameter->depth,
105  'tables_select',
106  $parameter->language !== null ? (int)$parameter->language : null
107  );
108  $data = $this->gridDataService->generateGridListFromVersions($versions, $parameter, $this->‪getCurrentWorkspace(), $request);
109  return $data;
110  }
111 
118  public function ‪getRowDetails($parameter, ServerRequestInterface $request)
119  {
120  $diffUtility = GeneralUtility::makeInstance(DiffUtility::class);
121  $diffReturnArray = [];
122  $liveReturnArray = [];
123  $liveRecord = (array)BackendUtility::getRecord($parameter->table, $parameter->t3ver_oid);
124  $versionRecord = (array)BackendUtility::getRecord($parameter->table, $parameter->uid);
125  $versionState = VersionState::tryFrom($versionRecord['t3ver_state'] ?? 0);
126  $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
127  $iconLive = $iconFactory->getIconForRecord($parameter->table, $liveRecord, IconSize::SMALL);
128  $iconWorkspace = $iconFactory->getIconForRecord($parameter->table, $versionRecord, IconSize::SMALL);
129  $stagePosition = $this->stagesService->getPositionOfCurrentStage($parameter->stage);
130  $fieldsOfRecords = array_keys($liveRecord);
131  $isNewOrDeletePlaceholder = $versionState === VersionState::NEW_PLACEHOLDER || $versionState === VersionState::DELETE_PLACEHOLDER;
132  $suitableFields = ($isNewOrDeletePlaceholder && ($parameter->filterFields ?? false)) ? array_flip($this->‪getSuitableFields($parameter->table, $parameter->t3ver_oid, $request)) : [];
133  foreach ($fieldsOfRecords as $fieldName) {
134  if (
135  empty(‪$GLOBALS['TCA'][$parameter->table]['columns'][$fieldName]['config'])
136  ) {
137  continue;
138  }
139  // Disable internal fields
140  if ((‪$GLOBALS['TCA'][$parameter->table]['ctrl']['transOrigDiffSourceField'] ?? '') === $fieldName) {
141  continue;
142  }
143  if ((‪$GLOBALS['TCA'][$parameter->table]['ctrl']['origUid'] ?? '') === $fieldName) {
144  continue;
145  }
146  // Get the field's label. If not available, use the field name
147  $fieldTitle = $this->‪getLanguageService()->sL(BackendUtility::getItemLabel($parameter->table, $fieldName));
148  if (empty($fieldTitle)) {
149  $fieldTitle = $fieldName;
150  }
151  // Gets the TCA configuration for the current field
152  $configuration = ‪$GLOBALS['TCA'][$parameter->table]['columns'][$fieldName]['config'];
153  // check for exclude fields
154  $isFieldExcluded = (bool)(‪$GLOBALS['TCA'][$parameter->table]['columns'][$fieldName]['exclude'] ?? false);
155  if ($this->‪getBackendUser()->isAdmin() || !$isFieldExcluded || ‪GeneralUtility::inList($this->‪getBackendUser()->groupData['non_exclude_fields'], $parameter->table . ':' . $fieldName)) {
156  // call diff class only if there is a difference
157  if ($configuration['type'] === 'file') {
158  $useThumbnails = false;
159  if (!empty($configuration['allowed']) && !empty(‪$GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'])) {
160  $fileExtensions = ‪GeneralUtility::trimExplode(',', ‪$GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'], true);
161  $allowedExtensions = ‪GeneralUtility::trimExplode(',', $configuration['allowed'], true);
162  $differentExtensions = array_diff($allowedExtensions, $fileExtensions);
163  $useThumbnails = empty($differentExtensions);
164  }
165 
166  $liveFileReferences = (array)BackendUtility::resolveFileReferences(
167  $parameter->table,
168  $fieldName,
169  $liveRecord,
170  0
171  );
172  $versionFileReferences = (array)BackendUtility::resolveFileReferences(
173  $parameter->table,
174  $fieldName,
175  $versionRecord,
176  $this->getCurrentWorkspace()
177  );
178  $fileReferenceDifferences = $this->prepareFileReferenceDifferences(
179  $liveFileReferences,
180  $versionFileReferences,
181  $useThumbnails
182  );
183 
184  if ($fileReferenceDifferences === null) {
185  continue;
186  }
187 
188  $diffReturnArray[] = [
189  'field' => $fieldName,
190  'label' => $fieldTitle,
191  'content' => $fileReferenceDifferences['differences'],
192  ];
193  $liveReturnArray[] = [
194  'field' => $fieldName,
195  'label' => $fieldTitle,
196  'content' => $fileReferenceDifferences['live'],
197  ];
198  } elseif ($isNewOrDeletePlaceholder && isset($suitableFields[$fieldName])) {
199  // If this is a new or delete placeholder, add diff view for all appropriate fields
200  $newOrDeleteRecord[$fieldName] = $this->‪formatValue($parameter->table, $fieldName, (string)$liveRecord[$fieldName], $liveRecord['uid'], $configuration);
201 
202  // Don't add empty fields
203  if ($newOrDeleteRecord[$fieldName] === '') {
204  continue;
205  }
206 
207  $granularity = ($configuration['type'] ?? '') === 'flex' ? ‪DiffGranularity::CHARACTER : DiffGranularity::WORD;
208  $diffReturnArray[] = [
209  'field' => $fieldName,
210  'label' => $fieldTitle,
211  'content' => $versionState === VersionState::NEW_PLACEHOLDER
212  ? $diffUtility->makeDiffDisplay('', $newOrDeleteRecord[$fieldName], $granularity)
213  : $diffUtility->makeDiffDisplay($newOrDeleteRecord[$fieldName], '', $granularity),
214  ];
215 
216  // Generally not needed by Core, but let's make it available for further processing in hooks
217  $liveReturnArray[] = [
218  'field' => $fieldName,
219  'label' => $fieldTitle,
220  'content' => $newOrDeleteRecord[$fieldName],
221  ];
222  } elseif ((string)$liveRecord[$fieldName] !== (string)$versionRecord[$fieldName]) {
223  // Select the human-readable values before diff
224  $liveRecord[$fieldName] = $this->‪formatValue($parameter->table, $fieldName, (string)$liveRecord[$fieldName], $liveRecord['uid'], $configuration);
225  $versionRecord[$fieldName] = $this->‪formatValue($parameter->table, $fieldName, (string)$versionRecord[$fieldName], $versionRecord['uid'], $configuration);
226  $granularity = ($configuration['type'] ?? '') === 'flex' ? ‪DiffGranularity::CHARACTER : DiffGranularity::WORD;
227  $fieldDifferences = $diffUtility->makeDiffDisplay(
228  $liveRecord[$fieldName],
229  $versionRecord[$fieldName],
230  $granularity
231  );
232 
233  $diffReturnArray[] = [
234  'field' => $fieldName,
235  'label' => $fieldTitle,
236  'content' => $fieldDifferences,
237  ];
238  $liveReturnArray[] = [
239  'field' => $fieldName,
240  'label' => $fieldTitle,
241  'content' => $liveRecord[$fieldName],
242  ];
243  }
244  }
245  }
246 
247  $versionDifferencesEvent = $this->eventDispatcher->dispatch(
248  new ModifyVersionDifferencesEvent($diffReturnArray, $liveReturnArray, $parameter)
249  );
250 
251  $historyService = GeneralUtility::makeInstance(HistoryService::class);
252  $history = $historyService->getHistory($parameter->table, $parameter->t3ver_oid);
253  $stageChanges = $historyService->getStageChanges($parameter->table, (int)$parameter->t3ver_oid);
254  $stageChangesFromSysLog = $this->‪getStageChangesFromSysLog($parameter->table, (int)$parameter->t3ver_oid);
255  $commentsForRecord = $this->‪getCommentsForRecord($stageChanges, $stageChangesFromSysLog);
256 
257  if ($this->stagesService->isPrevStageAllowedForUser($parameter->stage)) {
258  $prevStage = $this->stagesService->getPrevStage($parameter->stage);
259  if (isset($prevStage[0])) {
260  $prevStage = current($prevStage);
261  }
262  }
263  if ($this->stagesService->isNextStageAllowedForUser($parameter->stage)) {
264  $nextStage = $this->stagesService->getNextStage($parameter->stage);
265  if (isset($nextStage[0])) {
266  $nextStage = current($nextStage);
267  }
268  }
269 
270  return [
271  'total' => 1,
272  'data' => [
273  [
274  // these parts contain HTML (don't escape)
275  'diff' => $versionDifferencesEvent->getVersionDifferences(),
276  'icon_Live' => $iconLive->getIdentifier(),
277  'icon_Live_Overlay' => $iconLive->getOverlayIcon()?->getIdentifier() ?? '',
278  'icon_Workspace' => $iconWorkspace->getIdentifier(),
279  'icon_Workspace_Overlay' => $iconWorkspace->getOverlayIcon()?->getIdentifier() ?? '',
280  // this part is already escaped in getCommentsForRecord()
281  'comments' => $commentsForRecord,
282  // escape/sanitize the others
283  'path_Live' => htmlspecialchars(BackendUtility::getRecordPath($liveRecord['pid'], '', 999)),
284  'label_Stage' => htmlspecialchars($this->stagesService->getStageTitle($parameter->stage)),
285  'label_PrevStage' => $prevStage ?? false,
286  'label_NextStage' => $nextStage ?? false,
287  'stage_position' => (int)$stagePosition['position'],
288  'stage_count' => (int)$stagePosition['count'],
289  'parent' => [
290  'table' => htmlspecialchars($parameter->table),
291  'uid' => (int)$parameter->uid,
292  ],
293  'history' => [
294  'data' => $history,
295  'total' => count($history),
296  ],
297  ],
298  ],
299  ];
300  }
301 
302  protected function ‪formatValue(string $table, string $fieldName, string $value, int ‪$uid, array $tcaConfiguration): string
303  {
304  if (($tcaConfiguration['type'] ?? '') === 'flex') {
305  return $this->flexFormValueFormatter->format($table, $fieldName, $value, ‪$uid, $tcaConfiguration);
306  }
307  return (string)BackendUtility::getProcessedValue($table, $fieldName, $value, defaultPassthrough: true, uid: ‪$uid);
308  }
309 
318  protected function prepareFileReferenceDifferences(array $liveFileReferences, array $versionFileReferences, $useThumbnails = false)
319  {
320  $randomValue = ‪StringUtility::getUniqueId('file');
321 
322  $liveValues = [];
323  $versionValues = [];
324  $candidates = [];
325  $substitutes = [];
326 
327  // Process live references
328  foreach ($liveFileReferences as ‪$identifier => $liveFileReference) {
329  $identifierWithRandomValue = $randomValue . '__' . $liveFileReference->getUid() . '__' . $randomValue;
330  $candidates[$identifierWithRandomValue] = $liveFileReference;
331  $liveValues[] = $identifierWithRandomValue;
332  }
333 
334  // Process version references
335  foreach ($versionFileReferences as ‪$identifier => $versionFileReference) {
336  $identifierWithRandomValue = $randomValue . '__' . $versionFileReference->getUid() . '__' . $randomValue;
337  $candidates[$identifierWithRandomValue] = $versionFileReference;
338  $versionValues[] = $identifierWithRandomValue;
339  }
340 
341  // Combine values and surround by spaces
342  // (to reduce the chunks Diff will find)
343  $liveInformation = ' ' . implode(' ', $liveValues) . ' ';
344  $versionInformation = ' ' . implode(' ', $versionValues) . ' ';
345 
346  // Return if information has not changed
347  if ($liveInformation === $versionInformation) {
348  return null;
349  }
350 
355  foreach ($candidates as $identifierWithRandomValue => $fileReference) {
356  if ($useThumbnails) {
357  $thumbnailFile = $fileReference->getOriginalFile()->process(
359  ['width' => 40, 'height' => 40]
360  );
361  $thumbnailMarkup = '<img src="' . htmlspecialchars($thumbnailFile->getPublicUrl() ?? '') . '" />';
362  $substitutes[$identifierWithRandomValue] = $thumbnailMarkup;
363  } else {
364  $substitutes[$identifierWithRandomValue] = $fileReference->getPublicUrl();
365  }
366  }
367 
368  $diffUtility = GeneralUtility::makeInstance(DiffUtility::class);
369  $differences = $diffUtility->makeDiffDisplay($liveInformation, $versionInformation);
370  $liveInformation = str_replace(array_keys($substitutes), array_values($substitutes), trim($liveInformation));
371  $differences = str_replace(array_keys($substitutes), array_values($substitutes), trim($differences));
372 
373  return [
374  'live' => $liveInformation,
375  'differences' => $differences,
376  ];
377  }
378 
384  protected function ‪getCommentsForRecord(array $historyEntries, array $additionalChangesFromLog): array
385  {
386  $allStageChanges = [];
387  $avatar = GeneralUtility::makeInstance(Avatar::class);
388 
389  foreach ($historyEntries as $entry) {
390  $preparedEntry = [];
391  $beUserRecord = BackendUtility::getRecord('be_users', $entry['userid']);
392  $preparedEntry['stage_title'] = htmlspecialchars($this->stagesService->getStageTitle((int)$entry['history_data']['next']));
393  $preparedEntry['previous_stage_title'] = htmlspecialchars($this->stagesService->getStageTitle((int)$entry['history_data']['current']));
394  $preparedEntry['user_uid'] = (int)$entry['userid'];
395  $preparedEntry['user_username'] = is_array($beUserRecord) ? htmlspecialchars($beUserRecord['username']) : '';
396  $preparedEntry['tstamp'] = htmlspecialchars(BackendUtility::datetime($entry['tstamp']));
397  $preparedEntry['user_comment'] = nl2br(htmlspecialchars($entry['history_data']['comment']));
398  $preparedEntry['user_avatar'] = $beUserRecord ? $avatar->render($beUserRecord) : '';
399  $allStageChanges[] = $preparedEntry;
400  }
401 
402  // see if there are more
403  foreach ($additionalChangesFromLog as $sysLogRow) {
404  $sysLogEntry = [];
405  $data = $this->‪unserializeLogData($sysLogRow['log_data'] ?? '');
406  $beUserRecord = BackendUtility::getRecord('be_users', $sysLogRow['userid']);
407  $sysLogEntry['stage_title'] = htmlspecialchars($this->stagesService->getStageTitle((int)$data['stage']));
408  $sysLogEntry['previous_stage_title'] = '';
409  $sysLogEntry['user_uid'] = (int)$sysLogRow['userid'];
410  $sysLogEntry['user_username'] = is_array($beUserRecord) ? htmlspecialchars($beUserRecord['username']) : '';
411  $sysLogEntry['tstamp'] = htmlspecialchars(BackendUtility::datetime($sysLogRow['tstamp']));
412  $sysLogEntry['user_comment'] = nl2br(htmlspecialchars($data['comment']));
413  $sysLogEntry['user_avatar'] = $avatar->render($beUserRecord);
414  $allStageChanges[] = $sysLogEntry;
415  }
416 
417  // There might be "old" sys_log entries, so they need to be checked as well
418  return $allStageChanges;
419  }
420 
425  protected function ‪getStageChangesFromSysLog(string $table, int ‪$uid): array
426  {
427  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_log');
428 
429  return $queryBuilder
430  ->select('log_data', 'tstamp', 'userid')
431  ->from('sys_log')
432  ->where(
433  $queryBuilder->expr()->eq(
434  'action',
435  $queryBuilder->createNamedParameter(DatabaseAction::UPDATE, ‪Connection::PARAM_INT)
436  ),
437  $queryBuilder->expr()->eq(
438  'details_nr',
439  $queryBuilder->createNamedParameter(30, ‪Connection::PARAM_INT)
440  ),
441  $queryBuilder->expr()->eq(
442  'tablename',
443  $queryBuilder->createNamedParameter($table)
444  ),
445  $queryBuilder->expr()->eq(
446  'recuid',
447  $queryBuilder->createNamedParameter(‪$uid, ‪Connection::PARAM_INT)
448  )
449  )
450  ->orderBy('tstamp', 'DESC')
451  ->executeQuery()
452  ->fetchAllAssociative();
453  }
454 
455  protected function ‪getBackendUser(): ‪BackendUserAuthentication
456  {
457  return ‪$GLOBALS['BE_USER'];
458  }
459 
460  protected function ‪getLanguageService(): ‪LanguageService
461  {
462  return ‪$GLOBALS['LANG'];
463  }
464 
472  protected function ‪createIntegrityService(array $affectedElements): ‪IntegrityService
473  {
474  $integrityService = GeneralUtility::makeInstance(IntegrityService::class);
475  $integrityService->setAffectedElements($affectedElements);
476  return $integrityService;
477  }
478 
485  protected function ‪getAffectedElements(\stdClass $parameters): array
486  {
487  $affectedElements = [];
488  if ($parameters->type === 'selection') {
489  foreach ((array)$parameters->selection as $element) {
490  $affectedElements[] = ‪CombinedRecord::create($element->table, (int)$element->liveId, (int)$element->versionId);
491  }
492  } elseif ($parameters->type === 'all') {
493  $versions = $this->workspaceService->selectVersionsInWorkspace(
494  $this->‪getCurrentWorkspace(),
495  -99,
496  -1,
497  0,
498  'tables_select',
499  $this->‪validateLanguageParameter($parameters)
500  );
501  foreach ($versions as $table => $tableElements) {
502  foreach ($tableElements as $element) {
503  $affectedElement = ‪CombinedRecord::create($table, (int)$element['t3ver_oid'], (int)$element['uid']);
504  $affectedElement->getVersionRecord()->setRow($element);
505  $affectedElements[] = $affectedElement;
506  }
507  }
508  }
509  return $affectedElements;
510  }
511 
516  protected function ‪validateLanguageParameter(\stdClass $parameters): ?int
517  {
518  $language = null;
519  if (isset($parameters->language) && ‪MathUtility::canBeInterpretedAsInteger($parameters->language)) {
520  $language = $parameters->language;
521  }
522  return $language;
523  }
524 
528  protected function ‪getCurrentWorkspace(): int
529  {
530  return $this->workspaceService->getCurrentWorkspace();
531  }
532 
536  protected function ‪getSuitableFields(string $table, int ‪$uid, ServerRequestInterface $request): array
537  {
538  try {
539  $result = $this->formDataCompiler->compile(
540  [
541  'request' => $request,
542  'command' => 'edit',
543  'tableName' => $table,
544  'vanillaUid' => ‪$uid,
545  ],
546  GeneralUtility::makeInstance(TcaDatabaseRecord::class)
547  );
548  $fieldList = array_unique(array_values($result['columnsToProcess']));
549  } catch (\Exception) {
550  // @todo: Avoid this general exception and catch something specific to not hide-away errors.
551  $fieldList = [];
552  }
553 
554  return array_unique(array_merge(
555  $fieldList,
556  ‪GeneralUtility::trimExplode(',', (string)(‪$GLOBALS['TCA'][$table]['ctrl']['searchFields'] ?? ''))
557  ));
558  }
559 }
‪TYPO3\CMS\Core\Utility\DiffUtility
Definition: DiffUtility.php:28
‪TYPO3\CMS\Core\Resource\ProcessedFile\CONTEXT_IMAGEPREVIEW
‪const CONTEXT_IMAGEPREVIEW
Definition: ProcessedFile.php:55
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:52
‪TYPO3\CMS\Workspaces\Domain\Model\CombinedRecord
Definition: CombinedRecord.php:28
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getBackendUser
‪getBackendUser()
Definition: RemoteServer.php:454
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\__construct
‪__construct(protected readonly GridDataService $gridDataService, protected readonly StagesService $stagesService, protected readonly WorkspaceService $workspaceService, protected readonly EventDispatcherInterface $eventDispatcher, private readonly FormDataCompiler $formDataCompiler, protected readonly FlexFormValueFormatter $flexFormValueFormatter,)
Definition: RemoteServer.php:58
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getCurrentWorkspace
‪getCurrentWorkspace()
Definition: RemoteServer.php:527
‪TYPO3\CMS\Core\Versioning\VersionState
‪VersionState
Definition: VersionState.php:22
‪TYPO3\CMS\Backend\Backend\Avatar\Avatar
Definition: Avatar.php:35
‪TYPO3\CMS\Workspaces\Domain\Model\CombinedRecord\create
‪static create(string $table, int $liveId, int $versionId)
Definition: CombinedRecord.php:40
‪TYPO3\CMS\Core\Resource\FileReference
Definition: FileReference.php:37
‪TYPO3\CMS\Core\SysLog\Action\Database
Definition: Database.php:24
‪TYPO3\CMS\Core\Imaging\IconFactory
Definition: IconFactory.php:34
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getCommentsForRecord
‪getCommentsForRecord(array $historyEntries, array $additionalChangesFromLog)
Definition: RemoteServer.php:383
‪TYPO3\CMS\Core\Log\LogDataTrait\unserializeLogData
‪unserializeLogData(mixed $logData)
Definition: LogDataTrait.php:30
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\formatValue
‪formatValue(string $table, string $fieldName, string $value, int $uid, array $tcaConfiguration)
Definition: RemoteServer.php:301
‪TYPO3\CMS\Core\Utility\MathUtility\canBeInterpretedAsInteger
‪static bool canBeInterpretedAsInteger(mixed $var)
Definition: MathUtility.php:69
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getStageChangesFromSysLog
‪getStageChangesFromSysLog(string $table, int $uid)
Definition: RemoteServer.php:424
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getLanguageService
‪getLanguageService()
Definition: RemoteServer.php:459
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer
Definition: RemoteServer.php:56
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\validateLanguageParameter
‪validateLanguageParameter(\stdClass $parameters)
Definition: RemoteServer.php:515
‪TYPO3\CMS\Backend\View\ValueFormatter\FlexFormValueFormatter
Definition: FlexFormValueFormatter.php:34
‪TYPO3\CMS\Workspaces\Service\IntegrityService
Definition: IntegrityService.php:29
‪TYPO3\CMS\Workspaces\Controller\Remote
Definition: ActionHandler.php:18
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:62
‪TYPO3\CMS\Workspaces\Service\HistoryService
Definition: HistoryService.php:35
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\checkIntegrity
‪array checkIntegrity(\stdClass $parameters)
Definition: RemoteServer.php:72
‪TYPO3\CMS\Workspaces\Service\WorkspaceService
Definition: WorkspaceService.php:38
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getAffectedElements
‪getAffectedElements(\stdClass $parameters)
Definition: RemoteServer.php:484
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\createIntegrityService
‪createIntegrityService(array $affectedElements)
Definition: RemoteServer.php:471
‪TYPO3\CMS\Workspaces\Service\StagesService
Definition: StagesService.php:33
‪TYPO3\CMS\Core\Resource\ProcessedFile
Definition: ProcessedFile.php:47
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:41
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getRowDetails
‪array getRowDetails($parameter, ServerRequestInterface $request)
Definition: RemoteServer.php:117
‪TYPO3\CMS\Webhooks\Message\$uid
‪identifier readonly int $uid
Definition: PageModificationMessage.php:35
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getSuitableFields
‪getSuitableFields(string $table, int $uid, ServerRequestInterface $request)
Definition: RemoteServer.php:535
‪TYPO3\CMS\Core\Utility\DiffGranularity
‪DiffGranularity
Definition: DiffGranularity.php:21
‪TYPO3\CMS\Core\Utility\MathUtility
Definition: MathUtility.php:24
‪TYPO3\CMS\Core\Utility\GeneralUtility\inList
‪static bool inList($list, $item)
Definition: GeneralUtility.php:422
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:46
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Backend\Form\FormDataCompiler
Definition: FormDataCompiler.php:26
‪TYPO3\CMS\Backend\Form\FormDataGroup\TcaDatabaseRecord
Definition: TcaDatabaseRecord.php:25
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:24
‪TYPO3\CMS\Core\Utility\CHARACTER
‪@ CHARACTER
Definition: DiffGranularity.php:25
‪TYPO3\CMS\Workspaces\Controller\Remote\RemoteServer\getWorkspaceInfos
‪array getWorkspaceInfos($parameter, ServerRequestInterface $request)
Definition: RemoteServer.php:88
‪TYPO3\CMS\Core\Utility\GeneralUtility\trimExplode
‪static list< string > trimExplode(string $delim, string $string, bool $removeEmptyValues=false, int $limit=0)
Definition: GeneralUtility.php:822
‪TYPO3\CMS\Webhooks\Message\$identifier
‪identifier readonly string $identifier
Definition: FileAddedMessage.php:37
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static getUniqueId(string $prefix='')
Definition: StringUtility.php:57
‪TYPO3\CMS\Core\Log\LogDataTrait
Definition: LogDataTrait.php:25
‪TYPO3\CMS\Workspaces\Service\GridDataService
Definition: GridDataService.php:48