57 $availableWorkspaces = [];
59 if (
$GLOBALS[
'BE_USER']->checkWorkspace([
'uid' => (
string)self::LIVE_WORKSPACE_ID])) {
63 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'sys_workspace');
64 $queryBuilder->getRestrictions()
65 ->add(GeneralUtility::makeInstance(RootLevelRestriction::class));
67 $result = $queryBuilder
68 ->select(
'uid',
'title',
'adminusers',
'members')
69 ->from(
'sys_workspace')
73 while ($workspace = $result->fetch()) {
74 if (
$GLOBALS[
'BE_USER']->checkWorkspace($workspace)) {
75 $availableWorkspaces[$workspace[
'uid']] = $workspace[
'title'];
78 return $availableWorkspaces;
88 $workspaceId =
$GLOBALS[
'BE_USER']->workspace;
89 $activeId =
$GLOBALS[
'BE_USER']->getSessionData(
'tx_workspace_activeWorkspace');
92 if ($activeId !==
null && $activeId !== self::SELECT_ALL_WORKSPACES) {
94 if (isset($availableWorkspaces[$activeId])) {
95 $workspaceId = $activeId;
114 $title =
$GLOBALS[
'LANG']->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:shortcut_onlineWS');
117 $labelField =
$GLOBALS[
'TCA'][
'sys_workspace'][
'ctrl'][
'label'];
119 if (is_array($wsRecord)) {
120 $title = $wsRecord[$labelField];
123 if ($title ===
false) {
124 throw new \InvalidArgumentException(
'No such workspace defined', 1476045469);
147 if ($workspaceRec[
'publish_access'] & 1) {
154 foreach ($versions as $table => $records) {
155 foreach ($records as $rec) {
157 $cmd[$table][$rec[
't3ver_oid']][
'version'] = [
'action' =>
'swap',
'swapWith' => $rec[
'uid'],
'swapIntoWS' => $doSwap ? 1 : 0];
183 foreach ($versions as $table => $records) {
184 foreach ($records as $rec) {
186 $cmd[$table][$rec[
'uid']][
'version'] = [
'action' => $flush ?
'flush' :
'clearWSID'];
207 public function selectVersionsInWorkspace($wsid, $filter = 0, $stage = -99, $pageId = -1, $recursionLevel = 0, $selectionType =
'tables_select', $language =
null)
210 $filter = (int)$filter;
213 if ($pageId != -1 && $recursionLevel > 0) {
214 $pageList = $this->
getTreeUids($pageId, $wsid, $recursionLevel);
215 } elseif ($pageId != -1) {
220 $mountPoints = array_map(
'intval',
$GLOBALS[
'BE_USER']->returnWebmounts());
221 $mountPoints = array_unique($mountPoints);
222 if (!in_array(0, $mountPoints)) {
224 foreach ($mountPoints as $mountPoint) {
225 $tempPageIds[] = $this->
getTreeUids($mountPoint, $wsid, $recursionLevel);
227 $pageList = implode(
',', $tempPageIds);
228 $pageList = implode(
',', array_unique(explode(
',', $pageList)));
232 foreach (
$GLOBALS[
'TCA'] as $table => $cfg) {
234 if (!
$GLOBALS[
'BE_USER']->check($selectionType, $table)) {
237 if (
$GLOBALS[
'TCA'][$table][
'ctrl'][
'versioningWS']) {
240 $recs = array_merge($recs, $moveRecs);
269 $languageParentField =
'';
272 if ($isTableLocalizable ===
false && $language > 0) {
275 if ($isTableLocalizable) {
276 $languageParentField =
'A.' .
$GLOBALS[
'TCA'][$table][
'ctrl'][
'transOrigPointerField'];
279 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table);
280 $queryBuilder->getRestrictions()->removeAll()
281 ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
283 $fields = [
'A.uid',
'A.pid',
'A.t3ver_oid',
'A.t3ver_stage',
'B.pid',
'B.pid AS wspid',
'B.pid AS livepid'];
284 if ($isTableLocalizable) {
291 $queryBuilder->expr()->eq(
293 $queryBuilder->createNamedParameter(-1, \PDO::PARAM_INT)
295 $queryBuilder->expr()->gte(
297 $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)
299 $queryBuilder->expr()->neq(
301 $queryBuilder->createNamedParameter(
309 $pageIdRestriction = GeneralUtility::intExplode(
',', $pageList,
true);
310 if ($table ===
'pages') {
311 $constraints[] = $queryBuilder->expr()->orX(
312 $queryBuilder->expr()->in(
314 $queryBuilder->createNamedParameter(
316 Connection::PARAM_INT_ARRAY
319 $queryBuilder->expr()->in(
320 'B.' .
$GLOBALS[
'TCA'][$table][
'ctrl'][
'transOrigPointerField'],
321 $queryBuilder->createNamedParameter(
323 Connection::PARAM_INT_ARRAY
328 $constraints[] = $queryBuilder->expr()->in(
330 $queryBuilder->createNamedParameter(
332 Connection::PARAM_INT_ARRAY
339 $constraints[] = $queryBuilder->expr()->eq(
340 'A.' .
$GLOBALS[
'TCA'][$table][
'ctrl'][
'languageField'],
341 $queryBuilder->createNamedParameter($language, \PDO::PARAM_INT)
348 if ($wsid > self::SELECT_ALL_WORKSPACES) {
349 $constraints[] = $queryBuilder->expr()->eq(
351 $queryBuilder->createNamedParameter($wsid, \PDO::PARAM_INT)
353 } elseif ($wsid === self::SELECT_ALL_WORKSPACES) {
354 $constraints[] = $queryBuilder->expr()->neq(
356 $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)
364 $constraints[] = $queryBuilder->expr()->eq(
366 $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)
368 } elseif ($filter === 2) {
369 $constraints[] = $queryBuilder->expr()->gt(
371 $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)
375 if ((
int)$stage !== -99) {
376 $constraints[] = $queryBuilder->expr()->eq(
378 $queryBuilder->createNamedParameter($stage, \PDO::PARAM_INT)
383 $constraints[] = $queryBuilder->expr()->eq(
'A.t3ver_oid', $queryBuilder->quoteIdentifier(
'B.uid'));
389 $rows = $queryBuilder->select(...
$fields)
392 ->where(...$constraints)
412 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table);
413 $queryBuilder->getRestrictions()->removeAll()
414 ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
421 $queryBuilder->expr()->eq(
423 $queryBuilder->createNamedParameter(
428 $queryBuilder->expr()->gt(
430 $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)
432 $queryBuilder->expr()->eq(
434 $queryBuilder->createNamedParameter(
439 $queryBuilder->expr()->eq(
441 $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)
443 $queryBuilder->expr()->eq(
445 $queryBuilder->createNamedParameter(-1, \PDO::PARAM_INT)
447 $queryBuilder->expr()->eq(
449 $queryBuilder->createNamedParameter(
454 $queryBuilder->expr()->eq(
'A.t3ver_move_id', $queryBuilder->quoteIdentifier(
'B.uid')),
455 $queryBuilder->expr()->eq(
'B.uid', $queryBuilder->quoteIdentifier(
'C.t3ver_oid'))
458 if ($wsid > self::SELECT_ALL_WORKSPACES) {
459 $constraints[] = $queryBuilder->expr()->eq(
461 $queryBuilder->createNamedParameter($wsid, \PDO::PARAM_INT)
463 $constraints[] = $queryBuilder->expr()->eq(
465 $queryBuilder->createNamedParameter($wsid, \PDO::PARAM_INT)
467 } elseif ($wsid === self::SELECT_ALL_WORKSPACES) {
468 $constraints[] = $queryBuilder->expr()->neq(
470 $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)
472 $constraints[] = $queryBuilder->expr()->neq(
474 $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)
482 $constraints[] = $queryBuilder->expr()->eq(
484 $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)
486 } elseif ($filter === 2) {
487 $constraints[] = $queryBuilder->expr()->gt(
489 $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)
493 if ((
int)$stage != -99) {
494 $constraints[] = $queryBuilder->expr()->eq(
496 $queryBuilder->createNamedParameter($stage, \PDO::PARAM_INT)
501 $pageIdRestriction = GeneralUtility::intExplode(
',', $pageList,
true);
502 if ($table ===
'pages') {
503 $constraints[] = $queryBuilder->expr()->orX(
504 $queryBuilder->expr()->in(
506 $queryBuilder->createNamedParameter(
508 Connection::PARAM_INT_ARRAY
511 $queryBuilder->expr()->in(
512 'B.' .
$GLOBALS[
'TCA'][$table][
'ctrl'][
'transOrigPointerField'],
513 $queryBuilder->createNamedParameter(
515 Connection::PARAM_INT_ARRAY
520 $constraints[] = $queryBuilder->expr()->in(
522 $queryBuilder->createNamedParameter(
524 Connection::PARAM_INT_ARRAY
530 $rows = $queryBuilder
531 ->select(
'A.pid AS wspid',
'B.uid AS t3ver_oid',
'C.uid AS uid',
'B.pid AS livepid')
535 ->where(...$constraints)
551 protected function getTreeUids($pageId, $wsid, $recursionLevel)
556 $searchObj = GeneralUtility::makeInstance(QueryView::class);
558 $pageList = $searchObj->getTreeList($pageId, $recursionLevel, 0, $perms_clause);
560 $mountPoints =
$GLOBALS[
'BE_USER']->uc[
'pageTree_temporaryMountPoint'];
561 if (!is_array($mountPoints) || empty($mountPoints)) {
562 $mountPoints = array_map(
'intval',
$GLOBALS[
'BE_USER']->returnWebmounts());
563 $mountPoints = array_unique($mountPoints);
566 foreach ($mountPoints as $mountPoint) {
567 $newList[] = $searchObj->getTreeList($mountPoint, $recursionLevel, 0, $perms_clause);
569 $pageList = implode(
',', $newList);
575 $pageIds = GeneralUtility::intExplode(
',', $pageList,
true);
576 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'pages');
577 $queryBuilder->getRestrictions()
579 ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
580 $result = $queryBuilder
581 ->select(
'uid',
'pid',
't3ver_move_id')
584 $queryBuilder->expr()->in(
586 $queryBuilder->createNamedParameter($pageIds, Connection::PARAM_INT_ARRAY)
588 $queryBuilder->expr()->eq(
590 $queryBuilder->createNamedParameter($wsid, \PDO::PARAM_INT)
596 $movedAwayPages = [];
597 while ($row = $result->fetch()) {
598 $movedAwayPages[$row[
't3ver_move_id']] = $row;
602 $newList = array_diff($pageIds, array_keys($movedAwayPages));
604 $newList[] = $pageId;
608 foreach ($movedAwayPages as $uid => $rec) {
609 if (in_array($rec[
'pid'], $newList) && !in_array($uid, $newList)) {
617 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'pages');
618 $queryBuilder->getRestrictions()
620 ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
621 $result = $queryBuilder->select(
'uid',
't3ver_move_id')
624 $queryBuilder->expr()->in(
626 $queryBuilder->createNamedParameter($newList, Connection::PARAM_INT_ARRAY)
633 while ($row = $result->fetch()) {
634 $pages[$row[
'uid']] = $row;
638 if (!in_array($pageId, $pageIds)) {
639 $pageIds[] = $pageId;
643 foreach ($pageIds as $pageId) {
644 if ((
int)$pages[$pageId][
't3ver_move_id'] > 0) {
645 $newList[] = (int)$pages[$pageId][
't3ver_move_id'];
647 $newList[] = $pageId;
650 $pageList = implode(
',', $newList);
665 $permittedElements = [];
666 if (is_array($recs)) {
667 foreach ($recs as $rec) {
669 $permittedElements[] = $rec;
673 return $permittedElements;
685 $pageIdField = $table ===
'pages' ?
'uid' :
'wspid';
686 $pageId = isset($record[$pageIdField]) ? (int)$record[$pageIdField] :
null;
687 if ($pageId ===
null) {
693 $page =
BackendUtility::getRecord(
'pages', $pageId,
'uid,pid,perms_userid,perms_user,perms_groupid,perms_group,perms_everybody');
695 return $GLOBALS[
'BE_USER']->doesUserHaveAccess($page, 1);
708 $languageUid = $record[
$GLOBALS[
'TCA'][$table][
'ctrl'][
'languageField']];
712 return $GLOBALS[
'BE_USER']->checkLanguageAccess($languageUid);
722 public static function isNewPage($id, $language = 0)
727 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
728 ->getQueryBuilderForTable(
'pages');
729 $queryBuilder->getRestrictions()
731 ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
732 $row = $queryBuilder->select(
't3ver_state')
735 $queryBuilder->expr()->eq(
736 $GLOBALS[
'TCA'][
'pages'][
'ctrl'][
'transOrigPointerField'],
737 $queryBuilder->createNamedParameter($id, \PDO::PARAM_INT)
739 $queryBuilder->expr()->eq(
740 $GLOBALS[
'TCA'][
'pages'][
'ctrl'][
'languageField'],
741 $queryBuilder->createNamedParameter($language, \PDO::PARAM_INT)
743 $queryBuilder->expr()->eq(
745 $queryBuilder->createNamedParameter(
$GLOBALS[
'BE_USER']->workspace, \PDO::PARAM_INT)
752 if ($row !==
false) {
757 if (is_array($rec)) {
773 if ((
int)$workspaceId === 0 || (
int)$pageId === 0) {
777 if (isset($this->versionsOnPageCache[$workspaceId][$pageId])) {
778 return $this->versionsOnPageCache[$workspaceId][$pageId];
781 $this->versionsOnPageCache[$workspaceId][$pageId] =
false;
783 foreach (
$GLOBALS[
'TCA'] as $tableName => $tableConfiguration) {
784 if ($tableName ===
'pages' || empty($tableConfiguration[
'ctrl'][
'versioningWS'])) {
790 if (!empty($pages[(
string)$pageId])) {
791 $this->versionsOnPageCache[$workspaceId][$pageId] =
true;
797 'workspaceId' => $workspaceId,
801 foreach (
$GLOBALS[
'TYPO3_CONF_VARS'][
'SC_OPTIONS'][
'TYPO3\\CMS\\Workspaces\\Service\\WorkspaceService'][
'hasPageRecordVersions'] ?? [] as $hookFunction) {
802 GeneralUtility::callUserFunction($hookFunction, $parameters, $this);
805 return $this->versionsOnPageCache[$workspaceId][$pageId];
833 foreach (
$GLOBALS[
'TCA'] as $tableName => $tableConfiguration) {
834 if ($tableName ===
'pages' || empty($tableConfiguration[
'ctrl'][
'versioningWS'])) {
841 return $this->pagesWithVersionsInTable[$workspaceId];
861 if ((
int)$workspaceId === 0) {
865 if (!isset($this->pagesWithVersionsInTable[$workspaceId])) {
866 $this->pagesWithVersionsInTable[$workspaceId] = [];
869 if (!isset($this->pagesWithVersionsInTable[$workspaceId][$tableName])) {
870 $this->pagesWithVersionsInTable[$workspaceId][$tableName] = [];
872 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($tableName);
873 $queryBuilder->getRestrictions()
875 ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
877 $movePointerParameter = $queryBuilder->createNamedParameter(
881 $workspaceIdParameter = $queryBuilder->createNamedParameter(
885 $pageIdParameter = $queryBuilder->createNamedParameter(
892 ->
from($tableName,
'A')
894 $queryBuilder->expr()->eq(
'A.pid', $pageIdParameter),
895 $queryBuilder->expr()->eq(
'A.t3ver_wsid', $workspaceIdParameter),
896 $queryBuilder->expr()->neq(
'A.t3ver_state', $movePointerParameter)
900 ->
from($tableName,
'A')
902 $queryBuilder->expr()->eq(
'A.pid', $pageIdParameter),
903 $queryBuilder->expr()->eq(
'A.t3ver_wsid', $workspaceIdParameter),
904 $queryBuilder->expr()->eq(
'A.t3ver_state', $movePointerParameter)
906 $subQuery =
'%s IN (%s)';
908 $result = $queryBuilder
910 ->
from($tableName,
'B')
914 $queryBuilder->quoteIdentifier(
'B.uid'),
915 $versionQueryBuilder->getSQL()
919 $queryBuilder->quoteIdentifier(
'B.t3ver_move_id'),
920 $movePointerQueryBuilder->getSQL()
927 while ($row = $result->fetch()) {
928 $pageIds[$row[
'pageId']] =
true;
931 $this->pagesWithVersionsInTable[$workspaceId][$tableName] = $pageIds;
934 'workspaceId' => $workspaceId,
935 'tableName' => $tableName,
938 foreach (
$GLOBALS[
'TYPO3_CONF_VARS'][
'SC_OPTIONS'][
'TYPO3\\CMS\\Workspaces\\Service\\WorkspaceService'][
'fetchPagesWithVersionsInTable'] ?? [] as $hookFunction) {
939 GeneralUtility::callUserFunction($hookFunction, $parameters, $this);
943 return $this->pagesWithVersionsInTable[$workspaceId][$tableName];
952 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
953 ->getQueryBuilderForTable($tableName);
956 ->
add(GeneralUtility::makeInstance(DeletedRestriction::class));
957 return $queryBuilder;