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;