2 namespace wcf\acp\form
;
3 use wcf\data\DatabaseObject
;
4 use wcf\data\DatabaseObjectEditor
;
5 use wcf\form\AbstractForm
;
6 use wcf\system\exception\UserInputException
;
7 use wcf\system\language\I18nHandler
;
8 use wcf\system\language\I18nValue
;
12 * Default implementation for ACP forms with i18n support.
14 * @author Alexander Ebert
15 * @copyright 2001-2017 WoltLab GmbH
16 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
17 * @package WoltLabSuite\Core\Acp\Form
20 abstract class AbstractAcpForm
extends AbstractForm
{
25 public $action = 'add';
30 public $i18nValues = [];
33 * Registers a new i18n value.
35 * @param I18nValue $value
37 public function registerI18nValue(I18nValue
$value) {
38 $fieldName = $value->getFieldName();
40 if (isset($this->i18nValues
[$fieldName])) {
41 throw new \
InvalidArgumentException("Duplicate value definition for '{$fieldName}'.");
43 else if (!property_exists($this, $fieldName)) {
44 throw new \
UnexpectedValueException("Implementing class does not expose the property '{$fieldName}'.");
47 $this->i18nValues
[$fieldName] = $value;
49 I18nHandler
::getInstance()->register($fieldName);
53 * Retrieves an i18n value object.
55 * @param string $fieldName
56 * @return I18nValue|null
58 public function getI18nValue($fieldName) {
59 if (isset($this->i18nValues
[$fieldName])) {
60 return $this->i18nValues
[$fieldName];
69 public function readFormParameters() {
70 parent
::readFormParameters();
72 if (!empty($this->i18nValues
)) {
73 I18nHandler
::getInstance()->readValues();
75 foreach ($this->i18nValues
as $fieldName => $value) {
76 if (I18nHandler
::getInstance()->isPlainValue($fieldName)) {
77 $this->{$fieldName} = I18nHandler
::getInstance()->getValue($fieldName);
86 public function validate() {
89 foreach ($this->i18nValues
as $fieldName => $value) {
90 if (!I18nHandler
::getInstance()->validateValue($fieldName, $value->getFlag(I18nValue
::REQUIRE_I18N
), $value->getFlag(I18nValue
::ALLOW_EMPTY
))) {
91 throw new UserInputException(
93 (I18nHandler
::getInstance()->isPlainValue($fieldName)) ?
'empty' : 'multilingual'
102 public function readDataI18n(DatabaseObject
$databaseObject) {
103 if (empty($_POST) && !empty($this->i18nValues
)) {
104 foreach ($this->i18nValues
as $fieldName => $value) {
105 I18nHandler
::getInstance()->setOptions(
107 $value->getPackageID(),
108 $databaseObject->{$fieldName},
109 "{$value->getLanguageItem()}\d+"
115 public function beforeSaveI18n(DatabaseObject
$databaseObject) {
118 foreach ($this->i18nValues
as $fieldName => $value) {
119 $this->{$fieldName} = $value->getLanguageItem() . $databaseObject->getObjectID();
120 if (I18nHandler
::getInstance()->isPlainValue($fieldName)) {
121 I18nHandler
::getInstance()->remove($fieldName);
123 $values[$fieldName] = I18nHandler
::getInstance()->getValue($fieldName);
124 $this->{$fieldName} = $values[$fieldName];
127 I18nHandler
::getInstance()->save(
130 $value->getLanguageCategory(),
131 $value->getPackageID()
134 $values[$fieldName] = I18nHandler
::getInstance()->getValues($fieldName)[WCF
::getLanguage()->languageID
];
144 public function saveI18n(DatabaseObject
$databaseObject, $editorClass) {
147 $objectID = $databaseObject->getObjectID();
148 foreach ($this->i18nValues
as $fieldName => $value) {
149 if (!I18nHandler
::getInstance()->isPlainValue($fieldName)) {
150 $languageItem = $value->getLanguageItem() . $objectID;
151 I18nHandler
::getInstance()->save(
154 $value->getLanguageCategory(),
155 $value->getPackageID()
158 $data[$fieldName] = $languageItem;
163 /** @var DatabaseObjectEditor $editor */
164 $editor = new $editorClass($databaseObject);
165 $editor->update($data);
170 * Resets the form values and calls the saved event.
172 public function reset() {
175 if (!empty($this->i18nValues
)) {
176 foreach ($this->i18nValues
as $fieldName => $value) {
177 $this->{$fieldName} = '';
180 I18nHandler
::getInstance()->reset();
183 // show success message
184 WCF
::getTPL()->assign('success', true);
190 public function assignVariables() {
191 parent
::assignVariables();
193 if (!empty($this->i18nValues
)) {
194 $useRequestData = ($this->action
=== 'add') ?
true : !empty($_POST);
196 I18nHandler
::getInstance()->assignVariables($useRequestData);
199 WCF
::getTPL()->assign([
200 'action' => $this->action