diff --git a/XSD/bbcode.xsd b/XSD/bbcode.xsd index 724730dd5c3..b1f6dc98622 100644 --- a/XSD/bbcode.xsd +++ b/XSD/bbcode.xsd @@ -32,29 +32,29 @@ - - - - - - - - - + - - + + + + + + + + + + - + diff --git a/com.woltlab.wcf/bbcode.xml b/com.woltlab.wcf/bbcode.xml index 20871e88582..b14192fbfec 100644 --- a/com.woltlab.wcf/bbcode.xml +++ b/com.woltlab.wcf/bbcode.xml @@ -1,5 +1,5 @@ - + @@ -81,19 +81,21 @@ + Zitat + Quote 1 - wcf.editor.button.quote - quote-left + quote-left;true + Code + Code 1 1 - wcf.editor.button.code - code + code;false @@ -153,19 +155,21 @@ + Spoiler + Spoiler 1 - wcf.editor.button.spoiler - eye-slash + eye-slash;false + Inline-Code + Inline-Code 1 - wcf.editor.button.inlineCode - terminal + terminal;true wcf\system\bbcode\AttachmentBBCode @@ -227,8 +231,9 @@ 1 1 - wcf.editor.button.woltlabHtml - file-code + Unsicheres HTML + Unsafe HTML + file-code;false wcf\system\bbcode\WoltLabSuiteArticleBBCode diff --git a/wcfsetup/install/files/acp/database/update_com.woltlab.wcf_6.2_step1.php b/wcfsetup/install/files/acp/database/update_com.woltlab.wcf_6.2_step1.php index d34fe5609eb..98fc33dcdbe 100644 --- a/wcfsetup/install/files/acp/database/update_com.woltlab.wcf_6.2_step1.php +++ b/wcfsetup/install/files/acp/database/update_com.woltlab.wcf_6.2_step1.php @@ -87,4 +87,30 @@ ->referencedColumns(['languageID']) ->onDelete('CASCADE'), ]), + DatabaseTable::create('wcf1_bbcode_content') + ->columns([ + ObjectIdDatabaseTableColumn::create('contentID'), + IntDatabaseTableColumn::create('bbcodeID') + ->notNull(), + IntDatabaseTableColumn::create('languageID'), + NotNullVarchar255DatabaseTableColumn::create('buttonLabel'), + ]) + ->indices([ + DatabaseTablePrimaryIndex::create() + ->columns(['contentID']), + DatabaseTableIndex::create('id') + ->columns(['bbcodeID', 'languageID']), + ]) + ->foreignKeys([ + DatabaseTableForeignKey::create() + ->columns(['bbcodeID']) + ->referencedTable('wcf1_bbcode') + ->referencedColumns(['bbcodeID']) + ->onDelete('CASCADE'), + DatabaseTableForeignKey::create() + ->columns(['languageID']) + ->referencedTable('wcf1_language') + ->referencedColumns(['languageID']) + ->onDelete('CASCADE'), + ]), ]; diff --git a/wcfsetup/install/files/acp/templates/bbcodeAdd.tpl b/wcfsetup/install/files/acp/templates/bbcodeAdd.tpl index 7a94b4b0e9d..85e91b3a79f 100644 --- a/wcfsetup/install/files/acp/templates/bbcodeAdd.tpl +++ b/wcfsetup/install/files/acp/templates/bbcodeAdd.tpl @@ -172,7 +172,7 @@
- + {if $errorField == 'buttonLabel'} {if $errorType == 'empty'} diff --git a/wcfsetup/install/files/acp/update_com.woltlab.wcf_6.2_bbcode.php b/wcfsetup/install/files/acp/update_com.woltlab.wcf_6.2_bbcode.php new file mode 100644 index 00000000000..a18f55fc734 --- /dev/null +++ b/wcfsetup/install/files/acp/update_com.woltlab.wcf_6.2_bbcode.php @@ -0,0 +1,49 @@ + ''"; +$statement = WCF::getDB()->prepare($sql); +$statement->execute([1]); +$buttonLabels = $statement->fetchMap('bbcodeID', 'buttonLabel'); + +$sql = "INSERT INTO wcf1_bbcode_content + (bbcodeID, languageID, buttonLabel) + VALUES (?, ?, ?)"; +$statement = WCF::getDB()->prepare($sql); + +$languageItems = []; +foreach ($buttonLabels as $bbcodeID => $buttonLabel) { + if (\preg_match('~^\w+(\.\w+){2,}$~', $buttonLabel, $matches)) { + $languageItems[] = $buttonLabel; + + foreach (LanguageFactory::getInstance()->getLanguages() as $language) { + $statement->execute([ + $bbcodeID, + $language->languageID, + $language->get($buttonLabel), + ]); + } + } else { + $statement->execute([ + $bbcodeID, + LanguageFactory::getInstance()->getDefaultLanguageID(), + $buttonLabel, + ]); + } +} + +if ($languageItems !== []) { + $conditionBuilder = new PreparedStatementConditionBuilder(); + $conditionBuilder->add('languageItem IN (?)', [$languageItems]); + + $sql = "DELETE FROM wcf1_language_item + {$conditionBuilder}"; + $statement = WCF::getDB()->prepare($sql); + $statement->execute($conditionBuilder->getParameters()); +} diff --git a/wcfsetup/install/files/lib/acp/form/BBCodeAddForm.class.php b/wcfsetup/install/files/lib/acp/form/BBCodeAddForm.class.php index 3d547ccac4d..8cf19376517 100644 --- a/wcfsetup/install/files/lib/acp/form/BBCodeAddForm.class.php +++ b/wcfsetup/install/files/lib/acp/form/BBCodeAddForm.class.php @@ -5,13 +5,14 @@ use wcf\data\bbcode\attribute\BBCodeAttributeAction; use wcf\data\bbcode\BBCode; use wcf\data\bbcode\BBCodeAction; -use wcf\data\bbcode\BBCodeEditor; use wcf\form\AbstractForm; +use wcf\system\bbcode\command\SaveContent; use wcf\system\exception\UserInputException; -use wcf\system\language\I18nHandler; +use wcf\system\language\LanguageFactory; use wcf\system\Regex; use wcf\system\request\LinkHandler; use wcf\system\WCF; +use wcf\util\ArrayUtil; use wcf\util\StringUtil; /** @@ -42,7 +43,8 @@ class BBCodeAddForm extends AbstractForm /** * editor button label - * @var string + * + * @var string|string[] */ public $buttonLabel = ''; @@ -98,16 +100,6 @@ class BBCodeAddForm extends AbstractForm */ public $wysiwygIcon = ''; - /** - * @inheritDoc - */ - public function readParameters() - { - parent::readParameters(); - - I18nHandler::getInstance()->register('buttonLabel'); - } - /** * @inheritDoc */ @@ -151,7 +143,6 @@ public function readFormParameters() $this->attributes[$key] = (object)$val; } - I18nHandler::getInstance()->readValues(); $this->readButtonLabelFormParameter(); } @@ -162,8 +153,10 @@ public function readFormParameters() */ protected function readButtonLabelFormParameter() { - if (I18nHandler::getInstance()->isPlainValue('buttonLabel')) { - $this->buttonLabel = I18nHandler::getInstance()->getValue('buttonLabel'); + if (isset($_POST['buttonLabel_i18n']) && \is_array($_POST['buttonLabel_i18n'])) { + $this->buttonLabel = ArrayUtil::trim($_POST['buttonLabel_i18n']); + } elseif (isset($_POST['buttonLabel'])) { + $this->buttonLabel = StringUtil::trim($_POST['buttonLabel']); } } @@ -208,12 +201,14 @@ public function validate() // button if ($this->showButton) { // validate label - if (!I18nHandler::getInstance()->validateValue('buttonLabel')) { - if (I18nHandler::getInstance()->isPlainValue('buttonLabel')) { - throw new UserInputException('buttonLabel'); - } else { - throw new UserInputException('buttonLabel', 'multilingual'); + if (\is_array($this->buttonLabel)) { + foreach (LanguageFactory::getInstance()->getLanguages() as $language) { + if (empty($this->buttonLabel[$language->languageID])) { + throw new UserInputException('buttonLabel', 'multilingual'); + } } + } elseif ($this->buttonLabel === '') { + throw new UserInputException('buttonLabel'); } // validate image path @@ -250,7 +245,6 @@ public function save() $this->objectAction = new BBCodeAction([], 'create', [ 'data' => \array_merge($this->additionalFields, [ 'bbcodeTag' => $this->bbcodeTag, - 'buttonLabel' => $this->buttonLabel, 'className' => $this->className, 'htmlOpen' => $this->htmlOpen, 'htmlClose' => $this->htmlClose, @@ -262,10 +256,14 @@ public function save() ]), ]); $returnValues = $this->objectAction->executeAction(); + $bbcodeID = $returnValues['returnValues']->bbcodeID; + + $this->saveButtonLabel($bbcodeID); + foreach ($this->attributes as $attribute) { $attributeAction = new BBCodeAttributeAction([], 'create', [ 'data' => [ - 'bbcodeID' => $returnValues['returnValues']->bbcodeID, + 'bbcodeID' => $bbcodeID, 'attributeNo' => $attribute->attributeNo, 'attributeHtml' => $attribute->attributeHtml, 'validationPattern' => $attribute->validationPattern, @@ -276,17 +274,6 @@ public function save() $attributeAction->executeAction(); } - if ($this->showButton && !I18nHandler::getInstance()->isPlainValue('buttonLabel')) { - $bbcodeID = $returnValues['returnValues']->bbcodeID; - I18nHandler::getInstance()->save('buttonLabel', 'wcf.editor.button.button' . $bbcodeID, 'wcf.editor', 1); - - // update button label - $bbcodeEditor = new BBCodeEditor($returnValues['returnValues']); - $bbcodeEditor->update([ - 'buttonLabel' => 'wcf.editor.button.button' . $bbcodeID, - ]); - } - $this->saved(); // reset values @@ -294,8 +281,6 @@ public function save() $this->attributes = []; $this->isBlockElement = $this->isSourceCode = $this->showButton = false; - I18nHandler::getInstance()->reset(); - // show success message WCF::getTPL()->assign([ 'success' => true, @@ -313,13 +298,13 @@ public function assignVariables() { parent::assignVariables(); - I18nHandler::getInstance()->assignVariables(); - WCF::getTPL()->assign([ 'action' => 'add', 'attributes' => $this->attributes, 'bbcodeTag' => $this->bbcodeTag, 'buttonLabel' => $this->buttonLabel, + 'availableLanguages' => LanguageFactory::getInstance()->getLanguages(), + 'i18nValues' => ['buttonLabel' => \is_array($this->buttonLabel) ? $this->buttonLabel : []], 'className' => $this->className, 'htmlOpen' => $this->htmlOpen, 'htmlClose' => $this->htmlClose, @@ -329,4 +314,17 @@ public function assignVariables() 'wysiwygIcon' => $this->wysiwygIcon, ]); } + + protected function saveButtonLabel(int $bbcodeID): void + { + if ($this->showButton) { + if (\is_array($this->buttonLabel)) { + $buttonLabels = $this->buttonLabel; + } else { + $buttonLabels = [0 => $this->buttonLabel]; + } + + (new SaveContent($bbcodeID, $buttonLabels))(); + } + } } diff --git a/wcfsetup/install/files/lib/acp/form/BBCodeEditForm.class.php b/wcfsetup/install/files/lib/acp/form/BBCodeEditForm.class.php index 46957132e18..afac61cf6d5 100644 --- a/wcfsetup/install/files/lib/acp/form/BBCodeEditForm.class.php +++ b/wcfsetup/install/files/lib/acp/form/BBCodeEditForm.class.php @@ -8,7 +8,6 @@ use wcf\data\bbcode\BBCodeAction; use wcf\form\AbstractForm; use wcf\system\exception\IllegalLinkException; -use wcf\system\language\I18nHandler; use wcf\system\WCF; /** @@ -78,10 +77,6 @@ public function readParameters() if (!$this->bbcode->bbcodeID) { throw new IllegalLinkException(); } - - if (!\in_array($this->bbcode->bbcodeTag, self::$nativeBBCodes)) { - I18nHandler::getInstance()->register('buttonLabel'); - } } /** @@ -111,21 +106,10 @@ public function save() { AbstractForm::save(); - if ($this->showButton) { - $this->buttonLabel = 'wcf.editor.button.button' . $this->bbcode->bbcodeID; - if (I18nHandler::getInstance()->isPlainValue('buttonLabel')) { - I18nHandler::getInstance()->remove($this->buttonLabel); - $this->buttonLabel = I18nHandler::getInstance()->getValue('buttonLabel'); - } else { - I18nHandler::getInstance()->save('buttonLabel', $this->buttonLabel, 'wcf.editor', 1); - } - } - // update bbcode $this->objectAction = new BBCodeAction([$this->bbcodeID], 'update', [ 'data' => \array_merge($this->additionalFields, [ 'bbcodeTag' => $this->bbcodeTag, - 'buttonLabel' => $this->buttonLabel, 'className' => $this->className, 'htmlClose' => $this->htmlClose, 'htmlOpen' => $this->htmlOpen, @@ -137,6 +121,8 @@ public function save() ]); $this->objectAction->executeAction(); + $this->saveButtonLabel($this->bbcodeID); + // clear existing attributes $sql = "DELETE FROM wcf1_bbcode_attribute WHERE bbcodeID = ?"; @@ -171,13 +157,22 @@ public function readData() parent::readData(); if (empty($_POST)) { - I18nHandler::getInstance()->setOptions( - 'buttonLabel', - 1, - $this->bbcode->buttonLabel, - 'wcf.editor.button.button\d+' - ); - $this->buttonLabel = $this->bbcode->buttonLabel; + $sql = "SELECT buttonLabel, languageID + FROM wcf1_bbcode_content + WHERE bbcodeID = ?"; + $statement = WCF::getDB()->prepare($sql); + $statement->execute([$this->bbcodeID]); + + $this->buttonLabel = []; + while ($row = $statement->fetchArray()) { + $this->buttonLabel[$row['languageID'] ?: 0] = $row['buttonLabel']; + } + + if (\count($this->buttonLabel) === 1) { + $this->buttonLabel = \reset($this->buttonLabel); + } elseif ($this->buttonLabel === []) { + $this->buttonLabel = ''; + } $this->attributes = BBCodeAttribute::getAttributesByBBCode($this->bbcode); $this->bbcodeTag = $this->bbcode->bbcodeTag; @@ -198,8 +193,6 @@ public function assignVariables() { parent::assignVariables(); - I18nHandler::getInstance()->assignVariables(!empty($_POST)); - WCF::getTPL()->assign([ 'bbcode' => $this->bbcode, 'action' => 'edit', diff --git a/wcfsetup/install/files/lib/data/bbcode/BBCode.class.php b/wcfsetup/install/files/lib/data/bbcode/BBCode.class.php index 80e08b55a93..28361b9e5ba 100644 --- a/wcfsetup/install/files/lib/data/bbcode/BBCode.class.php +++ b/wcfsetup/install/files/lib/data/bbcode/BBCode.class.php @@ -5,6 +5,7 @@ use wcf\data\bbcode\attribute\BBCodeAttribute; use wcf\data\ProcessibleDatabaseObject; use wcf\system\bbcode\IBBCode; +use wcf\system\language\LanguageFactory; use wcf\system\request\IRouteController; use wcf\system\WCF; @@ -36,6 +37,11 @@ class BBCode extends ProcessibleDatabaseObject implements IRouteController */ protected $attributes; + /** + * @var array + */ + protected array $buttonLabels; + /** * @inheritDoc */ @@ -90,9 +96,17 @@ public function getTitle(): string * @return string * @since 5.2 */ - public function getButtonLabel() + public function getButtonLabel(): string { - return WCF::getLanguage()->get($this->buttonLabel); + $this->loadButtonLabels(); + + if ($this->buttonLabels === []) { + return ''; + } + + return $this->buttonLabels[WCF::getLanguage()->languageID] + ?? $this->buttonLabels[LanguageFactory::getInstance()->getDefaultLanguageID()] + ?? \reset($this->buttonLabels); } /** @@ -180,4 +194,38 @@ public function getIcon(): string $this->wysiwygIcon ); } + + /** + * @since 6.2 + */ + protected function loadButtonLabels(): void + { + if (isset($this->buttonLabels)) { + return; + } + + $sql = "SELECT languageID, buttonLabel + FROM wcf1_bbcode_content + WHERE bbcodeID = ?"; + + $statement = WCF::getDB()->prepare($sql); + $statement->execute([$this->bbcodeID]); + + $this->buttonLabels = []; + while ($row = $statement->fetchArray()) { + $this->buttonLabels[$row['languageID'] ?: 0] = $row['buttonLabel']; + } + } + + /** + * @since 6.2 + */ + public function setButtonLabel(int $languageID, string $buttonLabel): void + { + if (!isset($this->buttonLabels)) { + $this->buttonLabels = []; + } + + $this->buttonLabels[$languageID] = $buttonLabel; + } } diff --git a/wcfsetup/install/files/lib/data/bbcode/BBCodeList.class.php b/wcfsetup/install/files/lib/data/bbcode/BBCodeList.class.php index 0f94adffc7b..44043daa1f4 100644 --- a/wcfsetup/install/files/lib/data/bbcode/BBCodeList.class.php +++ b/wcfsetup/install/files/lib/data/bbcode/BBCodeList.class.php @@ -3,6 +3,8 @@ namespace wcf\data\bbcode; use wcf\data\DatabaseObjectList; +use wcf\system\database\util\PreparedStatementConditionBuilder; +use wcf\system\WCF; /** * Represents a list of bbcodes. @@ -19,4 +21,30 @@ class BBCodeList extends DatabaseObjectList * @inheritDoc */ public $className = BBCode::class; + + #[\Override] + public function readObjects() + { + parent::readObjects(); + + if ($this->objectIDs !== []) { + $this->loadButtonLabels(); + } + } + + private function loadButtonLabels(): void + { + $conditionBuilder = new PreparedStatementConditionBuilder(); + $conditionBuilder->add("bbcodeID IN(?)", [$this->objectIDs]); + + $sql = "SELECT * + FROM wcf1_bbcode_content + {$conditionBuilder}"; + $statement = WCF::getDB()->prepare($sql); + $statement->execute($conditionBuilder->getParameters()); + + while ($row = $statement->fetchArray()) { + $this->objects[$row['bbcodeID']]->setButtonLabel($row['languageID'], $row['buttonLabel']); + } + } } diff --git a/wcfsetup/install/files/lib/system/bbcode/command/SaveContent.class.php b/wcfsetup/install/files/lib/system/bbcode/command/SaveContent.class.php new file mode 100644 index 00000000000..21df2a5bf5b --- /dev/null +++ b/wcfsetup/install/files/lib/system/bbcode/command/SaveContent.class.php @@ -0,0 +1,54 @@ + + * @since 6.2 + */ +final class SaveContent +{ + public function __construct( + public readonly int $bbcodeID, + /** @var array */ + public readonly array $buttonLabels, + ) { + } + + public function __invoke(): void + { + if ($this->buttonLabels === []) { + return; + } + + $this->deleteOldContent($this->bbcodeID); + $this->saveContent($this->bbcodeID, $this->buttonLabels); + } + + private function deleteOldContent(int $bbcodeID): void + { + $sql = "DELETE FROM wcf1_bbcode_content + WHERE bbcodeID = ?"; + $statement = WCF::getDB()->prepare($sql); + $statement->execute([$bbcodeID]); + } + + /** + * @param array $buttonLabels + */ + private function saveContent(int $bbcodeID, array $buttonLabels): void + { + $sql = "INSERT INTO wcf1_bbcode_content + (bbcodeID, languageID, buttonLabel) + VALUES (?, ?, ?)"; + $statement = WCF::getDB()->prepare($sql); + + foreach ($buttonLabels as $languageID => $buttonLabel) { + $statement->execute([$bbcodeID, $languageID ?: null, $buttonLabel]); + } + } +} diff --git a/wcfsetup/install/files/lib/system/package/plugin/BBCodePackageInstallationPlugin.class.php b/wcfsetup/install/files/lib/system/package/plugin/BBCodePackageInstallationPlugin.class.php index 314899b99a7..4865f270dee 100644 --- a/wcfsetup/install/files/lib/system/package/plugin/BBCodePackageInstallationPlugin.class.php +++ b/wcfsetup/install/files/lib/system/package/plugin/BBCodePackageInstallationPlugin.class.php @@ -7,6 +7,7 @@ use wcf\data\bbcode\BBCodeEditor; use wcf\data\bbcode\BBCodeList; use wcf\data\package\PackageCache; +use wcf\system\bbcode\command\SaveContent; use wcf\system\bbcode\IBBCode; use wcf\system\database\util\PreparedStatementConditionBuilder; use wcf\system\devtools\pip\IDevtoolsPipEntryList; @@ -27,6 +28,7 @@ use wcf\system\form\builder\field\validation\FormFieldValidator; use wcf\system\form\builder\field\validation\FormFieldValidatorUtil; use wcf\system\form\builder\IFormDocument; +use wcf\system\language\LanguageFactory; use wcf\system\WCF; use wcf\util\StringUtil; @@ -64,6 +66,11 @@ class BBCodePackageInstallationPlugin extends AbstractXMLPackageInstallationPlug */ protected $attributes = []; + /** + * @var array> + */ + protected array $buttonLabels = []; + /** * @inheritDoc */ @@ -104,13 +111,22 @@ protected function getElement(\DOMXPath $xpath, array &$elements, \DOMElement $e $nodeValue[$attributeNo][$attributeValue->tagName] = $attributeValue->nodeValue; } } - } elseif ($element->tagName === 'wysiwygicon' && !\str_contains($element->nodeValue, '.')) { + } elseif ($element->tagName === 'wysiwygicon' && !\str_contains($element->nodeValue, '.') && !\str_contains($element->nodeValue, ';')) { + // backwards compatibility $solid = $element->getAttribute('solid'); $nodeValue = \sprintf( "%s;%s", $element->nodeValue, $solid === 'true' ? 'true' : 'false' ); + } elseif ($element->tagName === 'buttonlabel') { + if (!isset($elements[$element->tagName])) { + $elements[$element->tagName] = []; + } + + $elements[$element->tagName][$element->getAttribute('language') ?: ''] = $element->nodeValue; + + return; } $elements[$element->tagName] = $nodeValue; @@ -130,7 +146,7 @@ protected function prepareImport(array $data) 'className' => !empty($data['elements']['classname']) ? $data['elements']['classname'] : '', 'isBlockElement' => !empty($data['elements']['isBlockElement']) ? 1 : 0, 'isSourceCode' => !empty($data['elements']['sourcecode']) ? 1 : 0, - 'buttonLabel' => $data['elements']['buttonlabel'] ?? '', + 'buttonLabel' => $data['elements']['buttonlabel'] ?? [], 'originIsSystem' => 1, ]; @@ -188,13 +204,15 @@ protected function import(array $row, array $data) { // extract attributes $attributes = $data['attributes']; + $buttonLabel = $data['buttonLabel'] ?? []; unset($data['attributes']); + unset($data['buttonLabel']); if (!empty($row)) { // allow updating of all values except for those controlling the editor button unset($data['wysiwygIcon']); - unset($data['buttonLabel']); unset($data['showButton']); + unset($buttonLabel); } /** @var BBCode $bbcode */ @@ -203,6 +221,10 @@ protected function import(array $row, array $data) // store attributes for later import $this->attributes[$bbcode->bbcodeID] = $attributes; + if (isset($buttonLabel) && $buttonLabel !== []) { + $this->buttonLabels[$bbcode->bbcodeID] = $buttonLabel; + } + return $bbcode; } @@ -238,6 +260,16 @@ protected function postImport() } } } + + foreach ($this->buttonLabels as $bbcodeID => $buttonLabels) { + $labels = []; + foreach ($buttonLabels as $languageCode => $buttonLabel) { + $languageID = $languageCode !== '' ? LanguageFactory::getInstance()->getLanguageByCode($languageCode)->languageID : 0; + $labels[$languageID] = $buttonLabel; + } + + (new SaveContent($bbcodeID, $labels))(); + } } /** @@ -271,10 +303,18 @@ protected function fetchElementData(\DOMElement $element, $saveData) 'bbcodeTag' => $element->getAttribute('name'), 'packageID' => $this->installation->getPackage()->packageID, 'originIsSystem' => 1, + 'buttonLabel' => [], ]; + /** @var \DOMElement $name */ + foreach ($element->getElementsByTagName('buttonlabel') as $name) { + $langaugeCode = $name->getAttribute('language'); + $languageID = $langaugeCode !== '' ? LanguageFactory::getInstance()->getLanguageByCode($langaugeCode)->languageID : 0; + + $data['buttonLabel'][$languageID] = $name->nodeValue; + } + $optionalElements = [ - 'buttonLabel' => 'buttonlabel', 'className' => 'classname', 'htmlClose' => 'htmlclose', 'htmlOpen' => 'htmlopen', @@ -467,6 +507,7 @@ protected function addFormFields(IFormDocument $form) ->description('wcf.acp.pip.bbcode.buttonLabel.description') ->required() ->maximumLength(255) + ->i18n() ->addDependency( NonEmptyFormFieldDependency::create('showButton') ->fieldId('showButton') @@ -555,11 +596,26 @@ protected function setEntryListKeys(IDevtoolsPipEntryList $entryList) */ protected function prepareXmlElement(\DOMDocument $document, IFormDocument $form) { + $formData = $form->getData(); $data = $form->getData()['data']; $bbcode = $document->createElement($this->tagName); $bbcode->setAttribute('name', $data['name']); + if (isset($formData['buttonlabel'])) { + foreach ($formData['buttonlabel'] as $languageID => $buttonLabel) { + $buttonLabelElement = $document->createElement('buttonlabel', $this->getAutoCdataValue($buttonLabel)); + if ($languageID !== 0) { + $buttonLabelElement->setAttribute( + 'language', + LanguageFactory::getInstance()->getLanguage($languageID)->languageCode + ); + } + + $bbcode->appendChild($buttonLabelElement); + } + } + $this->appendElementChildren( $bbcode, [ @@ -574,7 +630,6 @@ protected function prepareXmlElement(\DOMDocument $document, IFormDocument $form ], 'isBlockElement' => 0, 'sourcecode' => 0, - 'buttonlabel' => '', 'wysiwygicon' => '', ], $form diff --git a/wcfsetup/setup/db/install.sql b/wcfsetup/setup/db/install.sql index f79b2a3b987..0cd1828c0d1 100644 --- a/wcfsetup/setup/db/install.sql +++ b/wcfsetup/setup/db/install.sql @@ -287,6 +287,17 @@ CREATE TABLE wcf1_bbcode_media_provider ( UNIQUE KEY name (name, packageID) ); +DROP TABLE IF EXISTS wcf1_bbcode_content; +CREATE TABLE wcf1_bbcode_content ( + contentID INT NOT NULL AUTO_INCREMENT, + bbcodeID INT NOT NULL, + languageID INT, + buttonLabel VARCHAR(255) NOT NULL, + + PRIMARY KEY(contentID), + KEY id (bbcodeID, languageID) +); + DROP TABLE IF EXISTS wcf1_blacklist_status; CREATE TABLE wcf1_blacklist_status ( date DATE NOT NULL, @@ -2064,6 +2075,9 @@ ALTER TABLE wcf1_bbcode ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (pac ALTER TABLE wcf1_bbcode_attribute ADD FOREIGN KEY (bbcodeID) REFERENCES wcf1_bbcode (bbcodeID) ON DELETE CASCADE; +ALTER TABLE wcf1_bbcode_content ADD FOREIGN KEY (bbcodeID) REFERENCES wcf1_bbcode (bbcodeID) ON DELETE CASCADE; +ALTER TABLE wcf1_bbcode_content ADD FOREIGN KEY (languageID) REFERENCES wcf1_language (languageID) ON DELETE CASCADE; + ALTER TABLE wcf1_bbcode_media_provider ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE; ALTER TABLE wcf1_box ADD FOREIGN KEY (objectTypeID) REFERENCES wcf1_object_type (objectTypeID) ON DELETE CASCADE;