From b9af000053c76609ce327275411347f483797105 Mon Sep 17 00:00:00 2001 From: Oliver Hader <oliver@typo3.org> Date: Fri, 8 Nov 2019 18:09:24 +0100 Subject: [PATCH] [BUGFIX] Synchronize TCA enable columns from workspace version In case workspace placeholders (new or move) are involved corresponding explicit TCA control settings in either shadowColumnsForMovePlaceholders or shadowColumnsForNewPlaceholders are used to update those field values and synchronize workspace versions with their placeholder records. Since the data-retrieval process first queries live version pendants and then tries to overlay those records with version information, values for enable columns shall be synchronized automatically - otherwise possible HiddenRestriction or StartTimeRestriction would deny selecting live versions already in the first place. Resolves: #89455 Releases: master, 9.5 Change-Id: Ic5763866d5adf4dcb30db3f553edf19eb0c76239 Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/62020 Tested-by: TYPO3com <noreply@typo3.com> Tested-by: Achim Fritz <af@achimfritz.de> Tested-by: Benni Mack <benni@typo3.org> Reviewed-by: Achim Fritz <af@achimfritz.de> Reviewed-by: Benni Mack <benni@typo3.org> --- Build/Scripts/checkIntegrityCsvFixtures.php | 4 + .../core/Classes/DataHandling/DataHandler.php | 70 ++++++---- .../PlaceholderShadowColumnsResolver.php | 132 ++++++++++++++++++ .../Regular/AbstractActionTestCase.php | 16 +++ .../Classes/Hook/DataHandlerHook.php | 18 ++- .../Regular/Modify/ActionTest.php | 51 ++++++- .../Regular/Modify/DataSet/hideContent.csv | 14 ++ .../hideContentAndMoveToDifferentPage.csv | 15 ++ .../DataSet/localizeContentWHideAtCopy.csv | 2 +- .../moveContentToDifferentPageAndHide.csv | 15 ++ 10 files changed, 298 insertions(+), 39 deletions(-) create mode 100644 typo3/sysext/core/Classes/DataHandling/PlaceholderShadowColumnsResolver.php create mode 100644 typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/DataSet/hideContent.csv create mode 100644 typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/DataSet/hideContentAndMoveToDifferentPage.csv create mode 100644 typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/DataSet/moveContentToDifferentPageAndHide.csv diff --git a/Build/Scripts/checkIntegrityCsvFixtures.php b/Build/Scripts/checkIntegrityCsvFixtures.php index e2dd83330eaf..fe4ad2ed98e7 100755 --- a/Build/Scripts/checkIntegrityCsvFixtures.php +++ b/Build/Scripts/checkIntegrityCsvFixtures.php @@ -94,6 +94,10 @@ class checkIntegrityCsvFixtures $columnCount = count($columns); } else { if (count($columns) !== $columnCount) { + // Skip CSV lines with starting with comments + if (count($columns) === 1 && strpos($columns[0], '#') === 0) { + continue; + } return 'Line ' . ($index + 1) . '; Expected column count: ' . $columnCount . '; Actual: ' . count($columns); } } diff --git a/typo3/sysext/core/Classes/DataHandling/DataHandler.php b/typo3/sysext/core/Classes/DataHandling/DataHandler.php index 83bd2fe7d4e5..e488d23e2d25 100644 --- a/typo3/sysext/core/Classes/DataHandling/DataHandler.php +++ b/typo3/sysext/core/Classes/DataHandling/DataHandler.php @@ -1244,40 +1244,58 @@ class DataHandler implements LoggerAwareInterface } /** - * Fix shadowing of data in case we are editing an offline version of a live "New" placeholder record: + * Fix shadowing of data in case we are editing an offline version of a live "New" placeholder record. * * @param string $table Table name * @param int $id Record uid */ public function placeholderShadowing($table, $id) { - if ($liveRec = BackendUtility::getLiveVersionOfRecord($table, $id, '*')) { - if (VersionState::cast($liveRec['t3ver_state'])->indicatesPlaceholder()) { - $justStoredRecord = BackendUtility::getRecord($table, $id); - $newRecord = []; - $shadowCols = $GLOBALS['TCA'][$table]['ctrl']['shadowColumnsForNewPlaceholders']; - $shadowCols .= ',' . $GLOBALS['TCA'][$table]['ctrl']['languageField']; - $shadowCols .= ',' . $GLOBALS['TCA'][$table]['ctrl']['transOrigPointerField']; - if (isset($GLOBALS['TCA'][$table]['ctrl']['translationSource'])) { - $shadowCols .= ',' . $GLOBALS['TCA'][$table]['ctrl']['translationSource']; - } - $shadowCols .= ',' . $GLOBALS['TCA'][$table]['ctrl']['type']; - $shadowCols .= ',' . $GLOBALS['TCA'][$table]['ctrl']['label']; - $shadowCols .= ',' . implode(',', GeneralUtility::makeInstance(SlugEnricher::class)->resolveSlugFieldNames($table)); - $shadowColumns = array_unique(GeneralUtility::trimExplode(',', $shadowCols, true)); - foreach ($shadowColumns as $fieldName) { - if ((string)$justStoredRecord[$fieldName] !== (string)$liveRec[$fieldName] && isset($GLOBALS['TCA'][$table]['columns'][$fieldName]) && $fieldName !== 'uid' && $fieldName !== 'pid') { - $newRecord[$fieldName] = $justStoredRecord[$fieldName]; - } - } - if (!empty($newRecord)) { - if ($this->enableLogging) { - $this->log($table, $liveRec['uid'], SystemLogGenericAction::UNDEFINED, 0, SystemLogErrorClassification::MESSAGE, 'Shadowing done on fields <i>' . implode(',', array_keys($newRecord)) . '</i> in placeholder record ' . $table . ':' . $liveRec['uid'] . ' (offline version UID=' . $id . ')', -1, [], $this->eventPid($table, $liveRec['uid'], $liveRec['pid'])); - } - $this->updateDB($table, $liveRec['uid'], $newRecord); - } + $liveRecord = BackendUtility::getLiveVersionOfRecord($table, $id, '*'); + if (empty($liveRecord)) { + return; + } + + $liveState = VersionState::cast($liveRecord['t3ver_state']); + $versionRecord = BackendUtility::getRecord($table, $id); + $versionState = VersionState::cast($versionRecord['t3ver_state']); + + if (!$liveState->indicatesPlaceholder() && !$versionState->indicatesPlaceholder()) { + return; + } + $factory = GeneralUtility::makeInstance( + PlaceholderShadowColumnsResolver::class, + $table, + $GLOBALS['TCA'][$table] ?? [] + ); + + if ($versionState->equals(VersionState::MOVE_POINTER)) { + $placeholderRecord = BackendUtility::getMovePlaceholder($table, $liveRecord['uid'], '*', $versionRecord['t3ver_wsid']); + $shadowColumns = $factory->forMovePlaceholder(); + } elseif ($liveState->indicatesPlaceholder()) { + $placeholderRecord = $liveRecord; + $shadowColumns = $factory->forNewPlaceholder(); + } else { + return; + } + if (empty($shadowColumns)) { + return; + } + + $placeholderValues = []; + foreach ($shadowColumns as $fieldName) { + if ((string)$versionRecord[$fieldName] !== (string)$placeholderRecord[$fieldName]) { + $placeholderValues[$fieldName] = $versionRecord[$fieldName]; } } + if (empty($placeholderValues)) { + return; + } + + if ($this->enableLogging) { + $this->log($table, $placeholderRecord['uid'], SystemLogGenericAction::UNDEFINED, 0, SystemLogErrorClassification::MESSAGE, 'Shadowing done on fields <i>' . implode(',', array_keys($placeholderValues)) . '</i> in placeholder record ' . $table . ':' . $liveRecord['uid'] . ' (offline version UID=' . $id . ')', -1, [], $this->eventPid($table, $liveRecord['uid'], $liveRecord['pid'])); + } + $this->updateDB($table, $placeholderRecord['uid'], $placeholderValues); } /** diff --git a/typo3/sysext/core/Classes/DataHandling/PlaceholderShadowColumnsResolver.php b/typo3/sysext/core/Classes/DataHandling/PlaceholderShadowColumnsResolver.php new file mode 100644 index 000000000000..87763be45b06 --- /dev/null +++ b/typo3/sysext/core/Classes/DataHandling/PlaceholderShadowColumnsResolver.php @@ -0,0 +1,132 @@ +<?php +declare(strict_types = 1); + +namespace TYPO3\CMS\Core\DataHandling; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Exception; +use TYPO3\CMS\Core\Utility\GeneralUtility; + +/** + * Resolver for placeholder shadow columns to be used in workspace aware environments. + * + * Certain fields need to be "shadowed" - NEW and MOVE placeholder need to have values kept in sync + * that are modified, like the "hidden" field (enable fields, slug fields etc). + * + * This class resolves the columns for a TCA table record that should be kept in sync. + * + * @see \TYPO3\CMS\Core\DataHandling\DataHandler::placeholderShadowing() + * @see \TYPO3\CMS\Workspaces\Hook\DataHandlerHook::moveRecord_wsPlaceholders() + */ +class PlaceholderShadowColumnsResolver +{ + protected const CONTROL_COLUMNS = [ + 'languageField', + 'transOrigPointerField', + 'translationSource', + 'type', + 'label' + ]; + + protected const FLAG_NONE = 0; + protected const FLAG_APPLY_SYSTEM_COLUMNS = 1; + protected const FLAG_APPLY_SLUG_COLUMNS = 2; + + /** + * @var string + */ + protected $tableName; + + /** + * @var array + */ + protected $tableConfiguration; + + /** + * @var int|null + */ + protected $flags; + + /** + * @param string $tableName Name of the database table + * @param array $tableConfiguration TCA configuration for $tableName + * @throws Exception + */ + public function __construct(string $tableName, array $tableConfiguration) + { + $this->tableName = $tableName; + $this->tableConfiguration = $tableConfiguration; + + if (empty($this->tableName) || empty($this->tableConfiguration)) { + throw new Exception('No table name and TCA given', 1574174231); + } + } + + /** + * @param int|null $flags Custom flags to adjust resolving behavior + * @return string[] Placeholder shadow column names + */ + public function forNewPlaceholder(int $flags = null): array + { + $flags = $flags ?? self::FLAG_APPLY_SYSTEM_COLUMNS | self::FLAG_APPLY_SLUG_COLUMNS; + $shadowColumnsList = $this->tableConfiguration['ctrl']['shadowColumnsForNewPlaceholders'] ?? ''; + return $this->forTable($shadowColumnsList, $flags); + } + + /** + * @param int|null $flags Custom flags to adjust resolving behavior + * @return string[] Placeholder shadow column names + */ + public function forMovePlaceholder(int $flags = null): array + { + $shadowColumnsList = $this->tableConfiguration['ctrl']['shadowColumnsForMovePlaceholders'] + ?? $this->tableConfiguration['ctrl']['shadowColumnsForNewPlaceholders'] ?? ''; + // @todo Applying same flags as for new-placeholders would streamline database integrity + return $this->forTable($shadowColumnsList, $flags); + } + + protected function forTable(string $shadowColumnsList, int $flags = null): array + { + $shadowColumns = explode(',', $shadowColumnsList); + $flags = $flags ?? self::FLAG_NONE; + + if ($flags & self::FLAG_APPLY_SYSTEM_COLUMNS) { + foreach (self::CONTROL_COLUMNS as $controlColumn) { + if (isset($this->tableConfiguration['ctrl'][$controlColumn])) { + $shadowColumns[] = $this->tableConfiguration['ctrl'][$controlColumn]; + } + } + } + if ($flags & self::FLAG_APPLY_SLUG_COLUMNS) { + $shadowColumns = array_merge( + $shadowColumns, + GeneralUtility::makeInstance(SlugEnricher::class)->resolveSlugFieldNames($this->tableName) + ); + } + foreach ($this->tableConfiguration['ctrl']['enablecolumns'] ?? [] as $enableColumn) { + $shadowColumns[] = $enableColumn; + } + + $shadowColumns = array_filter( + array_map('trim', $shadowColumns), + function (string $shadowColumn) { + return !empty($shadowColumn) && $shadowColumn !== 'uid' && $shadowColumn !== 'pid' + && isset($this->tableConfiguration['columns'][$shadowColumn]); + } + ); + $shadowColumns = array_unique($shadowColumns); + return $shadowColumns; + } +} diff --git a/typo3/sysext/core/Tests/Functional/DataHandling/Regular/AbstractActionTestCase.php b/typo3/sysext/core/Tests/Functional/DataHandling/Regular/AbstractActionTestCase.php index 8898854fd143..f017dd37a866 100644 --- a/typo3/sysext/core/Tests/Functional/DataHandling/Regular/AbstractActionTestCase.php +++ b/typo3/sysext/core/Tests/Functional/DataHandling/Regular/AbstractActionTestCase.php @@ -86,6 +86,14 @@ abstract class AbstractActionTestCase extends \TYPO3\CMS\Core\Tests\Functional\D $this->actionService->modifyRecord(self::TABLE_Content, self::VALUE_ContentIdSecond, ['header' => 'Testing #1']); } + /** + * See DataSet/hideContent.csv + */ + public function hideContent() + { + $this->actionService->modifyRecord(self::TABLE_Content, self::VALUE_ContentIdSecond, ['hidden' => '1']); + } + /** * See DataSet/deleteContentRecord.csv */ @@ -305,6 +313,14 @@ abstract class AbstractActionTestCase extends \TYPO3\CMS\Core\Tests\Functional\D $this->actionService->moveRecord(self::TABLE_Content, self::VALUE_ContentIdFirst, -self::VALUE_ContentIdSecond); } + /** + * See DataSet/moveContentRecordToDifferentPageAndHide.csv + */ + public function moveContentToDifferentPageAndHide() + { + $this->actionService->moveRecord(self::TABLE_Content, self::VALUE_ContentIdSecond, self::VALUE_PageIdTarget, ['hidden' => '1']); + } + /** * Page records */ diff --git a/typo3/sysext/workspaces/Classes/Hook/DataHandlerHook.php b/typo3/sysext/workspaces/Classes/Hook/DataHandlerHook.php index dea171863dc2..3246bfbd2dcf 100644 --- a/typo3/sysext/workspaces/Classes/Hook/DataHandlerHook.php +++ b/typo3/sysext/workspaces/Classes/Hook/DataHandlerHook.php @@ -28,6 +28,7 @@ use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction; use TYPO3\CMS\Core\Database\ReferenceIndex; use TYPO3\CMS\Core\Database\RelationHandler; use TYPO3\CMS\Core\DataHandling\DataHandler; +use TYPO3\CMS\Core\DataHandling\PlaceholderShadowColumnsResolver; use TYPO3\CMS\Core\Localization\LanguageService; use TYPO3\CMS\Core\Mail\MailMessage; use TYPO3\CMS\Core\Service\MarkerBasedTemplateService; @@ -1544,18 +1545,15 @@ class DataHandlerHook // represents the position to where the record is eventually moved to. $newVersion_placeholderFieldArray = []; - // Use property for move placeholders if set (since TYPO3 CMS 6.2) - if (isset($GLOBALS['TCA'][$table]['ctrl']['shadowColumnsForMovePlaceholders'])) { - $shadowColumnsForMovePlaceholder = $GLOBALS['TCA'][$table]['ctrl']['shadowColumnsForMovePlaceholders']; - } elseif (isset($GLOBALS['TCA'][$table]['ctrl']['shadowColumnsForNewPlaceholders'])) { - // Fallback to property for new placeholder (existed long time before TYPO3 CMS 6.2) - $shadowColumnsForMovePlaceholder = $GLOBALS['TCA'][$table]['ctrl']['shadowColumnsForNewPlaceholders']; - } - + $factory = GeneralUtility::makeInstance( + PlaceholderShadowColumnsResolver::class, + $table, + $GLOBALS['TCA'][$table] ?? [] + ); + $shadowColumns = $factory->forMovePlaceholder(); // Set values from the versioned record to the move placeholder - if (!empty($shadowColumnsForMovePlaceholder)) { + if (!empty($shadowColumns)) { $versionedRecord = BackendUtility::getRecord($table, $offlineUid); - $shadowColumns = GeneralUtility::trimExplode(',', $shadowColumnsForMovePlaceholder, true); foreach ($shadowColumns as $shadowColumn) { if (isset($versionedRecord[$shadowColumn])) { $newVersion_placeholderFieldArray[$shadowColumn] = $versionedRecord[$shadowColumn]; diff --git a/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/ActionTest.php b/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/ActionTest.php index 2a9b0c6e9e18..9e0a1699489e 100644 --- a/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/ActionTest.php +++ b/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/ActionTest.php @@ -89,6 +89,40 @@ class ActionTest extends \TYPO3\CMS\Workspaces\Tests\Functional\DataHandling\Reg ->setTable(self::TABLE_Content)->setField('header')->setValues('Testing #1')); } + /** + * @test + * See DataSet/hideContent.csv + */ + public function hideContent() + { + parent::hideContent(); + $this->assertAssertionDataSet('hideContent'); + + $responseSections = $this->getFrontendResponse(self::VALUE_PageId, 0, self::VALUE_BackendUserId, self::VALUE_WorkspaceId)->getResponseSections(); + self::assertThat($responseSections, $this->getRequestSectionDoesNotHaveRecordConstraint() + ->setTable(self::TABLE_Content)->setField('header')->setValues('Regular Element #2')); + } + + /** + * @test + * See DataSet/hideContentAndMoveToDifferentPage.csv + */ + public function hideContentAndMoveToDifferentPage() + { + parent::hideContent(); + parent::moveContentToDifferentPage(); + $this->assertAssertionDataSet('hideContentAndMoveToDifferentPage'); + + $responseSectionsSource = $this->getFrontendResponse(self::VALUE_PageId, 0, self::VALUE_BackendUserId, self::VALUE_WorkspaceId)->getResponseSections(); + self::assertThat($responseSectionsSource, $this->getRequestSectionHasRecordConstraint() + ->setTable(self::TABLE_Content)->setField('header')->setValues('Regular Element #1')); + self::assertThat($responseSectionsSource, $this->getRequestSectionDoesNotHaveRecordConstraint() + ->setTable(self::TABLE_Content)->setField('header')->setValues('Regular Element #2')); + $responseSectionsTarget = $this->getFrontendResponse(self::VALUE_PageIdTarget, 0, self::VALUE_BackendUserId, self::VALUE_WorkspaceId)->getResponseSections(); + self::assertThat($responseSectionsTarget, $this->getRequestSectionDoesNotHaveRecordConstraint() + ->setTable(self::TABLE_Content)->setField('header')->setValues('Regular Element #2')); + } + /** * @test * See DataSet/deleteContentRecord.csv @@ -202,9 +236,8 @@ class ActionTest extends \TYPO3\CMS\Workspaces\Tests\Functional\DataHandling\Reg $this->assertAssertionDataSet('localizeContentWHideAtCopy'); $responseSections = $this->getFrontendResponse(self::VALUE_PageId, self::VALUE_LanguageId, self::VALUE_BackendUserId, self::VALUE_WorkspaceId)->getResponseSections(); - // @todo Localized element should be retrieved self::assertThat($responseSections, $this->getRequestSectionHasRecordConstraint() - ->setTable(self::TABLE_Content)->setField('header')->setValues('[Translate to Dansk:] Regular Element #1' /* , '[Translate to Dansk:] Regular Element #2'*/)); + ->setTable(self::TABLE_Content)->setField('header')->setValues('[Translate to Dansk:] Regular Element #1', '[Translate to Dansk:] Regular Element #2')); } /** @@ -300,6 +333,20 @@ class ActionTest extends \TYPO3\CMS\Workspaces\Tests\Functional\DataHandling\Reg ->setTable(self::TABLE_Content)->setField('header')->setValues('Regular Element #1', 'Regular Element #2')); } + /** + * @test + * See DataSet/moveContentToDifferentPageAndHide.csv + */ + public function moveContentToDifferentPageAndHide() + { + parent::moveContentToDifferentPageAndHide(); + $this->assertAssertionDataSet('moveContentToDifferentPageAndHide'); + + $responseSections = $this->getFrontendResponse(self::VALUE_PageIdTarget, 0, self::VALUE_BackendUserId, self::VALUE_WorkspaceId)->getResponseSections(); + self::assertThat($responseSections, $this->getRequestSectionDoesNotHaveRecordConstraint() + ->setTable(self::TABLE_Content)->setField('header')->setValues('Regular Element #2')); + } + /** * Page records */ diff --git a/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/DataSet/hideContent.csv b/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/DataSet/hideContent.csv new file mode 100644 index 000000000000..306876bd92c0 --- /dev/null +++ b/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/DataSet/hideContent.csv @@ -0,0 +1,14 @@ +"tt_content",,,,,,,,,,,,,,, +,"uid","pid","sorting","deleted","hidden","sys_language_uid","l18n_parent","l10n_source","t3_origuid","t3ver_wsid","t3ver_state","t3ver_stage","t3ver_oid","t3ver_move_id","header" +,296,88,256,0,0,0,0,0,0,0,0,0,0,0,"Regular Element #0" +,297,89,256,0,0,0,0,0,0,0,0,0,0,0,"Regular Element #1" +,298,89,512,0,0,0,0,0,0,0,0,0,0,0,"Regular Element #2" +,299,89,768,0,0,0,0,0,0,0,0,0,0,0,"Regular Element #3" +,300,89,1024,0,0,1,299,299,299,0,0,0,0,0,"[Translate to Dansk:] Regular Element #3" +,301,89,384,0,0,1,297,297,297,0,0,0,0,0,"[Translate to Dansk:] Regular Element #1" +,302,89,448,0,0,2,297,301,301,0,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #1" +,310,90,256,0,0,0,0,0,0,0,0,0,0,0,"Regular Element #10" +,311,90,512,0,0,1,0,310,310,0,0,0,0,0,"[Translate to Dansk:] Regular Element #10" +,312,90,768,0,0,2,0,311,311,0,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #10" +,320,-1,512,0,0,0,0,0,298,2,2,0,298,0,"Regular Element #2" +,321,-1,512,0,1,0,0,0,298,1,0,0,298,0,"Regular Element #2" diff --git a/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/DataSet/hideContentAndMoveToDifferentPage.csv b/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/DataSet/hideContentAndMoveToDifferentPage.csv new file mode 100644 index 000000000000..8bd5efceeb1a --- /dev/null +++ b/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/DataSet/hideContentAndMoveToDifferentPage.csv @@ -0,0 +1,15 @@ +"tt_content",,,,,,,,,,,,,,, +,"uid","pid","sorting","deleted","hidden","sys_language_uid","l18n_parent","l10n_source","t3_origuid","t3ver_wsid","t3ver_state","t3ver_stage","t3ver_oid","t3ver_move_id","header" +,296,88,256,0,0,0,0,0,0,0,0,0,0,0,"Regular Element #0" +,297,89,256,0,0,0,0,0,0,0,0,0,0,0,"Regular Element #1" +,298,89,512,0,0,0,0,0,0,0,0,0,0,0,"Regular Element #2" +,299,89,768,0,0,0,0,0,0,0,0,0,0,0,"Regular Element #3" +,300,89,1024,0,0,1,299,299,299,0,0,0,0,0,"[Translate to Dansk:] Regular Element #3" +,301,89,384,0,0,1,297,297,297,0,0,0,0,0,"[Translate to Dansk:] Regular Element #1" +,302,89,448,0,0,2,297,301,301,0,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #1" +,310,90,256,0,0,0,0,0,0,0,0,0,0,0,"Regular Element #10" +,311,90,512,0,0,1,0,310,310,0,0,0,0,0,"[Translate to Dansk:] Regular Element #10" +,312,90,768,0,0,2,0,311,311,0,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #10" +,320,-1,512,0,0,0,0,0,298,2,2,0,298,0,"Regular Element #2" +,321,-1,512,0,1,0,0,0,298,1,4,0,298,0,"Regular Element #2" +,322,90,128,0,1,0,0,0,0,1,3,0,0,298,"[MOVE-TO PLACEHOLDER for #298, WS#1]" diff --git a/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/DataSet/localizeContentWHideAtCopy.csv b/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/DataSet/localizeContentWHideAtCopy.csv index 2b39d4b520d3..7409213795c6 100644 --- a/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/DataSet/localizeContentWHideAtCopy.csv +++ b/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/DataSet/localizeContentWHideAtCopy.csv @@ -11,5 +11,5 @@ ,311,90,512,0,0,1,0,310,310,0,0,0,0,0,"[Translate to Dansk:] Regular Element #10" ,312,90,768,0,0,2,0,311,311,0,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #10" ,320,-1,512,0,0,0,0,0,298,2,2,0,298,0,"Regular Element #2" -,321,89,416,1,0,1,298,298,298,1,1,0,0,0,"[Translate to Dansk:] Regular Element #2" +,321,89,416,0,0,1,298,298,298,1,1,0,0,0,"[Translate to Dansk:] Regular Element #2" ,322,-1,416,0,0,1,298,298,298,1,-1,0,321,0,"[Translate to Dansk:] Regular Element #2" diff --git a/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/DataSet/moveContentToDifferentPageAndHide.csv b/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/DataSet/moveContentToDifferentPageAndHide.csv new file mode 100644 index 000000000000..8bd5efceeb1a --- /dev/null +++ b/typo3/sysext/workspaces/Tests/Functional/DataHandling/Regular/Modify/DataSet/moveContentToDifferentPageAndHide.csv @@ -0,0 +1,15 @@ +"tt_content",,,,,,,,,,,,,,, +,"uid","pid","sorting","deleted","hidden","sys_language_uid","l18n_parent","l10n_source","t3_origuid","t3ver_wsid","t3ver_state","t3ver_stage","t3ver_oid","t3ver_move_id","header" +,296,88,256,0,0,0,0,0,0,0,0,0,0,0,"Regular Element #0" +,297,89,256,0,0,0,0,0,0,0,0,0,0,0,"Regular Element #1" +,298,89,512,0,0,0,0,0,0,0,0,0,0,0,"Regular Element #2" +,299,89,768,0,0,0,0,0,0,0,0,0,0,0,"Regular Element #3" +,300,89,1024,0,0,1,299,299,299,0,0,0,0,0,"[Translate to Dansk:] Regular Element #3" +,301,89,384,0,0,1,297,297,297,0,0,0,0,0,"[Translate to Dansk:] Regular Element #1" +,302,89,448,0,0,2,297,301,301,0,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #1" +,310,90,256,0,0,0,0,0,0,0,0,0,0,0,"Regular Element #10" +,311,90,512,0,0,1,0,310,310,0,0,0,0,0,"[Translate to Dansk:] Regular Element #10" +,312,90,768,0,0,2,0,311,311,0,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #10" +,320,-1,512,0,0,0,0,0,298,2,2,0,298,0,"Regular Element #2" +,321,-1,512,0,1,0,0,0,298,1,4,0,298,0,"Regular Element #2" +,322,90,128,0,1,0,0,0,0,1,3,0,0,298,"[MOVE-TO PLACEHOLDER for #298, WS#1]" -- GitLab