92 $filterTxt = isset($parameter->filterTxt) ? $parameter->filterTxt :
'';
93 $start = isset($parameter->start) ? (int)$parameter->start : 0;
94 $limit = isset($parameter->limit) ? (int)$parameter->limit : 30;
95 $this->sort = isset($parameter->sort) ? $parameter->sort :
't3ver_oid';
96 $this->sortDir = isset($parameter->dir) ? $parameter->dir :
'ASC';
100 throw new \InvalidArgumentException(
'No such workspace defined');
103 $data[
'data'] = array();
104 $this->generateDataArray($versions, $filterTxt);
105 $data[
'total'] = count($this->dataArray);
117 protected function generateDataArray(array $versions, $filterTxt) {
118 $workspaceAccess =
$GLOBALS[
'BE_USER']->checkWorkspace(
$GLOBALS[
'BE_USER']->workspace);
120 $swapAccess =
$GLOBALS[
'BE_USER']->workspacePublishAccess(
$GLOBALS[
'BE_USER']->workspace) &&
$GLOBALS[
'BE_USER']->workspaceSwapAccess();
126 $defaultGridColumns = array(
127 self::GridColumn_Collection => 0,
128 self::GridColumn_CollectionLevel => 0,
129 self::GridColumn_CollectionParent =>
'',
130 self::GridColumn_CollectionCurrent =>
'',
131 self::GridColumn_CollectionChildren => 0,
133 foreach ($versions as $table => $records) {
135 $isRecordTypeAllowedToModify =
$GLOBALS[
'BE_USER']->check(
'tables_modify', $table);
137 foreach ($records as $record) {
138 $origRecord = BackendUtility::getRecord($table, $record[
't3ver_oid']);
139 $versionRecord = BackendUtility::getRecord($table, $record[
'uid']);
143 if ($hiddenField !== NULL) {
144 $recordState = $this->
workspaceState($versionRecord[
't3ver_state'], $origRecord[$hiddenField], $versionRecord[$hiddenField]);
146 $recordState = $this->
workspaceState($versionRecord[
't3ver_state']);
149 $isDeletedPage = $table ==
'pages' && $recordState ==
'deleted';
151 $versionArray = array();
152 $versionArray[
'table'] = $table;
153 $versionArray[
'id'] = $table .
':' . $record[
'uid'];
154 $versionArray[
'uid'] = $record[
'uid'];
155 $versionArray[
'workspace'] = $versionRecord[
't3ver_id'];
156 $versionArray = array_merge($versionArray, $defaultGridColumns);
157 $versionArray[
'label_Workspace'] = htmlspecialchars(
160 $versionArray[
'label_Stage'] = htmlspecialchars($stagesObj->getStageTitle($versionRecord[
't3ver_stage']));
161 $tempStage = $stagesObj->getNextStage($versionRecord[
't3ver_stage']);
162 $versionArray[
'label_nextStage'] = htmlspecialchars($stagesObj->getStageTitle($tempStage[
'uid']));
163 $tempStage = $stagesObj->getPrevStage($versionRecord[
't3ver_stage']);
164 $versionArray[
'label_prevStage'] = htmlspecialchars($stagesObj->getStageTitle($tempStage[
'uid']));
165 $versionArray[
'path_Live'] = htmlspecialchars(
167 $versionArray[
'path_Workspace'] = htmlspecialchars(
170 $versionArray[
'workspace_Tstamp'] = $versionRecord[
'tstamp'];
172 $versionArray[
't3ver_wsid'] = $versionRecord[
't3ver_wsid'];
173 $versionArray[
't3ver_oid'] = $record[
't3ver_oid'];
174 $versionArray[
'livepid'] = $record[
'livepid'];
175 $versionArray[
'stage'] = $versionRecord[
't3ver_stage'];
179 $versionArray[
'languageValue'] = $languageValue;
180 $versionArray[
'language'] = array(
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);
239 $dependencyResolver = $collectionService->getDependencyResolver();
241 foreach ($this->dataArray as $dataElement) {
242 $dependencyResolver->addElement($dataElement[
'table'], $dataElement[
'uid']);
245 $this->dataArray = $collectionService->process($this->dataArray);
256 $dataArrayPart = array();
257 $dataArrayCount = count($this->dataArray);
258 $end = ($start + $limit < count($this->dataArray) ? $start + $limit : $dataArrayCount);
261 $this->dataArray = array_values(($this->dataArray));
262 for ($i = $start; $i < $end; $i++) {
263 $dataArrayPart[] = $this->dataArray[$i];
267 if (!empty($this->dataArray[$i][self::GridColumn_Collection])) {
268 $collectionIdentifier = $this->dataArray[$i][self::GridColumn_Collection];
269 for ($i = $i + 1; $i < $dataArrayCount && $collectionIdentifier === $this->dataArray[$i][self::GridColumn_Collection]; $i++) {
270 $dataArrayPart[] = $this->dataArray[$i];
276 list($this->dataArray, $start, $limit, $dataArrayPart) = $this->
emitSignal(self::SIGNAL_GetDataArray_PostProcesss, $this->dataArray, $start, $limit, $dataArrayPart);
277 return $dataArrayPart;
297 $this->workspacesCache->set($hash, $this->dataArray, array($this->currentWorkspace,
'user_' .
$GLOBALS[
'BE_USER']->user[
'uid']));
310 $content = $this->workspacesCache->get($hash);
311 if ($content !== FALSE) {
312 $this->dataArray = $content;
333 $this->currentWorkspace
335 $hash = md5(serialize($hashArray));
346 if (is_array($this->dataArray)) {
347 switch ($this->sort) {
350 case 'workspace_Tstamp':
354 case 'languageValue':
355 uasort($this->dataArray, array($this,
'intSort'));
357 case 'label_Workspace':
360 case 'workspace_Title':
363 uasort($this->dataArray, array($this,
'stringSort'));
369 GeneralUtility::sysLog(
'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.', 3);
373 list($this->dataArray, $this->sort, $this->sortDir) = $this->
emitSignal(self::SIGNAL_SortDataArray_PostProcesss, $this->dataArray, $this->sort, $this->sortDir);
383 protected function intSort(array $a, array $b) {
388 $path_cmp = strcasecmp($a[
'path_Workspace'], $b[
'path_Workspace']);
391 } elseif ($path_cmp == 0) {
392 if ($a[$this->sort] == $b[$this->sort]) {
395 if ($this->sortDir ==
'ASC') {
397 } elseif ($this->sortDir ==
'DESC') {
400 } elseif ($path_cmp > 0) {
417 $path_cmp = strcasecmp($a[
'path_Workspace'], $b[
'path_Workspace']);
420 } elseif ($path_cmp == 0) {
421 if ($a[$this->sort] == $b[$this->sort]) {
424 if ($this->sortDir ==
'ASC') {
425 return strcasecmp($a[$this->sort], $b[$this->sort]);
426 } elseif ($this->sortDir ==
'DESC') {
427 return strcasecmp($a[$this->sort], $b[$this->sort]) * -1;
429 } elseif ($path_cmp > 0) {
446 $a[self::GridColumn_CollectionLevel] === 0 && $b[self::GridColumn_CollectionLevel] === 0
447 || $a[self::GridColumn_CollectionParent] === $b[self::GridColumn_CollectionParent]
460 if (is_array(
$GLOBALS[
'BE_USER']->uc[
'moduleData'][
'Workspaces'][
$GLOBALS[
'BE_USER']->workspace][
'columns'])) {
461 foreach (
$GLOBALS[
'BE_USER']->uc[
'moduleData'][
'Workspaces'][
$GLOBALS[
'BE_USER']->workspace][
'columns'] as $column => $value) {
462 if (isset($value[
'hidden']) && isset($column) && isset($versionArray[$column])) {
463 if ($value[
'hidden'] == 0) {
465 case 'workspace_Tstamp':
466 if (stripos($versionArray[
'workspace_Formated_Tstamp'], $filterText) !== FALSE) {
471 if (stripos(strval($versionArray[$column]), str_replace(
'%',
'', $filterText)) !== FALSE) {
476 if (stripos(strval($versionArray[$column]), $filterText) !== FALSE) {
495 protected function workspaceState($stateId, $hiddenOnline = FALSE, $hiddenOffline = FALSE) {
497 if ($hiddenOnline == 0 && $hiddenOffline == 1) {
498 $hiddenState =
'hidden';
499 } elseif ($hiddenOnline == 1 && $hiddenOffline == 0) {
500 $hiddenState =
'unhidden';
513 $state = ($hiddenState ?:
'modified');
528 if (!(empty(
$GLOBALS[
'TCA'][$table][
'ctrl'][
'enablecolumns'][$type]))) {
529 $fieldName =
$GLOBALS[
'TCA'][$table][
'ctrl'][
'enablecolumns'][$type];
546 $languageField =
$GLOBALS[
'TCA'][$table][
'ctrl'][
'languageField'];
547 if (!empty($record[$languageField])) {
548 $languageValue = $record[$languageField];
551 return $languageValue;
576 public function getSystemLanguages() {
577 if (!isset($this->systemLanguages)) {
580 $this->systemLanguages = $translateTools->getSystemLanguages();
591 if (!isset($this->integrityService)) {
605 $signalArguments = array_merge(array($this), array_slice(func_get_args(), 1));
606 $slotReturn = $this->
getSignalSlotDispatcher()->dispatch(
'TYPO3\\CMS\\Workspaces\\Service\\GridDataService', $signalName, $signalArguments);
607 return array_slice($slotReturn, 1);
621 return $this->
getObjectManager()->get(
'TYPO3\\CMS\\Workspaces\\Service\\AdditionalColumnService');
628 return $this->
getObjectManager()->get(
'TYPO3\\CMS\\Extbase\\SignalSlot\\Dispatcher');
635 return \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
'TYPO3\\CMS\\Extbase\\Object\\ObjectManager');
static getWorkspaceTitle($wsId)
getSystemLanguageValue($id, $key)
static viewSingleRecord($table, $uid, array $liveRecord=NULL, array $versionRecord=NULL)
resolveDataArrayDependencies()
const GridColumn_CollectionChildren
const GridColumn_CollectionCurrent
getDataArray($start, $limit)
static createFromArrays($table, array $liveRow, array $versionRow)
getAdditionalColumnService()
isSortable(array $a, array $b)
const GridColumn_Collection
static makeInstance($className)
static mapRecordTypeToSpriteIconClass($table, array $row)
const SIGNAL_GenerateDataArray_PostProcesss
const GridColumn_CollectionLevel
getTcaEnableColumnsFieldName($table, $type)
generateGridListFromVersions($versions, $parameter, $currentWorkspace)
static getRecordTitle($table, $row, $prep=FALSE, $forceResult=TRUE)
getLanguageValue($table, array $record)
const SIGNAL_SortDataArray_PostProcesss
const SIGNAL_GetDataArray_PostProcesss
calculateHash(array $versions, $filterTxt)
getSignalSlotDispatcher()
isFilterTextInVisibleColumns($filterText, array $versionArray)
static getRecordPath($uid, $clause, $titleLimit, $fullTitleLimit=0)
const SIGNAL_GenerateDataArray_BeforeCaching
if(!defined('TYPO3_MODE')) $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_userauth.php']['logoff_pre_processing'][]
workspaceState($stateId, $hiddenOnline=FALSE, $hiddenOffline=FALSE)
setDataArrayIntoCache(array $versions, $filterTxt)
const GridColumn_CollectionParent
initializeWorkspacesCachingFramework()
static isTableLocalizable($table)
intSort(array $a, array $b)
getDataArrayFromCache(array $versions, $filterTxt)
getDependencyCollectionService()