From 0d8c77e50af0d54e448709f20d19e42552805fe2 Mon Sep 17 00:00:00 2001 From: Matthias Schmidt Date: Thu, 3 Jun 2021 12:52:21 +0200 Subject: [PATCH] Support deleting language items via language PIP MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The old `` structure is deprecated and replaced with `` like in most other XML-based PIPs so that language items can be deleted via ``. Close #4178 --- .../data/language/LanguageEditor.class.php | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/wcfsetup/install/files/lib/data/language/LanguageEditor.class.php b/wcfsetup/install/files/lib/data/language/LanguageEditor.class.php index bb6bc07641..b781500eee 100644 --- a/wcfsetup/install/files/lib/data/language/LanguageEditor.class.php +++ b/wcfsetup/install/files/lib/data/language/LanguageEditor.class.php @@ -257,6 +257,51 @@ class LanguageEditor extends DatabaseObjectEditor implements IEditableCachedObje echo ""; } + /** + * Deletes the language items from the given XML document. + * + * @throws \InvalidArgumentException if given XML document is invalid with regard to deleting language items + * @since 5.5 + */ + protected function deleteFromXML(XML $xml, int $packageID): void + { + $xpath = $xml->xpath(); + + $items = $xpath->query('/ns:language/ns:delete/ns:item'); + if (empty($items)) { + return; + } + + $languageItems = []; + + /** @var \DOMElement $item */ + foreach ($items as $item) { + $itemName = $item->getAttribute('name'); + + if (empty($itemName)) { + throw new \InvalidArgumentException("The 'name' attribute is missing or empty."); + } + + if (StringUtil::trim($itemName) !== $itemName) { + throw new \InvalidArgumentException("The name '{$itemName}' contains leading or trailing whitespaces."); + } + + $languageItems[] = $itemName; + } + + if (empty($languageItems)) { + return; + } + + $conditions = new PreparedStatementConditionBuilder(); + $conditions->add('packageID = ?', [$packageID]); + $conditions->add('languageItem IN (?)', [$languageItems]); + $sql = "DELETE FROM wcf1_language_item + {$conditions}"; + $statement = WCF::getDB()->prepare($sql); + $statement->execute($conditions->getParameters()); + } + /** * Imports language items from an XML file into this language. * Updates the relevant language files automatically. @@ -269,11 +314,17 @@ class LanguageEditor extends DatabaseObjectEditor implements IEditableCachedObje */ public function updateFromXML(XML $xml, $packageID, $updateFiles = true, $updateExistingItems = true) { + $this->deleteFromXML($xml, $packageID); + $xpath = $xml->xpath(); $usedCategories = []; // fetch categories - $categories = $xpath->query('/ns:language/ns:category'); + $categories = $xpath->query('/ns:language/ns:import/ns:category'); + if ($categories->length === 0) { + // Fallback for the old, deprecated version before WSC 5.5, which only supported imports. + $categories = $xpath->query('/ns:language/ns:category'); + } /** @var \DOMElement $category */ foreach ($categories as $category) { -- 2.20.1