From df0a0f6a23fe9f35296b6bb15ce65b41c0404530 Mon Sep 17 00:00:00 2001
From: Elmar Ludwig <elmar.ludwig@uni-osnabrueck.de>
Date: Fri, 12 Aug 2022 08:21:15 +0000
Subject: [PATCH] fix order during copy, don't use self to access methods on
 $this, fixes #1361

Closes #1361

Merge request studip/studip!892
---
 lib/models/Courseware/Container.php         |  8 +++-----
 lib/models/Courseware/StructuralElement.php | 21 ++++++++-------------
 2 files changed, 11 insertions(+), 18 deletions(-)

diff --git a/lib/models/Courseware/Container.php b/lib/models/Courseware/Container.php
index b42856d56ef..1f621e5c883 100644
--- a/lib/models/Courseware/Container.php
+++ b/lib/models/Courseware/Container.php
@@ -120,7 +120,7 @@ class Container extends \SimpleORMap
 
         $container->store();
 
-        $blockMap = self::copyBlocks($user, $container, $this);
+        $blockMap = $this->copyBlocks($user, $container);
 
         $container['payload'] = $container->type->copyPayload($blockMap);
 
@@ -129,13 +129,11 @@ class Container extends \SimpleORMap
         return $container;
     }
 
-    private function copyBlocks(User $user, Container $newContainer, Container $remoteContainer): array
+    private function copyBlocks(User $user, Container $newContainer): array
     {
         $blockMap = [];
 
-        $blocks = Block::findBySQL('container_id = ?', [$remoteContainer->id]);
-
-        foreach ($blocks as $block) {
+        foreach ($this->blocks as $block) {
             $newBlock = $block->copy($user, $newContainer);
             $blockMap[$block->id] = $newBlock->id;
         }
diff --git a/lib/models/Courseware/StructuralElement.php b/lib/models/Courseware/StructuralElement.php
index 5b834e9cd97..8edabadb5fc 100644
--- a/lib/models/Courseware/StructuralElement.php
+++ b/lib/models/Courseware/StructuralElement.php
@@ -678,7 +678,7 @@ SQL;
      */
     public function copy(User $user, StructuralElement $parent, string $purpose = ''): StructuralElement
     {
-        $file_ref_id = self::copyImage($user, $parent);
+        $file_ref_id = $this->copyImage($user, $parent);
 
         $element = self::build([
             'parent_id' => $parent->id,
@@ -696,9 +696,9 @@ SQL;
 
         $element->store();
 
-        self::copyContainers($user, $element);
+        $this->copyContainers($user, $element);
 
-        self::copyChildren($user, $element, $purpose);
+        $this->copyChildren($user, $element, $purpose);
 
         return $element;
     }
@@ -724,7 +724,7 @@ SQL;
     {
         // merge with target
         if (!$target->image_id) {
-            $target->image_id = self::copyImage($user, $target);
+            $target->image_id = $this->copyImage($user, $target);
         }
 
         if ($target->title === 'neue Seite' || $target->title === 'New page') {
@@ -762,29 +762,24 @@ SQL;
         $target->store();
 
         // add Containers to target
-        self::copyContainers($user, $target);
+        $this->copyContainers($user, $target);
 
         // copy Children
-
-        self::copyChildren($user, $target);
+        $this->copyChildren($user, $target);
 
         return $this;
     }
 
     private function copyContainers(User $user, StructuralElement $newElement): void
     {
-        $containers = \Courseware\Container::findBySQL('structural_element_id = ?', [$this->id]);
-
-        foreach ($containers as $container) {
+        foreach ($this->containers as $container) {
             $container->copy($user, $newElement);
         }
     }
 
     private function copyChildren(User $user, StructuralElement $newElement, string $purpose = ''): void
     {
-        $children = self::findBySQL('parent_id = ?', [$this->id]);
-
-        foreach ($children as $child) {
+        foreach ($this->children as $child) {
             $child->copy($user, $newElement, $purpose);
         }
     }
-- 
GitLab