Commit f3c0b8f9 authored by Christian Kuhn's avatar Christian Kuhn
Browse files

[BUGFIX] Better sorting localizing records from non-default language

Using the "translate" button in page module and localizing
records from non-default language may lead to funny content
element sorting in the target language.

This has been mitigated with probably #85300 and #84951
a while ago already, but there still exists a codewise
misbehavior in DataHandler::getPreviousLocalizedRecordUid().

The patch streamlines the method and applies a fix so
records calculate the correct "before" uid even in
"localization of a localization" context.

Resolves: #83079
Resolves: #83469
Related: #85300
Related: #84951
Releases: master, 11.5
Change-Id: I03c566054bd4939fed96206f62633b2abe4f195f
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/72254

Tested-by: core-ci's avatarcore-ci <typo3@b13.com>
Tested-by: Christian Kuhn's avatarChristian Kuhn <lolli@schwarzbu.ch>
Reviewed-by: Christian Kuhn's avatarChristian Kuhn <lolli@schwarzbu.ch>
parent 08422260
......@@ -4438,10 +4438,8 @@ class DataHandler implements LoggerAwareInterface
return false;
}
$GLOBALS['TCA'][$table]['ctrl'] += ['languageField' => '', 'transOrigPointerField' => ''];
$this->registerNestedElementCall($table, $uid, 'localize-' . (string)$language);
if (!$GLOBALS['TCA'][$table]['ctrl']['languageField'] || !$GLOBALS['TCA'][$table]['ctrl']['transOrigPointerField']) {
if (empty($GLOBALS['TCA'][$table]['ctrl']['languageField']) || empty($GLOBALS['TCA'][$table]['ctrl']['transOrigPointerField'])) {
$this->log($table, $uid, SystemLogDatabaseAction::LOCALIZE, 0, SystemLogErrorClassification::USER_ERROR, 'Localization failed; "languageField" and "transOrigPointerField" must be defined for the table ' . $table);
return false;
}
......@@ -7685,76 +7683,103 @@ class DataHandler implements LoggerAwareInterface
}
/**
* Returning uid of previous localized record, if any, for tables with a "sortby" column
* Used when new localized records are created so that localized records are sorted in the same order as the default language records
* Returning uid of "previous" localized record, if any, for tables with a "sortby" column.
* Used when records are localized, so that localized records are sorted in the
* same order as the source language records.
*
* The uid of the returned record is later used to create the localized record "after"
* (higher sorting value) than the one the uid is returned of.
*
* For a given record (A) uid (record we're translating) it finds first default language record (from the same colpos)
* with sorting smaller than given record (B).
* Then it fetches a translated version of record B and returns it's uid.
* There are basically two scenarios:
* * The localized record is to be placed as the first record of the target pid/language
* combination. In this case, there is no "before" record in this language. The method
* returns input $uid, saying "insert the localized record with a higher sorting value
* than the record the localization is created from".
* * There is a localized record "before" (lower sorting value) in the target pid/language
* combination. For instance because source language element 2 is being translated and
* source language element 1 has already been translated. In this case, the uid of the
* 'element 1' is returned, saying "insert the localized record with a higher sorting
* value than the "before" record in this language.
*
* If there is no record B, or it has no translation in given language, the record A uid is returned.
* The localized record will be placed the after record which uid is returned.
* The algorithm first fetches the record of given input uid. It then looks if there is a
* record with a lower sorting value for this pid/language combination. If no, input uid
* is returned ("place with higher sorting than source language record"). If yes, it looks
* if there is a localization of that source record in the target language and return the
* uid of that target language record ("place with higher sorting that this traget language
* record"). When dealing with table tt_content, colpos is also taken into account.
*
* @param string $table Table name
* @param int $uid Uid of default language record
* @param int $pid Pid of default language record
* @param int $language Language of localization
* @param int $uid Uid of source language record
* @param int $pid Pid of source language record
* @param int $targetLanguage Target language id
* @return int uid of record after which the localized record should be inserted
*/
protected function getPreviousLocalizedRecordUid($table, $uid, $pid, $language)
protected function getPreviousLocalizedRecordUid($table, $uid, $pid, $targetLanguage)
{
$previousLocalizedRecordUid = $uid;
$sortColumn = $GLOBALS['TCA'][$table]['ctrl']['sortby'] ?? '';
if ($sortColumn) {
$select = [$sortColumn, 'pid', 'uid'];
// For content elements, we also need the colPos
if ($table === 'tt_content') {
$select[] = 'colPos';
}
// Get the sort value of the default language record
$row = BackendUtility::getRecord($table, $uid, implode(',', $select));
if (is_array($row)) {
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table);
$this->addDeleteRestriction($queryBuilder->getRestrictions()->removeAll());
if (!$sortColumn) {
return $previousLocalizedRecordUid;
}
$queryBuilder
->select(...$select)
->from($table)
->where(
$queryBuilder->expr()->eq(
'pid',
$queryBuilder->createNamedParameter($pid, \PDO::PARAM_INT)
),
$queryBuilder->expr()->eq(
$GLOBALS['TCA'][$table]['ctrl']['languageField'],
$queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)
),
$queryBuilder->expr()->lt(
$sortColumn,
$queryBuilder->createNamedParameter($row[$sortColumn], \PDO::PARAM_INT)
)
)
->orderBy($sortColumn, 'DESC')
->addOrderBy('uid', 'DESC')
->setMaxResults(1);
if ($table === 'tt_content') {
$queryBuilder
->andWhere(
$queryBuilder->expr()->eq(
'colPos',
$queryBuilder->createNamedParameter($row['colPos'], \PDO::PARAM_INT)
)
);
}
// If there is an element, find its localized record in specified localization language on this page
if ($previousRow = $queryBuilder->execute()->fetchAssociative()) {
$previousLocalizedRecord = BackendUtility::getRecordLocalization($table, $previousRow['uid'], $language, 'pid=' . (int)$pid);
if (isset($previousLocalizedRecord[0]) && is_array($previousLocalizedRecord[0])) {
$previousLocalizedRecordUid = $previousLocalizedRecord[0]['uid'];
}
}
// Typically l10n_parent
$transOrigPointerField = $GLOBALS['TCA'][$table]['ctrl']['transOrigPointerField'];
// Typically sys_language_uid
$languageField = $GLOBALS['TCA'][$table]['ctrl']['languageField'];
$select = [$sortColumn, $languageField, $transOrigPointerField, 'pid', 'uid'];
// For content elements, we also need the colPos
if ($table === 'tt_content') {
$select[] = 'colPos';
}
// Get the sort value and some other details of the source language record
$row = BackendUtility::getRecord($table, $uid, implode(',', $select));
if (!is_array($row)) {
// This if may be obsolete ... didn't the callee already check if the source record exists?
return $previousLocalizedRecordUid;
}
// Try to find a "before" record in source language
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table);
$this->addDeleteRestriction($queryBuilder->getRestrictions()->removeAll());
$queryBuilder
->select(...$select)
->from($table)
->where(
$queryBuilder->expr()->eq(
'pid',
$queryBuilder->createNamedParameter($pid, \PDO::PARAM_INT)
),
$queryBuilder->expr()->eq(
$languageField,
$queryBuilder->createNamedParameter($row[$languageField], \PDO::PARAM_INT)
),
$queryBuilder->expr()->lt(
$sortColumn,
$queryBuilder->createNamedParameter($row[$sortColumn], \PDO::PARAM_INT)
)
)
->orderBy($sortColumn, 'DESC')
->addOrderBy('uid', 'DESC')
->setMaxResults(1);
if ($table === 'tt_content') {
$queryBuilder->andWhere(
$queryBuilder->expr()->eq(
'colPos',
$queryBuilder->createNamedParameter($row['colPos'], \PDO::PARAM_INT)
)
);
}
// If there is a "before" record in source language, see if it is localized to target language.
// If so, return uid of target language record.
if ($previousRow = $queryBuilder->execute()->fetchAssociative()) {
$previousLocalizedRecord = BackendUtility::getRecordLocalization($table, $previousRow['uid'], $targetLanguage, 'pid=' . (int)$pid);
if (isset($previousLocalizedRecord[0]) && is_array($previousLocalizedRecord[0])) {
$previousLocalizedRecordUid = $previousLocalizedRecord[0]['uid'];
}
}
return $previousLocalizedRecordUid;
}
......
......@@ -18,6 +18,7 @@ declare(strict_types=1);
namespace TYPO3\CMS\Core\Tests\Functional\DataHandling\Regular;
use TYPO3\CMS\Core\Database\ReferenceIndex;
use TYPO3\CMS\Core\DataHandling\DataHandler;
use TYPO3\CMS\Core\Migrations\TcaMigration;
use TYPO3\CMS\Core\Tests\Functional\DataHandling\AbstractDataHandlerActionTestCase;
use TYPO3\CMS\Core\Utility\GeneralUtility;
......@@ -255,6 +256,56 @@ abstract class AbstractActionTestCase extends AbstractDataHandlerActionTestCase
$this->actionService->modifyRecord(self::TABLE_Content, self::VALUE_ContentIdThird, ['header' => 'Testing #1']);
}
/**
* Test for issue https://forge.typo3.org/issues/83079 - sorting of 'localization of localization' should
* use the sort value of the source record for the first localized record, and sort value of 'previous'
* record of target language for subsequent records.
*/
public function localizeContentFromNonDefaultLanguageWithAllContentElements(): void
{
// Change defaults from import data set: We want to create all the lang 1 and lang 2 content elements
// with one DH call in one go per language, but the import data set has some localized content elements
// already. Drop those.
$this->setWorkspaceId(0);
$this->actionService->deleteRecords([
'tt_content' => [300, 301, 302],
]);
if (defined('static::VALUE_WorkspaceId') > 0) {
$this->setWorkspaceId(static::VALUE_WorkspaceId);
}
// Create translated pages first
$this->actionService->copyRecordToLanguage(self::TABLE_Page, self::VALUE_PageId, self::VALUE_LanguageId);
$this->actionService->copyRecordToLanguage(self::TABLE_Page, self::VALUE_PageId, self::VALUE_LanguageIdSecond);
// @todo: This should be extracted as localizeRecords() in addition to localizeRecord() to ActionService
// Create localization of the 3 default language content elements
$commandMap = [
'tt_content' => [
self::VALUE_ContentIdFirst => [ 'localize' => self::VALUE_LanguageId],
self::VALUE_ContentIdSecond => [ 'localize' => self::VALUE_LanguageId],
self::VALUE_ContentIdThird => [ 'localize' => self::VALUE_LanguageId],
],
];
$dataHandler = GeneralUtility::makeInstance(DataHandler::class);
$dataHandler->start([], $commandMap);
$dataHandler->process_cmdmap();
// uid's of lang 1 localized elements
$mappingArray = $dataHandler->copyMappingArray_merged;
// Localize again, with uid's of second language as source ("translation of translation")
$commandMap = [
'tt_content' => [
$mappingArray['tt_content'][self::VALUE_ContentIdFirst] => ['localize' => self::VALUE_LanguageIdSecond],
$mappingArray['tt_content'][self::VALUE_ContentIdSecond] => ['localize' => self::VALUE_LanguageIdSecond],
$mappingArray['tt_content'][self::VALUE_ContentIdThird] => ['localize' => self::VALUE_LanguageIdSecond],
],
];
$dataHandler = GeneralUtility::makeInstance(DataHandler::class);
$dataHandler->start([], $commandMap);
$dataHandler->process_cmdmap();
}
/**
* Note: workspaces has an additional variant of this test "localizeContentAfterMovedInLive" that performs
* the localization of the content element after it has been moved in live first.
......
......@@ -384,6 +384,15 @@ class ActionTest extends AbstractActionTestCase
->setTable(self::TABLE_Content)->setField('header')->setValues('[Translate to Deutsch:] [Translate to Dansk:] Regular Element #1', 'Testing #1'));
}
/**
* @test
*/
public function localizeContentFromNonDefaultLanguageWithAllContentElements(): void
{
parent::localizeContentFromNonDefaultLanguageWithAllContentElements();
$this->assertAssertionDataSet('localizeContentFromNonDefaultLanguageWithAllContentElements');
}
/**
* @test
*/
......
......@@ -22,7 +22,7 @@
,300,89,1024,0,1,299,299,299,0,0,0,0,"[Translate to Dansk:] Regular Element #3"
,301,89,384,0,1,297,297,297,0,0,0,0,"[Translate to Dansk:] Regular Element #1"
,302,89,448,0,2,297,301,301,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #1"
,303,89,1280,0,2,0,300,300,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3"
,303,89,480,0,2,0,300,300,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3"
"sys_refindex",,,,,,,,,,,,,
,"hash","tablename","recuid","field","flexpointer","softref_key","softref_id","sorting","workspace","ref_table","ref_uid","ref_string",
,"1130084e4038e95f2d5806b731cd416a","tt_content",300,"l18n_parent",,,,0,0,"tt_content",299,,
......
......@@ -22,7 +22,7 @@
,300,89,1024,0,1,299,299,299,0,0,0,0,"[Translate to Dansk:] Regular Element #3"
,301,89,384,0,1,297,297,297,0,0,0,0,"[Translate to Dansk:] Regular Element #1"
,302,89,448,0,2,297,301,301,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #1"
,303,89,1280,0,2,299,300,300,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3"
,303,89,480,0,2,299,300,300,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3"
"sys_refindex",,,,,,,,,,,,,
,"hash","tablename","recuid","field","flexpointer","softref_key","softref_id","sorting","workspace","ref_table","ref_uid","ref_string",
,"1130084e4038e95f2d5806b731cd416a","tt_content",300,"l18n_parent",,,,0,0,"tt_content",299,,
......
......@@ -22,7 +22,7 @@
,300,89,1024,0,1,299,299,299,0,0,0,0,"Testing #1","{""header"":""parent""}"
,301,89,384,0,1,297,297,297,0,0,0,0,"[Translate to Dansk:] Regular Element #1",
,302,89,448,0,2,297,301,301,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #1",
,303,89,1280,0,2,299,300,300,0,0,0,0,"Testing #1","{""header"":""parent""}"
,303,89,480,0,2,299,300,300,0,0,0,0,"Testing #1","{""header"":""parent""}"
"sys_refindex",,,,,,,,,,,,,,
,"hash","tablename","recuid","field","flexpointer","softref_key","softref_id","sorting","workspace","ref_table","ref_uid","ref_string",,
,"1130084e4038e95f2d5806b731cd416a","tt_content",300,"l18n_parent",,,,0,0,"tt_content",299,,,
......
......@@ -22,7 +22,7 @@
,300,89,1024,0,1,299,299,299,0,0,0,0,"Testing #1","{""header"":""parent""}"
,301,89,384,0,1,297,297,297,0,0,0,0,"[Translate to Dansk:] Regular Element #1",
,302,89,448,0,2,297,301,301,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #1",
,303,89,1280,0,2,299,300,300,0,0,0,0,"Testing #1","{""header"":""source""}"
,303,89,480,0,2,299,300,300,0,0,0,0,"Testing #1","{""header"":""source""}"
"sys_refindex",,,,,,,,,,,,,,
,"hash","tablename","recuid","field","flexpointer","softref_key","softref_id","sorting","workspace","ref_table","ref_uid","ref_string",,
,"1130084e4038e95f2d5806b731cd416a","tt_content",300,"l18n_parent",,,,0,0,"tt_content",299,,,
......
"pages",,,,,,,,,,,,,,
,"uid","pid","sorting","deleted","sys_language_uid","l10n_parent","t3_origuid","t3ver_wsid","t3ver_state","t3ver_stage","t3ver_oid","title","slug",
,1,0,256,0,0,0,0,0,0,0,0,"FunctionalTest","/",
,50,0,512,0,0,0,0,0,0,0,0,"Second Root Page","/",
,51,50,128,0,0,0,0,0,0,0,0,"DataHandlerTest in second tree","/data-handler",
,52,51,128,0,0,0,0,0,0,0,0,"Relations in second tree","/data-handler/relations",
,88,1,256,0,0,0,0,0,0,0,0,"DataHandlerTest","/data-handler",
,89,88,256,0,0,0,0,0,0,0,0,"Relations","/data-handler/relations",
,90,88,512,0,0,0,0,0,0,0,0,"Target","/data-handler/target",
,91,88,256,0,1,89,0,0,0,0,0,"[Translate to Dansk:] Relations","/data-handler/translate-to-dansk-relations",
,92,88,256,0,2,89,0,0,0,0,0,"[Translate to Deutsch:] Relations","/data-handler/translate-to-deutsch-relations",
"sys_language",,,,,,,,,,,,,,
,"uid","pid","hidden","title","flag",,,,,,,,,
,1,0,0,"Dansk","dk",,,,,,,,,
,2,0,0,"Deutsch","de",,,,,,,,,
"tt_content",,,,,,,,,,,,,,
,"uid","pid","sorting","deleted","sys_language_uid","l18n_parent","l10n_source","t3_origuid","t3ver_wsid","t3ver_state","t3ver_stage","t3ver_oid","header","bodytext"
,296,88,256,0,0,0,0,0,0,0,0,0,"Regular Element #0",
,297,89,384,0,0,0,0,0,0,0,0,0,"Regular Element #1",
,298,89,512,0,0,0,0,0,0,0,0,0,"Regular Element #2",
,299,89,768,0,0,0,0,0,0,0,0,0,"Regular Element #3",
# Next 3 are deleted to not disturb "localize many records on this page"
,300,89,1024,1,1,299,299,299,0,0,0,0,"[Translate to Dansk:] Regular Element #3",
,301,89,384,1,1,297,297,297,0,0,0,0,"[Translate to Dansk:] Regular Element #1",
,302,89,448,1,2,297,301,301,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #1",
,303,89,448,0,1,297,297,297,0,0,0,0,"[Translate to Dansk:] Regular Element #1",
,304,89,480,0,1,298,298,298,0,0,0,0,"[Translate to Dansk:] Regular Element #2",
,305,89,496,0,1,299,299,299,0,0,0,0,"[Translate to Dansk:] Regular Element #3",
,306,89,464,0,2,297,303,303,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #1",
# The point is here: sorting of 307 is calculated as "after" of 306 - it's actually lower than sorting of source 304
,307,89,472,0,2,298,304,304,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #2",
# The point is here: sorting of 308 is calculated as "after" of 307 - it's actually lower than sorting of source 305
,308,89,476,0,2,299,305,305,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3",
"sys_refindex",,,,,,,,,,,,,,
,"hash","tablename","recuid","field","flexpointer","softref_key","softref_id","sorting","workspace","ref_table","ref_uid","ref_string",,
,"583b9974d1df1d9efb695cdabfe53a73","pages",91,"l10n_parent",,,,0,0,"pages",89,,,
,"2a42323931078b2842779bd9446e8152","pages",92,"l10n_parent",,,,0,0,"pages",89,,,
,"65715d319d6e2557ef567590d3147606","tt_content",303,"l18n_parent",,,,0,0,"tt_content",297,,,
,"9284c2437ea4aa81c7a500fa332c87de","tt_content",304,"l18n_parent",,,,0,0,"tt_content",298,,,
,"4b7a1808402da33b274d18be1dab407d","tt_content",305,"l18n_parent",,,,0,0,"tt_content",299,,,
,"dfa52a0320de59c02ffb64881c849498","tt_content",306,"l18n_parent",,,,0,0,"tt_content",297,,,
,"6e757d756cab07522a5072d8b60fae5d","tt_content",307,"l18n_parent",,,,0,0,"tt_content",298,,,
,"39547f04497337fd8ae72984033f39ad","tt_content",308,"l18n_parent",,,,0,0,"tt_content",299,,,
......@@ -351,6 +351,16 @@ class ActionTest extends AbstractActionTestCase
->setTable(self::TABLE_Content)->setField('header')->setValues('[Translate to Deutsch:] [Translate to Dansk:] Regular Element #1', '[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3'));
}
/**
* @test
* Test does not make sense for Publish, PublishAll and Discard
*/
public function localizeContentFromNonDefaultLanguageWithAllContentElements(): void
{
parent::localizeContentFromNonDefaultLanguageWithAllContentElements();
$this->assertAssertionDataSet('localizeContentFromNonDefaultLanguageWithAllContentElements');
}
/**
* @test
*/
......
......@@ -30,7 +30,7 @@
,311,90,512,0,1,0,310,310,0,0,0,0,"[Translate to Dansk:] Regular Element #10",,,,
,312,90,768,0,2,0,311,311,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #10",,,,
,320,89,512,0,0,0,0,298,2,2,0,298,"Regular Element #2",,,,
,321,89,1280,0,2,0,300,300,1,1,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3",,,,
,321,89,480,0,2,0,300,300,1,1,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3",,,,
"sys_refindex",,,,,,,,,,,,,,,,,
,"hash","tablename","recuid","field","flexpointer","softref_key","softref_id","sorting","workspace","ref_table","ref_uid","ref_string",,,,,
,"01a3ce8c4e3b2bb1aa439dc29081f996","sys_workspace_stage",1,"responsible_persons",,,,0,0,"be_users",3,,,,,,
......
......@@ -30,7 +30,7 @@
,311,90,512,0,1,0,310,310,0,0,0,0,"[Translate to Dansk:] Regular Element #10",,,,
,312,90,768,0,2,0,311,311,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #10",,,,
,320,89,512,0,0,0,0,298,2,2,0,298,"Regular Element #2",,,,
,321,89,1280,0,2,299,300,300,1,1,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3",,,,
,321,89,480,0,2,299,300,300,1,1,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3",,,,
"sys_refindex",,,,,,,,,,,,,,,,,
,"hash","tablename","recuid","field","flexpointer","softref_key","softref_id","sorting","workspace","ref_table","ref_uid","ref_string",,,,,
,"01a3ce8c4e3b2bb1aa439dc29081f996","sys_workspace_stage",1,"responsible_persons",,,,0,0,"be_users",3,,,,,,
......
"pages",,,,,,,,,,,,,,,,,
,"uid","pid","sorting","hidden","deleted","t3_origuid","t3ver_wsid","t3ver_state","t3ver_stage","t3ver_oid","title","slug",,,,,
,1,0,256,0,0,0,0,0,0,0,"FunctionalTest","/",,,,,
,88,1,256,0,0,0,0,0,0,0,"DataHandlerTest","/data-handler",,,,,
,89,88,256,0,0,0,0,0,0,0,"Relations","/data-handler/relations",,,,,
,90,88,512,0,0,0,0,0,0,0,"Target","/data-handler/target",,,,,
,91,88,256,0,0,0,1,1,0,0,"[Translate to Dansk:] Relations","/data-handler/translate-to-dansk-relations",,,,,
,92,88,256,0,0,0,1,1,0,0,"[Translate to Deutsch:] Relations","/data-handler/translate-to-deutsch-relations",,,,,
"sys_workspace",,,,,,,,,,,,,,,,,
,"uid","pid","deleted","title","adminusers","members","db_mountpoints","file_mountpoints","freeze","live_edit","publish_access","custom_stages","stagechg_notification","edit_notification_defaults","edit_allow_notificaton_settings","publish_notification_defaults","publish_allow_notificaton_settings"
,1,0,0,"Workspace #1",,,,,0,0,0,0,0,0,0,0,0
,2,0,0,"Workspace #2",,,,,0,0,0,0,0,0,0,0,0
"sys_workspace_stage",,,,,,,,,,,,,,,,,
,"uid","pid","tstamp","deleted","sorting","title","responsible_persons","default_mailcomment","parentid","parenttable","notification_defaults","allow_notificaton_settings",,,,,
,1,0,1290048921,0,1,"Stage 1","be_users_3",,1,"sys_workspace",0,0,,,,,
"sys_language",,,,,,,,,,,,,,,,,
,"uid","pid","hidden","title","flag",,,,,,,,,,,,
,1,0,0,"Dansk","dk",,,,,,,,,,,,
,2,0,0,"Deutsch","de",,,,,,,,,,,,
"tt_content",,,,,,,,,,,,,,,,,
,"uid","pid","sorting","hidden","deleted","sys_language_uid","l18n_parent","l10n_source","t3_origuid","t3ver_wsid","t3ver_state","t3ver_stage","t3ver_oid","header","bodytext",,
,296,88,256,0,0,0,0,0,0,0,0,0,0,"Regular Element #0",,,
,297,89,384,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,"Regular Element #2",,,
,299,89,768,0,0,0,0,0,0,0,0,0,0,"Regular Element #3",,,
,300,89,1024,0,1,1,299,299,299,0,0,0,0,"[Translate to Dansk:] Regular Element #3",,,
,301,89,384,0,1,1,297,297,297,0,0,0,0,"[Translate to Dansk:] Regular Element #1",,,
,302,89,448,0,1,2,297,301,301,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,"Regular Element #10",,,
,311,90,512,0,0,1,0,310,310,0,0,0,0,"[Translate to Dansk:] Regular Element #10",,,
,312,90,768,0,0,2,0,311,311,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #10",,,
,320,89,512,0,0,0,0,0,298,2,2,0,298,"Regular Element #2",,,
,321,89,448,0,0,1,297,297,297,1,1,0,0,"[Translate to Dansk:] Regular Element #1",,,
,322,89,480,0,0,1,298,298,298,1,1,0,0,"[Translate to Dansk:] Regular Element #2",,,
,323,89,1024,0,0,1,299,299,299,1,1,0,0,"[Translate to Dansk:] Regular Element #3",,,
,324,89,464,0,0,2,297,321,321,1,1,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #1",,,
,325,89,472,0,0,2,298,322,322,1,1,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #2",,,
,326,89,476,0,0,2,299,323,323,1,1,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3",,,
"sys_refindex",,,,,,,,,,,,,,,,,
,"hash","tablename","recuid","field","flexpointer","softref_key","softref_id","sorting","workspace","ref_table","ref_uid","ref_string",,,,,
,"25426f92d44dd2ccf416108462b446e3","sys_workspace",1,"custom_stages",,,,0,0,"sys_workspace_stage",1,,,,,,
,"01a3ce8c4e3b2bb1aa439dc29081f996","sys_workspace_stage",1,"responsible_persons",,,,0,0,"be_users",3,,,,,,
,"560d1e59437906ce8ecd07cbb8b61650","pages",91,"l10n_parent",,,,0,1,"pages",89,,,,,,
,"81bed3ff81afcdb0e38d7f99f497b890","pages",92,"l10n_parent",,,,0,1,"pages",89,,,,,,
,"fdb6e478a8d93feb8e72c69a247168a1","tt_content",321,"l18n_parent",,,,0,1,"tt_content",297,,,,,,
,"df7fdfe7276be741fca5a5e773024b52","tt_content",322,"l18n_parent",,,,0,1,"tt_content",298,,,,,,
,"e8bd04d607dea16b8b8c7d66aff17147","tt_content",323,"l18n_parent",,,,0,1,"tt_content",299,,,,,,
,"1f9987878a01ed8224ede3f306c5d4a6","tt_content",324,"l18n_parent",,,,0,1,"tt_content",297,,,,,,
,"de7eac7853f12111b70a791c11584f2f","tt_content",325,"l18n_parent",,,,0,1,"tt_content",298,,,,,,
,"41032051e8f704ee0596e196752f97a3","tt_content",326,"l18n_parent",,,,0,1,"tt_content",299,,,,,,
......@@ -30,7 +30,7 @@
,311,90,512,0,1,0,310,310,0,0,0,0,"[Translate to Dansk:] Regular Element #10",,,,
,312,90,768,0,2,0,311,311,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #10",,,,
,320,89,512,0,0,0,0,298,2,2,0,298,"Regular Element #2",,,,
,321,89,1280,0,2,0,300,300,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3",,,,
,321,89,480,0,2,0,300,300,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3",,,,
"sys_refindex",,,,,,,,,,,,,,,,,
,"hash","tablename","recuid","field","flexpointer","softref_key","softref_id","sorting","workspace","ref_table","ref_uid","ref_string",,,,,
,"01a3ce8c4e3b2bb1aa439dc29081f996","sys_workspace_stage",1,"responsible_persons",,,,0,0,"be_users",3,,,,,,
......
......@@ -30,7 +30,7 @@
,311,90,512,0,1,0,310,310,0,0,0,0,"[Translate to Dansk:] Regular Element #10",,,,
,312,90,768,0,2,0,311,311,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #10",,,,
,320,89,512,0,0,0,0,298,2,2,0,298,"Regular Element #2",,,,
,321,89,1280,0,2,299,300,300,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3",,,,
,321,89,480,0,2,299,300,300,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3",,,,
"sys_refindex",,,,,,,,,,,,,,,,,
,"hash","tablename","recuid","field","flexpointer","softref_key","softref_id","sorting","workspace","ref_table","ref_uid","ref_string",,,,,
,"01a3ce8c4e3b2bb1aa439dc29081f996","sys_workspace_stage",1,"responsible_persons",,,,0,0,"be_users",3,,,,,,
......
......@@ -29,7 +29,7 @@
,311,90,512,0,1,0,310,310,0,0,0,0,"[Translate to Dansk:] Regular Element #10",,,,
,312,90,768,0,2,0,311,311,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #10",,,,
,320,89,512,0,0,0,0,298,2,2,0,298,"Regular Element #2",,,,
,321,89,1280,0,2,0,300,300,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3",,,,
,321,89,480,0,2,0,300,300,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3",,,,
"sys_refindex",,,,,,,,,,,,,,,,,
,"hash","tablename","recuid","field","flexpointer","softref_key","softref_id","sorting","workspace","ref_table","ref_uid","ref_string",,,,,
,"01a3ce8c4e3b2bb1aa439dc29081f996","sys_workspace_stage",1,"responsible_persons",,,,0,0,"be_users",3,,,,,,
......
......@@ -29,7 +29,7 @@
,311,90,512,0,1,0,310,310,0,0,0,0,"[Translate to Dansk:] Regular Element #10",,,,
,312,90,768,0,2,0,311,311,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #10",,,,
,320,89,512,0,0,0,0,298,2,2,0,298,"Regular Element #2",,,,
,321,89,1280,0,2,299,300,300,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3",,,,
,321,89,480,0,2,299,300,300,0,0,0,0,"[Translate to Deutsch:] [Translate to Dansk:] Regular Element #3",,,,
"sys_refindex",,,,,,,,,,,,,,,,,
,"hash","tablename","recuid","field","flexpointer","softref_key","softref_id","sorting","workspace","ref_table","ref_uid","ref_string",,,,,
,"01a3ce8c4e3b2bb1aa439dc29081f996","sys_workspace_stage",1,"responsible_persons",,,,0,0,"be_users",3,,,,,,
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment