17 use Psr\Log\LoggerAwareInterface;
18 use Psr\Log\LoggerAwareTrait;
99 $filterTxt = $parameter->filterTxt ??
'';
100 $start = isset($parameter->start) ? (int)$parameter->start : 0;
101 $limit = isset($parameter->limit) ? (int)$parameter->limit : 30;
102 $this->sort = $parameter->sort ??
't3ver_oid';
103 $this->sortDir = $parameter->dir ??
'ASC';
107 throw new \InvalidArgumentException(
'No such workspace defined', 1476048304);
112 $data[
'total'] = count($this->dataArray);
125 $workspaceAccess =
$GLOBALS[
'BE_USER']->checkWorkspace(
$GLOBALS[
'BE_USER']->workspace);
127 $swapAccess =
$GLOBALS[
'BE_USER']->workspacePublishAccess(
$GLOBALS[
'BE_USER']->workspace) &&
$GLOBALS[
'BE_USER']->workspaceSwapAccess();
129 $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
132 $stagesObj = GeneralUtility::makeInstance(StagesService::class);
133 $defaultGridColumns = [
134 self::GridColumn_Collection => 0,
135 self::GridColumn_CollectionLevel => 0,
136 self::GridColumn_CollectionParent =>
'',
137 self::GridColumn_CollectionCurrent =>
'',
138 self::GridColumn_CollectionChildren => 0,
140 foreach ($versions as $table => $records) {
142 $isRecordTypeAllowedToModify =
$GLOBALS[
'BE_USER']->check(
'tables_modify', $table);
144 foreach ($records as $record) {
150 if ($hiddenField !==
null) {
151 $recordState = $this->
workspaceState($versionRecord[
't3ver_state'], $origRecord[$hiddenField], $versionRecord[$hiddenField]);
156 $isDeletedPage = $table ===
'pages' && $recordState ===
'deleted';
157 $pageId = $table ===
'pages' ? $record[
'uid'] : $record[
'pid'];
158 $viewUrl = GeneralUtility::makeInstance(PreviewUriBuilder::class)->buildUriForElement($table, $record[
'uid'], $origRecord, $versionRecord);
160 $versionArray[
'table'] = $table;
161 $versionArray[
'id'] = $table .
':' . $record[
'uid'];
162 $versionArray[
'uid'] = $record[
'uid'];
163 $versionArray[
'workspace'] = $versionRecord[
't3ver_id'];
164 $versionArray = array_merge($versionArray, $defaultGridColumns);
167 $versionArray[
'label_Stage'] = htmlspecialchars($stagesObj->getStageTitle($versionRecord[
't3ver_stage']));
168 $tempStage = $stagesObj->getNextStage($versionRecord[
't3ver_stage']);
169 $versionArray[
'label_nextStage'] = htmlspecialchars($stagesObj->getStageTitle($tempStage[
'uid']));
170 $versionArray[
'value_nextStage'] = (int)$tempStage[
'uid'];
171 $tempStage = $stagesObj->getPrevStage($versionRecord[
't3ver_stage']);
172 $versionArray[
'label_prevStage'] = htmlspecialchars($stagesObj->getStageTitle($tempStage[
'uid']));
173 $versionArray[
'value_prevStage'] = (int)$tempStage[
'uid'];
178 $versionArray[
'workspace_Tstamp'] = $versionRecord[
'tstamp'];
180 $versionArray[
't3ver_wsid'] = $versionRecord[
't3ver_wsid'];
181 $versionArray[
't3ver_oid'] = $record[
't3ver_oid'];
182 $versionArray[
'livepid'] = $record[
'livepid'];
183 $versionArray[
'stage'] = $versionRecord[
't3ver_stage'];
184 $versionArray[
'icon_Live'] = $iconFactory->getIconForRecord($table, $origRecord,
Icon::SIZE_SMALL)->render();
185 $versionArray[
'icon_Workspace'] = $iconFactory->getIconForRecord($table, $versionRecord,
Icon::SIZE_SMALL)->render();
187 $versionArray[
'languageValue'] = $languageValue;
188 $versionArray[
'language'] = [
191 $versionArray[
'allowedAction_nextStage'] = $isRecordTypeAllowedToModify && $stagesObj->isNextStageAllowedForUser($versionRecord[
't3ver_stage']);
192 $versionArray[
'allowedAction_prevStage'] = $isRecordTypeAllowedToModify && $stagesObj->isPrevStageAllowedForUser($versionRecord[
't3ver_stage']);
193 if ($swapAccess && $swapStage != 0 && $versionRecord[
't3ver_stage'] == $swapStage) {
194 $versionArray[
'allowedAction_swap'] = $isRecordTypeAllowedToModify && $stagesObj->isNextStageAllowedForUser($swapStage);
195 } elseif ($swapAccess && $swapStage == 0) {
196 $versionArray[
'allowedAction_swap'] = $isRecordTypeAllowedToModify;
198 $versionArray[
'allowedAction_swap'] =
false;
200 $versionArray[
'allowedAction_delete'] = $isRecordTypeAllowedToModify;
202 $versionArray[
'allowedAction_view'] = !$isDeletedPage && $viewUrl;
203 $versionArray[
'allowedAction_edit'] = $isRecordTypeAllowedToModify && !$isDeletedPage;
204 $versionArray[
'allowedAction_editVersionedPage'] = $isRecordTypeAllowedToModify && !$isDeletedPage;
205 $versionArray[
'state_Workspace'] = $recordState;
207 $versionArray = array_merge(
213 $versionIdentifier = $versionArray[
'id'];
214 $this->dataArray[$versionIdentifier] = $versionArray;
220 list($this->dataArray, $versions) = $this->
emitSignal(self::SIGNAL_GenerateDataArray_BeforeCaching, $this->dataArray, $versions);
222 foreach ($this->dataArray as &$element) {
223 $identifier = $element[
'table'] .
':' . $element[
't3ver_oid'];
224 $element[
'integrity'] = [
226 'messages' => htmlspecialchars($this->
getIntegrityService()->getIssueMessages($identifier,
true))
233 list($this->dataArray, $versions) = $this->
emitSignal(self::SIGNAL_GenerateDataArray_PostProcesss, $this->dataArray, $versions);
245 $dependencyResolver = $collectionService->getDependencyResolver();
247 foreach ($this->dataArray as $dataElement) {
248 $dependencyResolver->addElement($dataElement[
'table'], $dataElement[
'uid']);
251 $this->dataArray = $collectionService->process($this->dataArray);
264 $dataArrayCount = count($this->dataArray);
265 $end = ($start + $limit < $dataArrayCount ? $start + $limit : $dataArrayCount);
268 $this->dataArray = array_values($this->dataArray);
269 for ($i = $start; $i < $end; $i++) {
270 $dataArrayPart[] = $this->dataArray[$i];
274 if (!empty($this->dataArray[$i][self::GridColumn_Collection])) {
277 $dataArrayPart[] = $this->dataArray[$i];
283 list($this->dataArray, $start, $limit, $dataArrayPart) = $this->
emitSignal(self::SIGNAL_GetDataArray_PostProcesss, $this->dataArray, $start, $limit, $dataArrayPart);
284 return $dataArrayPart;
292 $this->workspacesCache = GeneralUtility::makeInstance(CacheManager::class)->getCache(
'workspaces_cache');
304 $this->workspacesCache->set($hash, $this->dataArray, [(
string)$this->currentWorkspace,
'user_' .
$GLOBALS[
'BE_USER']->user[
'uid']]);
318 $content = $this->workspacesCache->get($hash);
319 if ($content !==
false) {
320 $this->dataArray = $content;
344 $hash = md5(serialize($hashArray));
354 if (is_array($this->dataArray)) {
355 switch ($this->sort) {
358 case 'workspace_Tstamp':
362 case 'languageValue':
363 uasort($this->dataArray, [$this,
'intSort']);
365 case 'label_Workspace':
368 case 'workspace_Title':
371 uasort($this->dataArray, [$this,
'stringSort']);
377 $this->logger->critical(
'Try to sort "' . $this->sort .
'" in "\\TYPO3\\CMS\\Workspaces\\Service\\GridDataService::sortDataArray" but $this->dataArray is empty! This might be the bug #26422 which could not be reproduced yet.');
381 list($this->dataArray, $this->sort, $this->sortDir) = $this->
emitSignal(self::SIGNAL_SortDataArray_PostProcesss, $this->dataArray, $this->sort, $this->sortDir);
391 protected function intSort(array $a, array $b)
397 $path_cmp = strcasecmp($a[
'path_Workspace'], $b[
'path_Workspace']);
401 if ($path_cmp == 0) {
402 if ($a[$this->sort] == $b[$this->sort]) {
405 if ($this->sortDir ===
'ASC') {
408 if ($this->sortDir ===
'DESC') {
411 } elseif ($path_cmp > 0) {
429 $path_cmp = strcasecmp($a[
'path_Workspace'], $b[
'path_Workspace']);
433 if ($path_cmp == 0) {
434 if ($a[$this->sort] == $b[$this->sort]) {
437 if ($this->sortDir ===
'ASC') {
438 return strcasecmp($a[$this->sort], $b[$this->sort]);
440 if ($this->sortDir ===
'DESC') {
441 return strcasecmp($a[$this->sort], $b[$this->sort]) * -1;
443 } elseif ($path_cmp > 0) {
476 if (is_array(
$GLOBALS[
'BE_USER']->uc[
'moduleData'][
'Workspaces'][
$GLOBALS[
'BE_USER']->workspace][
'columns'])) {
477 $visibleColumns =
$GLOBALS[
'BE_USER']->uc[
'moduleData'][
'Workspaces'][
$GLOBALS[
'BE_USER']->workspace][
'columns'];
480 'workspace_Formated_Tstamp' => [
'hidden' => 0],
481 'change' => [
'hidden' => 0],
482 'path_Workspace' => [
'hidden' => 0],
483 'path_Live' => [
'hidden' => 0],
484 'label_Live' => [
'hidden' => 0],
485 'label_Stage' => [
'hidden' => 0],
486 'label_Workspace' => [
'hidden' => 0],
489 foreach ($visibleColumns as $column => $value) {
490 if (isset($value[
'hidden']) && isset($column) && isset($versionArray[$column])) {
491 if ($value[
'hidden'] == 0) {
493 case 'workspace_Tstamp':
494 if (stripos($versionArray[
'workspace_Formated_Tstamp'], $filterText) !==
false) {
499 if (stripos(strval($versionArray[$column]), str_replace(
'%',
'', $filterText)) !==
false) {
504 if (stripos(strval($versionArray[$column]), $filterText) !==
false) {
522 protected function workspaceState($stateId, $hiddenOnline =
false, $hiddenOffline =
false)
525 if ($hiddenOnline == 0 && $hiddenOffline == 1) {
526 $hiddenState =
'hidden';
527 } elseif ($hiddenOnline == 1 && $hiddenOffline == 0) {
528 $hiddenState =
'unhidden';
541 $state = ($hiddenState ?:
'modified');
557 if (!empty(
$GLOBALS[
'TCA'][$table][
'ctrl'][
'enablecolumns'][$type])) {
558 $fieldName =
$GLOBALS[
'TCA'][$table][
'ctrl'][
'enablecolumns'][$type];
576 $languageField =
$GLOBALS[
'TCA'][$table][
'ctrl'][
'languageField'];
577 if (!empty($record[$languageField])) {
578 $languageValue = $record[$languageField];
581 return $languageValue;
597 if (!empty($systemLanguages[$id][$key])) {
598 $value = $systemLanguages[$id][$key];
611 return GeneralUtility::makeInstance(TranslationConfigurationProvider::class)->getSystemLanguages($pageId);
621 if (!isset($this->integrityService)) {
622 $this->integrityService = GeneralUtility::makeInstance(IntegrityService::class);
634 protected function emitSignal($signalName, ...$arguments)
637 $signalArguments = $arguments;
638 array_unshift($signalArguments, $this);
640 return array_slice($slotReturn, 1);
648 return GeneralUtility::makeInstance(Dependency\CollectionService::class);
672 return GeneralUtility::makeInstance(ObjectManager::class);