1 Commits

2 changed files with 33 additions and 5 deletions

View File

@@ -160,13 +160,14 @@ final class DummyCopier
*/ */
private function copyArticleContentTree(int $sourceArticleId, int $targetArticleId, array $moduleMap, DummyCopyResult $result): void private function copyArticleContentTree(int $sourceArticleId, int $targetArticleId, array $moduleMap, DummyCopyResult $result): void
{ {
$visited = [];
$contentIds = $this->connection->fetchFirstColumn( $contentIds = $this->connection->fetchFirstColumn(
'SELECT id FROM tl_content WHERE ptable = ? AND pid = ? ORDER BY sorting', 'SELECT id FROM tl_content WHERE ptable = ? AND pid = ? ORDER BY sorting',
['tl_article', $sourceArticleId] ['tl_article', $sourceArticleId]
); );
foreach ($contentIds as $contentId) { foreach ($contentIds as $contentId) {
$this->copyContentRecursive((int) $contentId, 'tl_article', $targetArticleId, $moduleMap, $result); $this->copyContentRecursive((int) $contentId, 'tl_article', $targetArticleId, $moduleMap, $result, $visited);
} }
} }
@@ -175,7 +176,8 @@ final class DummyCopier
*/ */
private function copySingleContent(int $sourceContentId, int $targetArticleId, array $moduleMap, DummyCopyResult $result): void private function copySingleContent(int $sourceContentId, int $targetArticleId, array $moduleMap, DummyCopyResult $result): void
{ {
$this->copyContentRecursive($sourceContentId, 'tl_article', $targetArticleId, $moduleMap, $result); $visited = [];
$this->copyContentRecursive($sourceContentId, 'tl_article', $targetArticleId, $moduleMap, $result, $visited);
} }
/** /**
@@ -183,8 +185,13 @@ final class DummyCopier
* *
* @param array<int,int> $moduleMap * @param array<int,int> $moduleMap
*/ */
private function copyContentRecursive(int $sourceContentId, string $targetPtable, int $targetPid, array $moduleMap, DummyCopyResult $result): int private function copyContentRecursive(int $sourceContentId, string $targetPtable, int $targetPid, array $moduleMap, DummyCopyResult $result, array &$visited): int
{ {
if (isset($visited[$sourceContentId])) {
return 0;
}
$visited[$sourceContentId] = true;
$contentRow = $this->fetchRow('tl_content', $sourceContentId); $contentRow = $this->fetchRow('tl_content', $sourceContentId);
if ($contentRow === null) { if ($contentRow === null) {
@@ -207,6 +214,7 @@ final class DummyCopier
} }
$newContentId = $this->insertRow('tl_content', $contentRow); $newContentId = $this->insertRow('tl_content', $contentRow);
$result->contentMap[$sourceContentId] = $newContentId;
$result->copiedContent++; $result->copiedContent++;
$result->copiedContentIds[] = $newContentId; $result->copiedContentIds[] = $newContentId;
@@ -220,7 +228,7 @@ final class DummyCopier
); );
foreach ($childIds as $childId) { foreach ($childIds as $childId) {
$this->copyContentRecursive((int) $childId, 'tl_content', $newContentId, $moduleMap, $result); $this->copyContentRecursive((int) $childId, 'tl_content', $newContentId, $moduleMap, $result, $visited);
} }
return $newContentId; return $newContentId;
@@ -260,6 +268,23 @@ final class DummyCopier
$params $params
); );
} }
foreach ($result->contentMap as $oldContentId => $newContentId) {
$sourceAliasTarget = (int) $this->connection->fetchOne(
'SELECT cteAlias FROM tl_content WHERE id = ? AND type = ?',
[$oldContentId, 'alias']
);
if ($sourceAliasTarget < 1 || !isset($result->contentMap[$sourceAliasTarget])) {
continue;
}
$this->connection->update(
'tl_content',
['cteAlias' => $result->contentMap[$sourceAliasTarget]],
['id' => $newContentId, 'type' => 'alias']
);
}
} }
private function copyDirectories(DummyCopyOptions $options, DummyCopyResult $result): void private function copyDirectories(DummyCopyOptions $options, DummyCopyResult $result): void
@@ -362,7 +387,7 @@ final class DummyCopier
private function estimateContentCount(DummyCopyOptions $options): int private function estimateContentCount(DummyCopyOptions $options): int
{ {
$count = \count($options->sourceContentIds); $count = $this->countContentTree(array_map('intval', $options->sourceContentIds));
if (!$options->includeContent || $options->sourcePageIds === []) { if (!$options->includeContent || $options->sourcePageIds === []) {
return $count; return $count;

View File

@@ -17,6 +17,9 @@ final class DummyCopyResult
/** @var array<int,int> */ /** @var array<int,int> */
public array $moduleMap = []; public array $moduleMap = [];
/** @var array<int,int> */
public array $contentMap = [];
/** @var array<string> */ /** @var array<string> */
public array $notes = []; public array $notes = [];