Installation of nested elements (e.g. menu items) failed
authorMarcel Werk <burntime@woltlab.com>
Wed, 6 Apr 2022 15:50:17 +0000 (17:50 +0200)
committerMarcel Werk <burntime@woltlab.com>
Wed, 6 Apr 2022 15:50:17 +0000 (17:50 +0200)
wcfsetup/install/files/lib/system/package/plugin/AbstractXMLPackageInstallationPlugin.class.php

index ce1a7f1d86ac6ec846d45d0a3a5e36de71e44514..f1c94faed71d93fa0b42bcd48d9c3b82dc8d90ea 100644 (file)
@@ -170,11 +170,32 @@ abstract class AbstractXMLPackageInstallationPlugin extends AbstractPackageInsta
             // validate item data
             $this->validateImport($data);
 
+            // try to find an existing item for updating
+            $sqlData = $this->findExistingItem($data);
+
+            // handle items which do not support updating (e.g. cronjobs)
+            if ($sqlData === null) {
+                $row = false;
+            } else {
+                $statement = WCF::getDB()->prepareStatement($sqlData['sql']);
+                $statement->execute($sqlData['parameters']);
+                $row = $statement->fetchArray();
+            }
+
+            // ensure a valid parameter for import()
+            if ($row === false) {
+                $row = [];
+            }
+
+            // import items
+            $this->import($row, $data);
+
             $pipData[] = $data;
         }
 
         if ($this instanceof IUniqueNameXMLPackageInstallationPlugin) {
             $names = \array_map(function ($data) {
+                \assert($this instanceof IUniqueNameXMLPackageInstallationPlugin);
                 return $this->getNameByData($data);
             }, $pipData);
 
@@ -192,28 +213,6 @@ abstract class AbstractXMLPackageInstallationPlugin extends AbstractPackageInsta
             }
         }
 
-        foreach ($pipData as $data) {
-            // try to find an existing item for updating
-            $sqlData = $this->findExistingItem($data);
-
-            // handle items which do not support updating (e.g. cronjobs)
-            if ($sqlData === null) {
-                $row = false;
-            } else {
-                $statement = WCF::getDB()->prepareStatement($sqlData['sql']);
-                $statement->execute($sqlData['parameters']);
-                $row = $statement->fetchArray();
-            }
-
-            // ensure a valid parameter for import()
-            if ($row === false) {
-                $row = [];
-            }
-
-            // import items
-            $this->import($row, $data);
-        }
-
         // fire after import
         $this->postImport();
     }