From 353bcc93a453dc7a62dee27b3197a58fe4de7ed9 Mon Sep 17 00:00:00 2001 From: Matthias Schmidt Date: Tue, 16 Oct 2018 19:55:32 +0200 Subject: [PATCH] Fix language PIP issues See #2545 --- ...iXmlGuiPackageInstallationPlugin.class.php | 45 ++++++++++++++----- ...anguagePackageInstallationPlugin.class.php | 40 ++++++++++++++--- 2 files changed, 67 insertions(+), 18 deletions(-) diff --git a/wcfsetup/install/files/lib/system/devtools/pip/TMultiXmlGuiPackageInstallationPlugin.class.php b/wcfsetup/install/files/lib/system/devtools/pip/TMultiXmlGuiPackageInstallationPlugin.class.php index 440c4e253c..23d615c5f0 100644 --- a/wcfsetup/install/files/lib/system/devtools/pip/TMultiXmlGuiPackageInstallationPlugin.class.php +++ b/wcfsetup/install/files/lib/system/devtools/pip/TMultiXmlGuiPackageInstallationPlugin.class.php @@ -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. * diff --git a/wcfsetup/install/files/lib/system/package/plugin/LanguagePackageInstallationPlugin.class.php b/wcfsetup/install/files/lib/system/package/plugin/LanguagePackageInstallationPlugin.class.php index 5526b84999..21552c0d35 100644 --- a/wcfsetup/install/files/lib/system/package/plugin/LanguagePackageInstallationPlugin.class.php +++ b/wcfsetup/install/files/lib/system/package/plugin/LanguagePackageInstallationPlugin.class.php @@ -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; + } } -- 2.20.1