2 namespace TYPO3\CMS\Workspaces\Service;
43 private $pathToLocallang =
'LLL:EXT:workspaces/Resources/Private/Language/locallang.xlf';
91 array $byTableName = array(
'tt_content',
'pages',
'pages_language_overlay')
93 $currentStage = array();
94 $previousStage = array();
95 $usedStages = array();
98 $availableStagesForWSUser = $this->getStagesForWSUser();
99 $byTableName = array_flip($byTableName);
100 foreach ($workspaceItems as $tableName => $items) {
101 if (!array_key_exists($tableName, $byTableName)) {
104 foreach ($items as $item) {
105 $usedStages[$item[
't3ver_stage']] =
true;
108 foreach ($availableStagesForWS as $stage) {
109 if (isset($usedStages[$stage[
'uid']])) {
110 $currentStage = $stage;
115 foreach ($availableStagesForWSUser as $userWS) {
116 if ($previousStage[
'uid'] == $userWS[
'uid']) {
121 if ($found ===
false) {
122 $previousStage = array();
139 array $byTableName = array(
'tt_content',
'pages',
'pages_language_overlay')
141 $currentStage = array();
142 $usedStages = array();
143 $nextStage = array();
145 $availableStagesForWSUser = $this->getStagesForWSUser();
146 $byTableName = array_flip($byTableName);
148 foreach ($workspaceItems as $tableName => $items) {
149 if (!array_key_exists($tableName, $byTableName)) {
152 foreach ($items as $item) {
153 $usedStages[$item[
't3ver_stage']] =
true;
156 foreach ($availableStagesForWS as $stage) {
157 if (isset($usedStages[$stage[
'uid']])) {
158 $currentStage = $stage;
163 foreach ($availableStagesForWSUser as $userWS) {
164 if ($nextStage[
'uid'] == $userWS[
'uid']) {
169 if ($found ===
false) {
170 $nextStage = array();
201 public function getStagesForWSUser()
203 if (
$GLOBALS[
'BE_USER']->isAdmin()) {
208 $allowedStages = array();
212 foreach ($stageRecords as $stageRecord) {
213 if ($stageRecord->isAllowed()) {
214 $allowedStages[$stageRecord->getUid()] = $stageRecord;
219 foreach ($allowedStages as $allowedStage) {
220 $previousStage = $allowedStage->getPrevious();
221 $nextStage = $allowedStage->getNext();
222 if ($previousStage !== null && !isset($allowedStages[$previousStage->getUid()])) {
223 $allowedStages[$previousStage->getUid()] = $previousStage;
225 if ($nextStage !== null && !isset($allowedStages[$nextStage->getUid()])) {
226 $allowedStages[$nextStage->getUid()] = $nextStage;
230 uasort($allowedStages,
function (StageRecord $first, StageRecord $second) {
return $first->determineOrder($second); });
242 $stagesArray = array();
243 foreach ($stageRecords as $stageRecord) {
245 'uid' => $stageRecord->getUid(),
246 'label' => $stageRecord->getTitle(),
248 if (!$stageRecord->isExecuteStage()) {
249 $stage[
'title'] =
$GLOBALS[
'LANG']->sL(($this->pathToLocallang .
':actionSendToStage')) .
' "' . $stageRecord->getTitle() .
'"';
251 $stage[
'title'] =
$GLOBALS[
'LANG']->sL($this->pathToLocallang .
':publish_execute_action_option');
253 $stagesArray[] = $stage;
267 switch ($ver_stage) {
268 case self::STAGE_PUBLISH_EXECUTE_ID:
269 $stageTitle =
$GLOBALS[
'LANG']->sL(
'LLL:EXT:lang/locallang_mod_user_ws.xlf:stage_publish');
271 case self::STAGE_PUBLISH_ID:
272 $stageTitle =
$GLOBALS[
'LANG']->sL(
'LLL:EXT:workspaces/Resources/Private/Language/locallang_mod.xlf:stage_ready_to_publish');
274 case self::STAGE_EDIT_ID:
275 $stageTitle =
$GLOBALS[
'LANG']->sL(
'LLL:EXT:lang/locallang_mod_user_ws.xlf:stage_editing');
279 if ($stageTitle == null) {
280 $stageTitle =
$GLOBALS[
'LANG']->sL(
'LLL:EXT:workspaces/Resources/Private/Language/locallang.xlf:error.getStageTitle.stageNotFound');
307 throw new \InvalidArgumentException(
$GLOBALS[
'LANG']->sL(
'LLL:EXT:workspaces/Resources/Private/Language/locallang.xlf:error.stageId.integer'), 1291109987);
311 if (is_array($workspaceStageRecs) && !empty($workspaceStageRecs)) {
312 reset($workspaceStageRecs);
313 while (!is_null(($workspaceStageRecKey = key($workspaceStageRecs)))) {
314 $workspaceStageRec = current($workspaceStageRecs);
315 if ($workspaceStageRec[
'uid'] == $stageId) {
316 $nextStage = next($workspaceStageRecs);
319 next($workspaceStageRecs);
323 if ($nextStage ===
false) {
324 $nextStage[] = array(
325 'uid' => self::STAGE_EDIT_ID,
326 'title' =>
$GLOBALS[
'LANG']->sL(($this->pathToLocallang .
':actionSendToStage')) .
' "'
327 .
$GLOBALS[
'LANG']->sL(
'LLL:EXT:lang/locallang_mod_user_ws.xlf:stage_editing') .
'"'
343 if ($stageId == self::STAGE_PUBLISH_ID) {
344 return $nextStageArray;
347 if (empty($nextStageRecord) || !is_array($nextStageRecord)) {
349 return $nextStageArray;
355 $nextStageArray[] = $nextStageRecord;
356 return $this->
getNextStages($nextStageArray, $nextStageRecord[
'uid']);
359 return $nextStageArray;
375 throw new \InvalidArgumentException(
$GLOBALS[
'LANG']->sL(
'LLL:EXT:workspaces/Resources/Private/Language/locallang.xlf:error.stageId.integer'));
379 if (is_array($workspaceStageRecs) && !empty($workspaceStageRecs)) {
380 end($workspaceStageRecs);
381 while (!is_null(($workspaceStageRecKey = key($workspaceStageRecs)))) {
382 $workspaceStageRec = current($workspaceStageRecs);
383 if ($workspaceStageRec[
'uid'] == $stageId) {
384 $prevStage = prev($workspaceStageRecs);
387 prev($workspaceStageRecs);
404 if ($stageId != self::STAGE_EDIT_ID) {
406 if (!empty($prevStageRecord) && is_array($prevStageRecord)) {
411 $prevStageArray[] = $prevStageRecord;
412 $prevStageArray = $this->
getPrevStages($prevStageArray, $prevStageRecord[
'uid']);
416 return $prevStageArray;
433 $recipientArray = array();
435 if (!$selectDefaultUserField) {
436 $backendUserIds = $stageRecord->getAllRecipients();
438 $backendUserIds = $stageRecord->getDefaultRecipients();
441 $userList = implode(
',', $backendUserIds);
443 foreach ($userRecords as $userUid => $userRecord) {
444 $recipientArray[$userUid] = $userRecord;
446 return $recipientArray;
472 $backendUserIds = array();
473 $backendGroupIds = array();
475 foreach ($elements as $element) {
476 if (strpos($element,
'be_users_') === 0) {
478 $backendUserIds[] = str_replace(
'be_users_',
'', $element);
479 }
elseif (strpos($element,
'be_groups_') === 0) {
480 $backendGroupIds[] = str_replace(
'be_groups_',
'', $element);
481 }
elseif ((
int)$element) {
482 $backendUserIds[] = (int)$element;
486 if (!empty($backendGroupIds)) {
488 $backendGroupList = implode(
',', $backendGroupIds);
489 $this->userGroups = array();
490 $backendGroups = $this->
fetchGroups($backendGroupList);
491 foreach ($backendGroups as $backendGroup) {
492 foreach ($allBeUserArray as $backendUserId => $backendUser) {
494 $backendUserIds[] = $backendUserId;
500 return array_unique($backendUserIds);
511 if (empty($backendUserList)) {
517 'username, uid, email, realName',
521 if (empty($backendUsers)) {
522 $backendUsers = array();
524 return $backendUsers;
558 $cacheKey = md5($grList . $idList);
559 $groupList = array();
560 if (isset($this->fetchGroupsCache[$cacheKey])) {
561 $groupList = $this->fetchGroupsCache[$cacheKey];
563 if ($idList ===
'') {
565 $this->userGroups = array();
568 $this->fetchGroupsCache[$cacheKey] = $groupList;
579 $whereSQL =
'deleted=0 AND hidden=0 AND pid=0 AND uid IN (' . implode(
',',
$GLOBALS[
'TYPO3_DB']->cleanIntArray($groups)) .
') ';
580 $res =
$GLOBALS[
'TYPO3_DB']->exec_SELECTquery(
'*',
'be_groups', $whereSQL);
582 while ($row =
$GLOBALS[
'TYPO3_DB']->sql_fetch_assoc($res)) {
583 $this->userGroups[$row[
'uid']] = $row;
585 $GLOBALS[
'TYPO3_DB']->sql_free_result($res);
598 $existingGroups = array_keys($this->userGroups);
599 $missingGroups = array_diff($requiredGroups, $existingGroups);
600 if (!empty($missingGroups)) {
604 foreach ($requiredGroups as $uid) {
607 $row = $this->userGroups[$uid];
611 if (
$GLOBALS[
'TYPO3_CONF_VARS'][
'BE'][
'customStageShowRecipientRecursive'] == 1) {
613 if (trim($row[
'subgroup'])) {
617 $subbarray = $this->
fetchGroups($theList, $idList .
',' . $uid);
618 list($subUid, $subArray) = each($subbarray);
620 $this->userGroups[$subUid] = $subArray;
640 throw new \InvalidArgumentException(
$GLOBALS[
'LANG']->sL(
'LLL:EXT:workspaces/Resources/Private/Language/locallang.xlf:error.stageId.integer'));
643 if (is_array($workspaceStage) && isset($workspaceStage[$property])) {
644 $result = $workspaceStage[$property];
659 $countOfStages = count($stagesOfWS);
661 case self::STAGE_PUBLISH_ID:
662 $position = $countOfStages;
664 case self::STAGE_EDIT_ID:
669 foreach ($stagesOfWS as $key => $stageInfoArray) {
671 if ($stageId == $stageInfoArray[
'uid']) {
676 return array(
'position' => $position,
'count' => $countOfStages);
692 if (!empty($prevStage) && $prevStage[
'uid'] != $stageId) {
696 }
catch (\Exception $e) {
714 if (!empty($nextStage) && $nextStage[
'uid'] != $stageId) {
718 }
catch (\Exception $e) {
731 if (isset($this->workspaceStageAllowedCache[$cacheKey])) {
732 $isAllowed = $this->workspaceStageAllowedCache[$cacheKey];
734 $isAllowed =
$GLOBALS[
'BE_USER']->workspaceCheckStageForCurrent($stageId);
735 $this->workspaceStageAllowedCache[$cacheKey] = $isAllowed;
750 foreach ($stages as $stage) {
751 if ($stage[
'uid'] == $stageId) {
774 throw new \InvalidArgumentException(
$GLOBALS[
'LANG']->sL(
'LLL:EXT:workspaces/Resources/Private/Language/locallang.xlf:error.stageId.integer'));
777 case self::STAGE_PUBLISH_EXECUTE_ID:
779 case self::STAGE_PUBLISH_ID:
781 return $workspaceRecord[
'publish_notification_mode'];
783 case self::STAGE_EDIT_ID:
785 return $workspaceRecord[
'edit_notification_mode'];
789 if (is_array($workspaceStage) && isset($workspaceStage[
'notification_mode'])) {
790 return $workspaceStage[
'notification_mode'];
800 if (!isset($this->recordService)) {