Added basic contact options
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / lib / acp / form / AbstractAcpForm.class.php
1 <?php
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;
9 use wcf\system\WCF;
10
11 /**
12 * Default implementation for ACP forms with i18n support.
13 *
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
18 * @since 3.1
19 */
20 abstract class AbstractAcpForm extends AbstractForm {
21 /**
22 * action type
23 * @var string
24 */
25 public $action = 'add';
26
27 /**
28 * @var I18nValue[]
29 */
30 public $i18nValues = [];
31
32 /**
33 * Registers a new i18n value.
34 *
35 * @param I18nValue $value
36 */
37 public function registerI18nValue(I18nValue $value) {
38 $fieldName = $value->getFieldName();
39
40 if (isset($this->i18nValues[$fieldName])) {
41 throw new \InvalidArgumentException("Duplicate value definition for '{$fieldName}'.");
42 }
43 else if (!property_exists($this, $fieldName)) {
44 throw new \UnexpectedValueException("Implementing class does not expose the property '{$fieldName}'.");
45 }
46
47 $this->i18nValues[$fieldName] = $value;
48
49 I18nHandler::getInstance()->register($fieldName);
50 }
51
52 /**
53 * Retrieves an i18n value object.
54 *
55 * @param string $fieldName
56 * @return I18nValue|null
57 */
58 public function getI18nValue($fieldName) {
59 if (isset($this->i18nValues[$fieldName])) {
60 return $this->i18nValues[$fieldName];
61 }
62
63 return null;
64 }
65
66 /**
67 * @inheritDoc
68 */
69 public function readFormParameters() {
70 parent::readFormParameters();
71
72 if (!empty($this->i18nValues)) {
73 I18nHandler::getInstance()->readValues();
74
75 foreach ($this->i18nValues as $fieldName => $value) {
76 if (I18nHandler::getInstance()->isPlainValue($fieldName)) {
77 $this->{$fieldName} = I18nHandler::getInstance()->getValue($fieldName);
78 }
79 }
80 }
81 }
82
83 /**
84 * @inheritDoc
85 */
86 public function validate() {
87 parent::validate();
88
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(
92 $fieldName,
93 (I18nHandler::getInstance()->isPlainValue($fieldName)) ? 'empty' : 'multilingual'
94 );
95 }
96 }
97 }
98
99 /**
100 * @inheritDoc
101 */
102 public function readDataI18n(DatabaseObject $databaseObject) {
103 if (empty($_POST) && !empty($this->i18nValues)) {
104 foreach ($this->i18nValues as $fieldName => $value) {
105 I18nHandler::getInstance()->setOptions(
106 $fieldName,
107 $value->getPackageID(),
108 $databaseObject->{$fieldName},
109 "{$value->getLanguageItem()}\d+"
110 );
111 }
112 }
113 }
114
115 public function beforeSaveI18n(DatabaseObject $databaseObject) {
116 $values = [];
117
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);
122
123 $values[$fieldName] = I18nHandler::getInstance()->getValue($fieldName);
124 $this->{$fieldName} = $values[$fieldName];
125 }
126 else {
127 I18nHandler::getInstance()->save(
128 $fieldName,
129 $this->{$fieldName},
130 $value->getLanguageCategory(),
131 $value->getPackageID()
132 );
133
134 $values[$fieldName] = I18nHandler::getInstance()->getValues($fieldName)[WCF::getLanguage()->languageID];
135 }
136 }
137
138 return $values;
139 }
140
141 /**
142 * @inheritDoc
143 */
144 public function saveI18n(DatabaseObject $databaseObject, $editorClass) {
145 $data = [];
146
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(
152 $fieldName,
153 $languageItem,
154 $value->getLanguageCategory(),
155 $value->getPackageID()
156 );
157
158 $data[$fieldName] = $languageItem;
159 }
160 }
161
162 if (!empty($data)) {
163 /** @var DatabaseObjectEditor $editor */
164 $editor = new $editorClass($databaseObject);
165 $editor->update($data);
166 }
167 }
168
169 /**
170 * Resets the form values and calls the saved event.
171 */
172 public function reset() {
173 $this->saved();
174
175 if (!empty($this->i18nValues)) {
176 foreach ($this->i18nValues as $fieldName => $value) {
177 $this->{$fieldName} = '';
178 }
179
180 I18nHandler::getInstance()->reset();
181 }
182
183 // show success message
184 WCF::getTPL()->assign('success', true);
185 }
186
187 /**
188 * @inheritDoc
189 */
190 public function assignVariables() {
191 parent::assignVariables();
192
193 if (!empty($this->i18nValues)) {
194 $useRequestData = ($this->action === 'add') ? true : !empty($_POST);
195
196 I18nHandler::getInstance()->assignVariables($useRequestData);
197 }
198
199 WCF::getTPL()->assign([
200 'action' => $this->action
201 ]);
202 }
203 }