52 $this->stageService = GeneralUtility::makeInstance(StagesService::class);
53 $this->workspaceService = GeneralUtility::makeInstance(WorkspaceService::class);
64 return GeneralUtility::makeInstance(PreviewUriBuilder::class)->buildUriForPage((
int)$uid, 0);
75 return GeneralUtility::makeInstance(PreviewUriBuilder::class)->buildUrisForAllLanguagesOfPage((
int)$uid);
91 $cmd[$table][$t3ver_oid][
'version'] = [
93 'swapWith' => $orig_uid,
113 $cmd[$table][$uid][
'version'] = [
114 'action' =>
'clearWSID'
130 return GeneralUtility::makeInstance(PreviewUriBuilder::class)->buildUriForElement($table, $uid);
143 if (empty($parameter->action) || empty($parameter->selection)) {
144 $result[
'error'] =
'No action or record selection given';
149 $swapIntoWorkspace = ($parameter->action ===
'swap');
150 if ($parameter->action ===
'publish' || $swapIntoWorkspace) {
152 } elseif ($parameter->action ===
'discard') {
157 $result[
'total'] = count($commands);
171 foreach ($selection as $record) {
172 $commands[$record->table][$record->liveId][
'version'] = [
174 'swapWith' => $record->versionId,
175 'swapIntoWS' => (bool)$swapIntoWorkspace,
190 foreach ($selection as $record) {
191 $commands[$record->table][$record->versionId][
'version'] = [
192 'action' =>
'clearWSID',
206 foreach ($model as $column) {
207 $data[$column->column] = [
208 'position' => $column->position,
209 'hidden' => $column->hidden
251 if (is_array($elementRecord)) {
253 $nextStageRecord = $workspaceRecord->getNextStage($elementRecord[
't3ver_stage']);
254 if ($nextStageRecord !==
null) {
255 $this->stageService->getRecordService()->add($table, $uid);
257 $result[
'affects'] = [
259 'nextStage' => $nextStageRecord->getUid(),
260 't3ver_oid' => $t3ver_oid,
267 $result = $this->
getErrorResponse(
'error.sendToNextStage.noRecordFound', 1287264776);
286 if (is_array($elementRecord)) {
288 $stageRecord = $workspaceRecord->getStage($elementRecord[
't3ver_stage']);
290 if ($stageRecord !==
null) {
291 if (!$stageRecord->isEditStage()) {
292 $this->stageService->getRecordService()->add($table, $uid);
293 $previousStageRecord = $stageRecord->getPrevious();
295 $result[
'affects'] = [
298 'nextStage' => $previousStageRecord->getUid()
302 $result = $this->
getErrorResponse(
'error.sendToPrevStage.noPreviousStage', 1287264746);
308 $result = $this->
getErrorResponse(
'error.sendToNextStage.noRecordFound', 1287264765);
324 foreach ($elements as $element) {
325 $this->stageService->getRecordService()->add(
332 $result[
'affects'] = [
333 'nextStage' => $nextStageId
347 public function getRecipientList(array $uidOfRecipients, $additionalRecipients, $stageId)
351 if ($stageRecord ===
null) {
352 throw new \InvalidArgumentException(
353 $this->
getLanguageService()->sL(
'LLL:EXT:workspaces/Resources/Private/Language/locallang.xlf:error.stageId.integer'),
359 $finalRecipients = [];
360 $backendUserIds = $stageRecord->getAllRecipients();
361 foreach ($uidOfRecipients as $userUid) {
363 if (!in_array($userUid, $backendUserIds)) {
367 if (is_array($beUserRecord) && $beUserRecord[
'email'] !==
'') {
368 $uc = $beUserRecord[
'uc'] ? unserialize($beUserRecord[
'uc'], [
'allowed_classes' =>
false]) : [];
369 $recipients[$beUserRecord[
'email']] = [
370 'email' => $beUserRecord[
'email'],
371 'lang' => $uc[
'lang'] ?? $beUserRecord[
'lang']
376 if ($stageRecord->hasPreselection() && !$stageRecord->isPreselectionChangeable()) {
377 $preselectedBackendUsers = $this->stageService->getBackendUsers(
378 implode(
',', $this->stageService->getPreselectedRecipients($stageRecord))
381 foreach ($preselectedBackendUsers as $preselectedBackendUser) {
382 if (empty($preselectedBackendUser[
'email']) || !GeneralUtility::validEmail($preselectedBackendUser[
'email'])) {
385 if (!isset($recipients[$preselectedBackendUser[
'email']])) {
386 $uc = (!empty($preselectedBackendUser[
'uc']) ? unserialize($preselectedBackendUser[
'uc'], [
'allowed_classes' =>
false]) : []);
387 $recipients[$preselectedBackendUser[
'email']] = [
388 'email' => $preselectedBackendUser[
'email'],
389 'lang' => $uc[
'lang'] ?? $preselectedBackendUser[
'lang']
395 if ($additionalRecipients !==
'') {
396 $emails = GeneralUtility::trimExplode(LF, $additionalRecipients,
true);
397 $additionalRecipients = [];
398 foreach ($emails as $email) {
399 $additionalRecipients[$email] = [
'email' => $email];
402 $additionalRecipients = [];
408 $allRecipients = array_merge($additionalRecipients, $recipients);
409 foreach ($allRecipients as $email => $recipientInformation) {
410 if (GeneralUtility::validEmail($email)) {
411 $finalRecipients[] = $recipientInformation;
414 return $finalRecipients;
426 $workspaceItemsArray = $this->workspaceService->selectVersionsInWorkspace(
427 $this->stageService->getWorkspaceId(),
432 $selectionType =
'tables_modify'
434 foreach ($workspaceItemsArray as $tableName => $items) {
435 foreach ($items as $item) {
436 $cmdMapArray[$tableName][$item[
'uid']][
'version'][
'action'] =
'clearWSID';
462 $comment = $parameters->comments;
463 $stageId = $parameters->stageId;
465 throw new \InvalidArgumentException(
'Missing "stageId" in $parameters array.', 1319488194);
467 if (!is_object($parameters->affects) || empty($parameters->affects)) {
468 throw new \InvalidArgumentException(
'Missing "affected items" in $parameters array.', 1319488195);
470 $recipients = $this->
getRecipientList((array)$parameters->recipients, $parameters->additional, $stageId);
471 foreach ($parameters->affects as $tableName => $items) {
472 foreach ($items as $item) {
475 $cmdMapArray[$tableName][$item->t3ver_oid][
'version'][
'action'] =
'swap';
476 $cmdMapArray[$tableName][$item->t3ver_oid][
'version'][
'swapWith'] = $item->uid;
477 $cmdMapArray[$tableName][$item->t3ver_oid][
'version'][
'comment'] = $comment;
478 $cmdMapArray[$tableName][$item->t3ver_oid][
'version'][
'notificationAlternativeRecipients'] = $recipients;
481 $cmdMapArray[$tableName][$item->uid][
'version'][
'action'] =
'setStage';
482 $cmdMapArray[$tableName][$item->uid][
'version'][
'stageId'] = $stageId;
483 $cmdMapArray[$tableName][$item->uid][
'version'][
'comment'] = $comment;
484 $cmdMapArray[$tableName][$item->uid][
'version'][
'notificationAlternativeRecipients'] = $recipients;
492 'refreshLivePanel' => $parameters->stageId == -20
506 if (empty($cmdMapArray)) {
507 $result[
'error'] =
'No commands given to be processed';
511 $dataHandler = GeneralUtility::makeInstance(DataHandler::class);
512 $dataHandler->start([], $cmdMapArray);
513 $dataHandler->process_cmdmap();
515 if ($dataHandler->errorLog) {
516 $result[
'error'] = implode(
'<br/>', $dataHandler->errorLog);
540 $setStageId = $parameters->affects->nextStage;
541 $comments = $parameters->comments;
542 $table = $parameters->affects->table;
543 $uid = $parameters->affects->uid;
544 $t3ver_oid = $parameters->affects->t3ver_oid;
549 $recipients = $this->
getRecipientList((array)$parameters->recipients, $parameters->additional, $setStageId);
551 $cmdArray[$table][$t3ver_oid][
'version'][
'action'] =
'swap';
552 $cmdArray[$table][$t3ver_oid][
'version'][
'swapWith'] = $uid;
553 $cmdArray[$table][$t3ver_oid][
'version'][
'comment'] = $comments;
554 $cmdArray[$table][$t3ver_oid][
'version'][
'notificationAlternativeRecipients'] = $recipients;
556 $cmdArray[$table][$uid][
'version'][
'action'] =
'setStage';
557 $cmdArray[$table][$uid][
'version'][
'stageId'] = $setStageId;
558 $cmdArray[$table][$uid][
'version'][
'comment'] = $comments;
559 $cmdArray[$table][$uid][
'version'][
'notificationAlternativeRecipients'] = $recipients;
587 $setStageId = $parameters->affects->nextStage;
588 $comments = $parameters->comments;
589 $table = $parameters->affects->table;
590 $uid = $parameters->affects->uid;
595 $recipients = $this->
getRecipientList((array)$parameters->recipients, $parameters->additional, $setStageId);
596 $cmdArray[$table][$uid][
'version'][
'action'] =
'setStage';
597 $cmdArray[$table][$uid][
'version'][
'stageId'] = $setStageId;
598 $cmdArray[$table][$uid][
'version'][
'comment'] = $comments;
599 $cmdArray[$table][$uid][
'version'][
'notificationAlternativeRecipients'] = $recipients;
633 $setStageId = $parameters->affects->nextStage;
634 $comments = $parameters->comments;
635 $elements = $parameters->affects->elements;
636 $recipients = $this->
getRecipientList((array)$parameters->recipients, $parameters->additional, $setStageId);
637 foreach ($elements as $element) {
640 if ((
int)$elementRecord[
't3ver_wsid'] === 0) {
645 $cmdArray[$element->table][$element->t3ver_oid][
'version'][
'action'] =
'swap';
646 $cmdArray[$element->table][$element->t3ver_oid][
'version'][
'swapWith'] = $element->uid;
647 $cmdArray[$element->table][$element->t3ver_oid][
'version'][
'comment'] = $comments;
648 $cmdArray[$element->table][$element->t3ver_oid][
'version'][
'notificationAlternativeRecipients'] = $recipients;
650 $cmdArray[$element->table][$element->uid][
'version'][
'action'] =
'setStage';
651 $cmdArray[$element->table][$element->uid][
'version'][
'stageId'] = $setStageId;
652 $cmdArray[$element->table][$element->uid][
'version'][
'comment'] = $comments;
653 $cmdArray[$element->table][$element->uid][
'version'][
'notificationAlternativeRecipients'] = $recipients;
671 if (!$nextStage instanceof StageRecord) {
676 if ($nextStage->isDialogEnabled()) {
678 $result[
'additional'] = [
679 'type' =>
'textarea',
683 $result[
'comments'] = [
684 'type' =>
'textarea',
685 'value' => $nextStage->isInternal() ?
'' : $nextStage->getDefaultComment()
699 if (!$stageRecord instanceof StageRecord) {
704 $allRecipients = $this->stageService->getResponsibleBeUser($stageRecord);
706 $isPreselectionChangeable = $stageRecord->isPreselectionChangeable();
708 foreach ($allRecipients as $backendUserId => $backendUser) {
709 if (empty($backendUser[
'email']) || !GeneralUtility::validEmail($backendUser[
'email'])) {
713 $name = (!empty($backendUser[
'realName']) ? $backendUser[
'realName'] : $backendUser[
'username']);
714 $checked = in_array($backendUserId, $preselectedRecipients);
715 $disabled = ($checked && !$isPreselectionChangeable);
718 'label' => sprintf(
'%s (%s)', $name, $backendUser[
'email']),
719 'value' => $backendUserId,
720 'name' =>
'recipients-' . $backendUserId,
721 'checked' => $checked,
722 'disabled' => $disabled
737 $result = $this->stageService->getPropertyOfCurrentWorkspaceStage($stage,
'default_mailcomment');
749 $workspaceItemsArray = $this->workspaceService->selectVersionsInWorkspace(
750 $this->stageService->getWorkspaceId(),
755 $selectionType =
'tables_modify'
757 list($currentStage, $previousStage) = $this->stageService->getPreviousStageForElementCollection($workspaceItemsArray);
759 $workspaceItemsArray = $this->workspaceService->selectVersionsInWorkspace(
760 $this->stageService->getWorkspaceId(),
762 $currentStage[
'uid'],
765 $selectionType =
'tables_modify'
768 $result = array_merge($stageFormFields, [
769 'title' =>
'Status message: Page send to next stage - ID: ' . $id .
' - Next stage title: ' . $previousStage[
'title'],
771 'affects' => $workspaceItemsArray,
772 'stageId' => $previousStage[
'uid']
783 $workspaceItemsArray = $this->workspaceService->selectVersionsInWorkspace(
784 $this->stageService->getWorkspaceId(),
789 $selectionType =
'tables_modify'
791 list($currentStage, $nextStage) = $this->stageService->getNextStageForElementCollection($workspaceItemsArray);
793 $workspaceItemsArray = $this->workspaceService->selectVersionsInWorkspace(
794 $this->stageService->getWorkspaceId(),
796 $currentStage[
'uid'],
799 $selectionType =
'tables_modify'
802 $result = array_merge($stageFormFields, [
803 'title' =>
'Status message: Page send to next stage - ID: ' . $id .
' - Next stage title: ' . $nextStage[
'title'],
804 'affects' => $workspaceItemsArray,
805 'stageId' => $nextStage[
'uid']
819 $workspaceItemsArray = $this->workspaceService->selectVersionsInWorkspace(
820 $this->stageService->getWorkspaceId(),
825 $selectionType =
'tables_modify'
827 list(, $nextStage) = $this->stageService->getNextStageForElementCollection($workspaceItemsArray);
828 list(, $previousStage) = $this->stageService->getPreviousStageForElementCollection($workspaceItemsArray);
830 $view = GeneralUtility::makeInstance(StandaloneView::class);
832 $view->setPartialRootPaths([
'default' => $extensionPath .
'Resources/Private/Partials']);
833 $view->setTemplatePathAndFilename($extensionPath .
'Resources/Private/Templates/Preview/Ajax/StageButtons.html');
834 $request = $view->getRequest();
835 $request->setControllerExtensionName(
'workspaces');
836 $view->assignMultiple([
837 'enablePreviousStageButton' => is_array($previousStage) && !empty($previousStage),
838 'enableNextStageButton' => is_array($nextStage) && !empty($nextStage),
839 'enableDiscardStageButton' => is_array($nextStage) && !empty($nextStage) || is_array($previousStage) && !empty($previousStage),
840 'nextStage' => $nextStage[
'title'],
841 'nextStageId' => $nextStage[
'uid'],
842 'prevStage' => $previousStage[
'title'],
843 'prevStageId' => $previousStage[
'uid'],
845 $renderedView = $view->render();
846 return $renderedView;
856 $workspaceId = (int)$workspaceId;
859 if ($currentWorkspace !== $workspaceId) {
862 'Cannot set temporary workspace to "' . $workspaceId .
'"',
868 return $currentWorkspace;
895 protected function getErrorResponse($errorLabel, $errorCode = 0, $successFlagValue =
false)
897 $localLangFile =
'LLL:EXT:workspaces/Resources/Private/Language/locallang.xlf';
900 'code' => $errorCode,
903 'success' => $successFlagValue
915 return $this->workspaceService->getCurrentWorkspace();