2 namespace TYPO3\CMS\Workspaces\Service;
93 $filterTxt = isset($parameter->filterTxt) ? $parameter->filterTxt :
'';
94 $start = isset($parameter->start) ? (int)$parameter->start : 0;
95 $limit = isset($parameter->limit) ? (int)$parameter->limit : 30;
96 $this->sort = isset($parameter->sort) ? $parameter->sort :
't3ver_oid';
97 $this->sortDir = isset($parameter->dir) ? $parameter->dir :
'ASC';
101 throw new \InvalidArgumentException(
'No such workspace defined');
104 $data[
'data'] = array();
105 $this->generateDataArray($versions, $filterTxt);
106 $data[
'total'] = count($this->dataArray);
118 protected function generateDataArray(array $versions, $filterTxt)
120 $workspaceAccess =
$GLOBALS[
'BE_USER']->checkWorkspace(
$GLOBALS[
'BE_USER']->workspace);
121 $swapStage = $workspaceAccess[
'publish_access'] & 1 ? \TYPO3\CMS\Workspaces\Service\StagesService::STAGE_PUBLISH_ID : 0;
122 $swapAccess =
$GLOBALS[
'BE_USER']->workspacePublishAccess(
$GLOBALS[
'BE_USER']->workspace) &&
$GLOBALS[
'BE_USER']->workspaceSwapAccess();
130 $defaultGridColumns = array(
131 self::GridColumn_Collection => 0,
132 self::GridColumn_CollectionLevel => 0,
133 self::GridColumn_CollectionParent =>
'',
134 self::GridColumn_CollectionCurrent =>
'',
135 self::GridColumn_CollectionChildren => 0,
137 foreach ($versions as $table => $records) {
139 $isRecordTypeAllowedToModify =
$GLOBALS[
'BE_USER']->check(
'tables_modify', $table);
141 foreach ($records as $record) {
144 $combinedRecord = \TYPO3\CMS\Workspaces\Domain\Model\CombinedRecord::createFromArrays($table, $origRecord, $versionRecord);
147 if ($hiddenField !== null) {
148 $recordState = $this->
workspaceState($versionRecord[
't3ver_state'], $origRecord[$hiddenField], $versionRecord[$hiddenField]);
150 $recordState = $this->
workspaceState($versionRecord[
't3ver_state']);
153 $isDeletedPage = $table ==
'pages' && $recordState ==
'deleted';
154 $viewUrl = \TYPO3\CMS\Workspaces\Service\WorkspaceService::viewSingleRecord($table, $record[
'uid'], $origRecord, $versionRecord);
155 $versionArray = array();
156 $versionArray[
'table'] = $table;
157 $versionArray[
'id'] = $table .
':' . $record[
'uid'];
158 $versionArray[
'uid'] = $record[
'uid'];
159 $versionArray[
'workspace'] = $versionRecord[
't3ver_id'];
160 $versionArray = array_merge($versionArray, $defaultGridColumns);
163 $versionArray[
'label_Stage'] = htmlspecialchars($stagesObj->getStageTitle($versionRecord[
't3ver_stage']));
164 $tempStage = $stagesObj->getNextStage($versionRecord[
't3ver_stage']);
165 $versionArray[
'label_nextStage'] = htmlspecialchars($stagesObj->getStageTitle($tempStage[
'uid']));
166 $tempStage = $stagesObj->getPrevStage($versionRecord[
't3ver_stage']);
167 $versionArray[
'label_prevStage'] = htmlspecialchars($stagesObj->getStageTitle($tempStage[
'uid']));
171 $versionArray[
'workspace_Tstamp'] = $versionRecord[
'tstamp'];
173 $versionArray[
't3ver_wsid'] = $versionRecord[
't3ver_wsid'];
174 $versionArray[
't3ver_oid'] = $record[
't3ver_oid'];
175 $versionArray[
'livepid'] = $record[
'livepid'];
176 $versionArray[
'stage'] = $versionRecord[
't3ver_stage'];
177 $versionArray[
'icon_Live'] = $iconFactory->getIconForRecord($table, $origRecord,
Icon::SIZE_SMALL)->render();
178 $versionArray[
'icon_Workspace'] = $iconFactory->getIconForRecord($table, $versionRecord,
Icon::SIZE_SMALL)->render();
180 $versionArray[
'languageValue'] = $languageValue;
181 $versionArray[
'language'] = array(
182 'icon' => $iconFactory->getIcon($this->getSystemLanguageValue($languageValue,
'flagIcon'),
Icon::SIZE_SMALL)->render()
184 $versionArray[
'allowedAction_nextStage'] = $isRecordTypeAllowedToModify && $stagesObj->isNextStageAllowedForUser($versionRecord[
't3ver_stage']);
185 $versionArray[
'allowedAction_prevStage'] = $isRecordTypeAllowedToModify && $stagesObj->isPrevStageAllowedForUser($versionRecord[
't3ver_stage']);
186 if ($swapAccess && $swapStage != 0 && $versionRecord[
't3ver_stage'] == $swapStage) {
187 $versionArray[
'allowedAction_swap'] = $isRecordTypeAllowedToModify && $stagesObj->isNextStageAllowedForUser($swapStage);
188 }
elseif ($swapAccess && $swapStage == 0) {
189 $versionArray[
'allowedAction_swap'] = $isRecordTypeAllowedToModify;
191 $versionArray[
'allowedAction_swap'] =
false;
193 $versionArray[
'allowedAction_delete'] = $isRecordTypeAllowedToModify;
195 $versionArray[
'allowedAction_view'] = !$isDeletedPage && $viewUrl;
196 $versionArray[
'allowedAction_edit'] = $isRecordTypeAllowedToModify && !$isDeletedPage;
197 $versionArray[
'allowedAction_editVersionedPage'] = $isRecordTypeAllowedToModify && !$isDeletedPage;
198 $versionArray[
'state_Workspace'] = $recordState;
200 $versionArray = array_merge(
206 $versionIdentifier = $versionArray[
'id'];
207 $this->dataArray[$versionIdentifier] = $versionArray;
213 list($this->dataArray, $versions) = $this->
emitSignal(self::SIGNAL_GenerateDataArray_BeforeCaching, $this->dataArray, $versions);
215 foreach ($this->dataArray as &$element) {
216 $identifier = $element[
'table'] .
':' . $element[
't3ver_oid'];
217 $element[
'integrity'] = array(
219 'messages' => htmlspecialchars($this->
getIntegrityService()->getIssueMessages($identifier,
true))
226 list($this->dataArray, $versions) = $this->
emitSignal(self::SIGNAL_GenerateDataArray_PostProcesss, $this->dataArray, $versions);
240 $dependencyResolver = $collectionService->getDependencyResolver();
242 foreach ($this->dataArray as $dataElement) {
243 $dependencyResolver->addElement($dataElement[
'table'], $dataElement[
'uid']);
246 $this->dataArray = $collectionService->process($this->dataArray);
258 $dataArrayPart = array();
259 $dataArrayCount = count($this->dataArray);
260 $end = ($start + $limit < $dataArrayCount ? $start + $limit : $dataArrayCount);
263 $this->dataArray = array_values(($this->dataArray));
264 for ($i = $start; $i < $end; $i++) {
265 $dataArrayPart[] = $this->dataArray[$i];
269 if (!empty($this->dataArray[$i][self::GridColumn_Collection])) {
270 $collectionIdentifier = $this->dataArray[$i][self::GridColumn_Collection];
271 for ($i = $i + 1; $i < $dataArrayCount && $collectionIdentifier === $this->dataArray[$i][self::GridColumn_Collection]; $i++) {
272 $dataArrayPart[] = $this->dataArray[$i];
278 list($this->dataArray, $start, $limit, $dataArrayPart) = $this->
emitSignal(self::SIGNAL_GetDataArray_PostProcesss, $this->dataArray, $start, $limit, $dataArrayPart);
279 return $dataArrayPart;
301 $this->workspacesCache->set($hash, $this->dataArray, array($this->currentWorkspace,
'user_' .
$GLOBALS[
'BE_USER']->user[
'uid']));
315 $content = $this->workspacesCache->get($hash);
316 if ($content !==
false) {
317 $this->dataArray = $content;
339 $this->currentWorkspace
341 $hash = md5(serialize($hashArray));
353 if (is_array($this->dataArray)) {
354 switch ($this->sort) {
357 case 'workspace_Tstamp':
361 case 'languageValue':
362 uasort($this->dataArray, array($this,
'intSort'));
364 case 'label_Workspace':
367 case 'workspace_Title':
370 uasort($this->dataArray, array($this,
'stringSort'));
376 GeneralUtility::sysLog(
377 '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 reproduced yet.',
384 list($this->dataArray, $this->sort, $this->sortDir) = $this->
emitSignal(self::SIGNAL_SortDataArray_PostProcesss, $this->dataArray, $this->sort, $this->sortDir);
394 protected function intSort(array $a, array $b)
400 $path_cmp = strcasecmp($a[
'path_Workspace'], $b[
'path_Workspace']);
403 }
elseif ($path_cmp == 0) {
404 if ($a[$this->sort] == $b[$this->sort]) {
407 if ($this->sortDir ==
'ASC') {
409 }
elseif ($this->sortDir ==
'DESC') {
412 }
elseif ($path_cmp > 0) {
430 $path_cmp = strcasecmp($a[
'path_Workspace'], $b[
'path_Workspace']);
433 }
elseif ($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]);
439 }
elseif ($this->sortDir ==
'DESC') {
440 return strcasecmp($a[$this->sort], $b[$this->sort]) * -1;
442 }
elseif ($path_cmp > 0) {
460 $a[self::GridColumn_CollectionLevel] === 0 && $b[self::GridColumn_CollectionLevel] === 0
461 || $a[self::GridColumn_CollectionParent] === $b[self::GridColumn_CollectionParent]
475 if (is_array(
$GLOBALS[
'BE_USER']->uc[
'moduleData'][
'Workspaces'][
$GLOBALS[
'BE_USER']->workspace][
'columns'])) {
476 foreach (
$GLOBALS[
'BE_USER']->uc[
'moduleData'][
'Workspaces'][
$GLOBALS[
'BE_USER']->workspace][
'columns'] as $column => $value) {
477 if (isset($value[
'hidden']) && isset($column) && isset($versionArray[$column])) {
478 if ($value[
'hidden'] == 0) {
480 case 'workspace_Tstamp':
481 if (stripos($versionArray[
'workspace_Formated_Tstamp'], $filterText) !==
false) {
486 if (stripos(strval($versionArray[$column]), str_replace(
'%',
'', $filterText)) !==
false) {
491 if (stripos(strval($versionArray[$column]), $filterText) !==
false) {
510 protected function workspaceState($stateId, $hiddenOnline =
false, $hiddenOffline =
false)
513 if ($hiddenOnline == 0 && $hiddenOffline == 1) {
514 $hiddenState =
'hidden';
515 }
elseif ($hiddenOnline == 1 && $hiddenOffline == 0) {
516 $hiddenState =
'unhidden';
529 $state = ($hiddenState ?:
'modified');
545 if (!(empty(
$GLOBALS[
'TCA'][$table][
'ctrl'][
'enablecolumns'][$type]))) {
546 $fieldName =
$GLOBALS[
'TCA'][$table][
'ctrl'][
'enablecolumns'][$type];
564 $languageField =
$GLOBALS[
'TCA'][$table][
'ctrl'][
'languageField'];
565 if (!empty($record[$languageField])) {
566 $languageValue = $record[$languageField];
569 return $languageValue;
595 public function getSystemLanguages()
597 if (!isset($this->systemLanguages)) {
600 $this->systemLanguages = $translateTools->getSystemLanguages();
612 if (!isset($this->integrityService)) {
627 $signalArguments = array_merge(array($this), array_slice(func_get_args(), 1));
628 $slotReturn = $this->
getSignalSlotDispatcher()->dispatch(\TYPO3\CMS\Workspaces\Service\GridDataService::class, $signalName, $signalArguments);
629 return array_slice($slotReturn, 1);
645 return $this->
getObjectManager()->get(\TYPO3\CMS\Workspaces\Service\AdditionalColumnService::class);
653 return $this->
getObjectManager()->get(\TYPO3\CMS\Extbase\SignalSlot\Dispatcher::class);