Fix language PIP issues
authorMatthias Schmidt <gravatronics@live.com>
Tue, 16 Oct 2018 17:55:32 +0000 (19:55 +0200)
committerMatthias Schmidt <gravatronics@live.com>
Tue, 16 Oct 2018 17:55:32 +0000 (19:55 +0200)
See #2545

wcfsetup/install/files/lib/system/devtools/pip/TMultiXmlGuiPackageInstallationPlugin.class.php
wcfsetup/install/files/lib/system/package/plugin/LanguagePackageInstallationPlugin.class.php

index 440c4e253cdc203f883489cae71f466b66a92e1e..23d615c5f0eb522a135489c7159e1f7e89bbc335 100644 (file)
@@ -38,10 +38,7 @@ trait TMultiXmlGuiPackageInstallationPlugin {
         */
        public function addEntry(IFormDocument $form) {
                foreach ($this->getProjectXmls() as $xml) {
-                       $document = $xml->getDocument();
-                       
-                       $newElement = $this->createXmlElement($document, $form);
-                       $this->insertNewXmlElement($xml, $newElement);
+                       $newElement = $this->createAndInsertNewXmlElement($xml, $form);
                        
                        $this->saveObject($newElement);
                        
@@ -49,6 +46,20 @@ trait TMultiXmlGuiPackageInstallationPlugin {
                }
        }
        
+       /**
+        * Creates a new XML element and insert it into the XML file.
+        * 
+        * @param       XML             $xml
+        * @param       IFormDocument   $form
+        * @return      \DOMElement
+        */
+       protected function createAndInsertNewXmlElement(XML $xml, IFormDocument $form) {
+               $newElement = $this->createXmlElement($xml->getDocument(), $form);
+               $this->insertNewXmlElement($xml, $newElement);
+               
+               return $newElement;
+       }
+       
        /**
         * Edits the entry of this pip with the given identifier based on the data
         * provided by the given form and returns the new identifier of the entry
@@ -61,14 +72,8 @@ trait TMultiXmlGuiPackageInstallationPlugin {
        public function editEntry(IFormDocument $form, $identifier) {
                $newElement = null;
                foreach ($this->getProjectXmls() as $xml) {
-                       $document = $xml->getDocument();
-                       
-                       // add updated element
-                       $newElement = $this->createXmlElement($document, $form);
-                       
-                       // replace old element
                        $element = $this->getElementByIdentifier($xml, $identifier);
-                       DOMUtil::replaceElement($element, $newElement);
+                       $newElement = $this->replaceXmlElement($xml, $form, $identifier);
                        
                        $this->saveObject($newElement, $element);
                        
@@ -82,6 +87,24 @@ trait TMultiXmlGuiPackageInstallationPlugin {
                return $this->getElementIdentifier($newElement);
        }
        
+       /**
+        * Replaces an edited element with a new element and returns the new element.
+        * 
+        * @param       XML             $xml
+        * @param       IFormDocument   $form
+        * @param       string          $identifier
+        * @return      \DOMElement
+        */
+       protected function replaceXmlElement(XML $xml, IFormDocument $form, $identifier) {
+               $newElement = $this->createXmlElement($xml->getDocument(), $form);
+               
+               // replace old element
+               $element = $this->getElementByIdentifier($xml, $identifier);
+               DOMUtil::replaceElement($element, $newElement);
+               
+               return $newElement;
+       }
+       
        /**
         * Returns a list of all pip entries of this pip.
         *
index 5526b8499957985d28b1becb785a234d4a5e9f44..21552c0d358203460fbe8ab7e210a73d1a874d04 100644 (file)
@@ -26,6 +26,7 @@ use wcf\system\form\builder\IFormDocument;
 use wcf\system\language\LanguageFactory;
 use wcf\system\package\PackageArchive;
 use wcf\system\WCF;
+use wcf\util\DOMUtil;
 use wcf\util\StringUtil;
 use wcf\util\XML;
 
@@ -599,18 +600,15 @@ class LanguagePackageInstallationPlugin extends AbstractXMLPackageInstallationPl
        
        /**
         * @inheritDoc
+        * @sicne       3.2
         */
        protected function getImportElements(\DOMXPath $xpath) {
                return $xpath->query('/ns:language/ns:category/ns:item');
        }
        
        /**
-        * Returns the xml code of an empty xml file with the appropriate structure
-        * present for a new entry to be added as if it was added to an existing
-        * file.
-        * 
-        * @param       string          $languageCode
-        * @return      string
+        * @inheritDoc
+        * @sicne       3.2
         */
        protected function getEmptyXml($languageCode) {
                $xsdFilename = $this->getXsdFilename();
@@ -773,7 +771,7 @@ XML;
                }
                
                /** @var \DOMElement $languageCategory */
-               foreach ($document->documentElement as $languageCategory) {
+               foreach ($document->documentElement->childNodes as $languageCategory) {
                        if ($languageCategory->getAttribute('name') === $languageCategoryName) {
                                $languageCategory->appendChild($languageItem);
                                break;
@@ -790,4 +788,32 @@ XML;
                
                return $languageItem;
        }
+       
+       /**
+        * @inheritDoc
+        * @since       3.2
+        */
+       protected function createAndInsertNewXmlElement(XML $xml, IFormDocument $form) {
+               return $this->createXmlElement($xml->getDocument(), $form);
+       }
+       
+       /**
+        * @inheritDoc
+        * @since       3.2
+        */
+       protected function replaceXmlElement(XML $xml, IFormDocument $form, $identifier) {
+               $newElement = $this->createXmlElement($xml->getDocument(), $form);
+               
+               // replace old element
+               $element = $this->getElementByIdentifier($xml, $identifier);
+               
+               if ($element->parentNode === $newElement->parentNode) {
+                       DOMUtil::replaceElement($element, $newElement, false);
+               }
+               else {
+                       DOMUtil::removeNode($element);
+               }
+               
+               return $newElement;
+       }
 }