66 $this->workspaceService = GeneralUtility::makeInstance(WorkspaceService::class);
67 $this->gridDataService = GeneralUtility::makeInstance(GridDataService::class);
68 $this->stagesService = GeneralUtility::makeInstance(StagesService::class);
82 'result' => $integrity->getStatusRepresentation()
96 $pageId = $parameter->id > 0 ? $parameter->id : -1;
98 $parameter->language =
null;
100 $versions = $this->workspaceService->selectVersionsInWorkspace($this->
getCurrentWorkspace(), 0, -99, $pageId, $parameter->depth,
'tables_select', $parameter->language);
101 $data = $this->gridDataService->generateGridListFromVersions($versions, $parameter, $this->
getCurrentWorkspace());
115 $stages = $this->stagesService->getStagesForWSUser();
118 'total' => count($stages),
132 $diffReturnArray = [];
133 $liveReturnArray = [];
135 $parseObj = GeneralUtility::makeInstance(RteHtmlParser::class);
138 $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
139 $icon_Live = $iconFactory->getIconForRecord($parameter->table, $liveRecord,
Icon::SIZE_SMALL)->render();
140 $icon_Workspace = $iconFactory->getIconForRecord($parameter->table, $versionRecord,
Icon::SIZE_SMALL)->render();
141 $stagePosition = $this->stagesService->getPositionOfCurrentStage($parameter->stage);
142 $fieldsOfRecords = array_keys($liveRecord);
143 if (
$GLOBALS[
'TCA'][$parameter->table]) {
144 if (
$GLOBALS[
'TCA'][$parameter->table][
'interface'][
'showRecordFieldList']) {
145 $fieldsOfRecords =
$GLOBALS[
'TCA'][$parameter->table][
'interface'][
'showRecordFieldList'];
146 $fieldsOfRecords = GeneralUtility::trimExplode(
',', $fieldsOfRecords,
true);
149 foreach ($fieldsOfRecords as $fieldName) {
150 if (empty(
$GLOBALS[
'TCA'][$parameter->table][
'columns'][$fieldName][
'config'])) {
155 if (empty($fieldTitle)) {
156 $fieldTitle = $fieldName;
159 $configuration =
$GLOBALS[
'TCA'][$parameter->table][
'columns'][$fieldName][
'config'];
161 if ($this->
getBackendUser()->isAdmin() ||
$GLOBALS[
'TCA'][$parameter->table][
'columns'][$fieldName][
'exclude'] == 0 || GeneralUtility::inList($this->getBackendUser()->groupData[
'non_exclude_fields'], $parameter->table .
':' . $fieldName)) {
163 if ($configuration[
'type'] ===
'inline' && $configuration[
'foreign_table'] ===
'sys_file_reference') {
164 $useThumbnails =
false;
165 if (!empty($configuration[
'overrideChildTca'][
'columns'][
'uid_local'][
'config'][
'appearance'][
'elementBrowserAllowed']) && !empty(
$GLOBALS[
'TYPO3_CONF_VARS'][
'GFX'][
'imagefile_ext'])) {
166 $fileExtensions = GeneralUtility::trimExplode(
',',
$GLOBALS[
'TYPO3_CONF_VARS'][
'GFX'][
'imagefile_ext'],
true);
167 $allowedExtensions = GeneralUtility::trimExplode(
',', $configuration[
'overrideChildTca'][
'columns'][
'uid_local'][
'config'][
'appearance'][
'elementBrowserAllowed'],
true);
168 $differentExtensions = array_diff($allowedExtensions, $fileExtensions);
169 $useThumbnails = empty($differentExtensions);
182 $this->getCurrentWorkspace()
184 $fileReferenceDifferences = $this->prepareFileReferenceDifferences(
186 $versionFileReferences,
190 if ($fileReferenceDifferences ===
null) {
194 $diffReturnArray[] = [
195 'field' => $fieldName,
196 'label' => $fieldTitle,
197 'content' => $fileReferenceDifferences[
'differences']
199 $liveReturnArray[] = [
200 'field' => $fieldName,
201 'label' => $fieldTitle,
202 'content' => $fileReferenceDifferences[
'live']
204 } elseif ((
string)$liveRecord[$fieldName] !== (
string)$versionRecord[$fieldName]) {
209 $liveRecord[$fieldName],
218 $versionRecord[$fieldName],
222 $versionRecord[
'uid']
225 if ($configuration[
'type'] ===
'group' && $configuration[
'internal_type'] ===
'file') {
229 $diffReturnArray[] = [
230 'field' => $fieldName,
231 'label' => $fieldTitle,
232 'content' => $versionThumb
234 $liveReturnArray[] = [
235 'field' => $fieldName,
236 'label' => $fieldTitle,
237 'content' => $liveThumb
240 $diffReturnArray[] = [
241 'field' => $fieldName,
242 'label' => $fieldTitle,
243 'content' => $diffUtility->makeDiffDisplay($liveRecord[$fieldName], $versionRecord[$fieldName])
245 $liveReturnArray[] = [
246 'field' => $fieldName,
247 'label' => $fieldTitle,
248 'content' => $parseObj->TS_images_rte($liveRecord[$fieldName])
256 foreach (
$GLOBALS[
'TYPO3_CONF_VARS'][
'SC_OPTIONS'][
'workspaces'][
'modifyDifferenceArray'] ?? [] as $className) {
257 $hookObject = GeneralUtility::makeInstance($className);
258 if (method_exists($hookObject,
'modifyDifferenceArray')) {
259 $hookObject->modifyDifferenceArray($parameter, $diffReturnArray, $liveReturnArray, $diffUtility);
264 $historyService = GeneralUtility::makeInstance(HistoryService::class);
265 $history = $historyService->getHistory($parameter->table, $parameter->t3ver_oid);
267 $prevStage = $this->stagesService->getPrevStage($parameter->stage);
268 $nextStage = $this->stagesService->getNextStage($parameter->stage);
270 if (isset($prevStage[0])) {
271 $prevStage = current($prevStage);
274 if (isset($nextStage[0])) {
275 $nextStage = current($nextStage);
283 'diff' => $diffReturnArray,
284 'live_record' => $liveReturnArray,
285 'icon_Live' => $icon_Live,
286 'icon_Workspace' => $icon_Workspace,
288 'comments' => $commentsForRecord,
291 'label_Stage' => htmlspecialchars($this->stagesService->getStageTitle($parameter->stage)),
292 'label_PrevStage' => $prevStage,
293 'label_NextStage' => $nextStage,
294 'stage_position' => (int)$stagePosition[
'position'],
295 'stage_count' => (
int)$stagePosition[
'count'],
297 'table' => htmlspecialchars($parameter->table),
298 'uid' => (int)$parameter->uid
302 'total' => count($history)
317 protected function prepareFileReferenceDifferences(array $liveFileReferences, array $versionFileReferences, $useThumbnails =
false)
319 $randomValue = uniqid(
'file');
327 foreach ($liveFileReferences as $identifier => $liveFileReference) {
328 $identifierWithRandomValue = $randomValue .
'__' . $liveFileReference->getUid() .
'__' . $randomValue;
329 $candidates[$identifierWithRandomValue] = $liveFileReference;
330 $liveValues[] = $identifierWithRandomValue;
334 foreach ($versionFileReferences as $identifier => $versionFileReference) {
335 $identifierWithRandomValue = $randomValue .
'__' . $versionFileReference->getUid() .
'__' . $randomValue;
336 $candidates[$identifierWithRandomValue] = $versionFileReference;
337 $versionValues[] = $identifierWithRandomValue;
342 $liveInformation =
' ' . implode(
' ', $liveValues) .
' ';
343 $versionInformation =
' ' . implode(
' ', $versionValues) .
' ';
346 if ($liveInformation === $versionInformation) {
354 foreach ($candidates as $identifierWithRandomValue => $fileReference) {
355 if ($useThumbnails) {
356 $thumbnailFile = $fileReference->getOriginalFile()->process(
358 [
'width' => 40,
'height' => 40]
360 $thumbnailMarkup =
'<img src="' . $thumbnailFile->getPublicUrl(
true) .
'" />';
361 $substitutes[$identifierWithRandomValue] = $thumbnailMarkup;
363 $substitutes[$identifierWithRandomValue] = $fileReference->getPublicUrl();
368 $liveInformation = str_replace(array_keys($substitutes), array_values($substitutes), trim($liveInformation));
369 $differences = str_replace(array_keys($substitutes), array_values($substitutes), trim($differences));
372 'live' => $liveInformation,
373 'differences' => $differences
386 $sysLogReturnArray = [];
387 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'sys_log');
389 $result = $queryBuilder
390 ->select(
'log_data',
'tstamp',
'userid')
393 $queryBuilder->expr()->eq(
395 $queryBuilder->createNamedParameter(6, \PDO::PARAM_INT)
397 $queryBuilder->expr()->eq(
399 $queryBuilder->createNamedParameter(30, \PDO::PARAM_INT)
401 $queryBuilder->expr()->eq(
403 $queryBuilder->createNamedParameter($table, \PDO::PARAM_STR)
405 $queryBuilder->expr()->eq(
407 $queryBuilder->createNamedParameter($uid, \PDO::PARAM_INT)
410 ->orderBy(
'tstamp',
'DESC')
414 $avatar = GeneralUtility::makeInstance(Avatar::class);
416 while ($sysLogRow = $result->fetch()) {
418 $data = unserialize($sysLogRow[
'log_data']);
420 $sysLogEntry[
'stage_title'] = htmlspecialchars($this->stagesService->getStageTitle($data[
'stage']));
421 $sysLogEntry[
'user_uid'] = (int)$sysLogRow[
'userid'];
422 $sysLogEntry[
'user_username'] = is_array($beUserRecord) ? htmlspecialchars($beUserRecord[
'username']) :
'';
424 $sysLogEntry[
'user_comment'] = nl2br(htmlspecialchars($data[
'comment']));
425 $sysLogEntry[
'user_avatar'] = $avatar->render($beUserRecord);
426 $sysLogReturnArray[] = $sysLogEntry;
428 return $sysLogReturnArray;
439 $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
447 foreach ($this->gridDataService->getSystemLanguages($parameters->pageUid ?? 0) as $id => $systemLanguage) {
451 $systemLanguages[] = [
453 'title' => htmlspecialchars($systemLanguage[
'title']),
454 'icon' => $iconFactory->getIcon($systemLanguage[
'flagIcon'],
Icon::SIZE_SMALL)->render()
458 'total' => count($systemLanguages),
459 'data' => $systemLanguages
487 if (!isset($this->differenceHandler)) {
488 $this->differenceHandler = GeneralUtility::makeInstance(DiffUtility::class);
489 $this->differenceHandler->stripTags =
false;
504 $integrityService = GeneralUtility::makeInstance(IntegrityService::class);
505 $integrityService->setAffectedElements($affectedElements);
506 return $integrityService;
520 $affectedElements = [];
521 if ($parameters->type ===
'selection') {
522 foreach ((array)$parameters->selection as $element) {
525 } elseif ($parameters->type ===
'all') {
527 foreach ($versions as $table => $tableElements) {
528 foreach ($tableElements as $element) {
530 $affectedElement->getVersionRecord()->setRow($element);
531 $affectedElements[] = $affectedElement;
535 return $affectedElements;
549 $language = $parameters->language;
561 return $this->workspaceService->getCurrentWorkspace();