Skip to content

Commit d6e5217

Browse files
authored
Merge pull request #6475 from WoltLab/6.2-package-update-server-form
Migrate package update server add form to form builder
2 parents 31042b3 + 3d8b504 commit d6e5217

5 files changed

Lines changed: 207 additions & 259 deletions

File tree

Lines changed: 4 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{include file='header' pageTitle='wcf.acp.updateServer.'|concat:$action}
1+
{include file='header' pageTitle="wcf.acp.updateServer.$action"}
22

33
<header class="contentHeader">
44
<div class="contentHeaderTitle">
@@ -17,57 +17,10 @@
1717
</nav>
1818
</header>
1919

20-
{if $packageUpdateServer|isset && $packageUpdateServer->errorMessage}
21-
<woltlab-core-notice type="warning">{lang}wcf.acp.updateServer.lastErrorMessage{/lang}<br>{$packageUpdateServer->errorMessage}</woltlab-core-notice>
20+
{if $formObject|isset && $formObject->errorMessage}
21+
<woltlab-core-notice type="warning">{lang}wcf.acp.updateServer.lastErrorMessage{/lang}<br>{$formObject->errorMessage}</woltlab-core-notice>
2222
{/if}
2323

24-
{include file='shared_formNotice'}
25-
26-
<form method="post" action="{if $action == 'add'}{link controller='PackageUpdateServerAdd'}{/link}{else}{link controller='PackageUpdateServerEdit' id=$packageUpdateServerID}{/link}{/if}">
27-
<div class="section">
28-
<dl{if $errorField == 'serverURL'} class="formError"{/if}>
29-
<dt><label for="serverURL">{lang}wcf.acp.updateServer.serverURL{/lang}</label></dt>
30-
<dd>
31-
<input type="url" id="serverURL" name="serverURL" value="{$serverURL}" required autofocus class="long"{if $action != 'add'} readonly{/if}>
32-
{if $errorField == 'serverURL'}
33-
<small class="innerError">
34-
{if $errorType == 'empty'}
35-
{lang}wcf.global.form.error.empty{/lang}
36-
{elseif $errorType[duplicate]|isset}
37-
{lang}wcf.acp.updateServer.serverURL.error.duplicate{/lang}
38-
{else}
39-
{lang}wcf.acp.updateServer.serverURL.error.{$errorType}{/lang}
40-
{/if}
41-
</small>
42-
{/if}
43-
</dd>
44-
</dl>
45-
46-
<dl>
47-
<dt><label for="loginUsername">{lang}wcf.acp.updateServer.loginUsername{/lang}</label></dt>
48-
<dd>
49-
<input type="text" id="loginUsername" name="loginUsername" value="{$loginUsername}" class="medium">
50-
<small>{lang}wcf.acp.updateServer.loginUsername.description{/lang}</small>
51-
</dd>
52-
</dl>
53-
54-
<dl>
55-
<dt><label for="loginPassword">{lang}wcf.acp.updateServer.loginPassword{/lang}</label></dt>
56-
<dd>
57-
<input type="password" id="loginPassword" name="loginPassword" value="{$loginPassword}" class="medium" autocomplete="off"{if $action != 'add' && $loginUsername} placeholder="{lang}wcf.acp.updateServer.loginPassword.noChange{/lang}"{/if}>
58-
<small>{lang}wcf.acp.updateServer.loginPassword.description{/lang}</small>
59-
</dd>
60-
</dl>
61-
62-
{event name='dataFields'}
63-
</div>
64-
65-
{event name='sections'}
66-
67-
<div class="formSubmit">
68-
<input type="submit" value="{lang}wcf.global.button.submit{/lang}" accesskey="s">
69-
{csrfToken}
70-
</div>
71-
</form>
24+
{unsafe:$form->getHtml()}
7225

7326
{include file='footer'}

wcfsetup/install/files/lib/acp/form/PackageUpdateServerAddForm.class.php

Lines changed: 134 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,27 @@
66
use wcf\data\package\update\server\PackageUpdateServer;
77
use wcf\data\package\update\server\PackageUpdateServerAction;
88
use wcf\data\package\update\server\PackageUpdateServerList;
9-
use wcf\form\AbstractForm;
10-
use wcf\system\exception\UserInputException;
11-
use wcf\system\request\LinkHandler;
12-
use wcf\system\WCF;
13-
use wcf\util\StringUtil;
9+
use wcf\form\AbstractFormBuilderForm;
10+
use wcf\system\form\builder\container\FormContainer;
11+
use wcf\system\form\builder\data\processor\CustomFormDataProcessor;
12+
use wcf\system\form\builder\field\BooleanFormField;
13+
use wcf\system\form\builder\field\PasswordFormField;
14+
use wcf\system\form\builder\field\TextFormField;
15+
use wcf\system\form\builder\field\UrlFormField;
16+
use wcf\system\form\builder\field\validation\FormFieldValidationError;
17+
use wcf\system\form\builder\field\validation\FormFieldValidator;
18+
use wcf\system\form\builder\IFormDocument;
1419

1520
/**
1621
* Shows the server add form.
1722
*
18-
* @author Marcel Werk
19-
* @copyright 2001-2019 WoltLab GmbH
20-
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
23+
* @author Marcel Werk
24+
* @copyright 2001-2025 WoltLab GmbH
25+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
26+
*
27+
* @extends AbstractFormBuilderForm<PackageUpdateServer>
2128
*/
22-
class PackageUpdateServerAddForm extends AbstractForm
29+
class PackageUpdateServerAddForm extends AbstractFormBuilderForm
2330
{
2431
/**
2532
* @inheritDoc
@@ -31,158 +38,151 @@ class PackageUpdateServerAddForm extends AbstractForm
3138
*/
3239
public $neededPermissions = ['admin.configuration.package.canEditServer'];
3340

34-
/**
35-
* server url
36-
* @var string
37-
*/
38-
public $serverURL = '';
39-
40-
/**
41-
* server login username
42-
* @var string
43-
*/
44-
public $loginUsername = '';
45-
46-
/**
47-
* server login password
48-
* @var string
49-
*/
50-
public $loginPassword = '';
51-
5241
/**
5342
* @inheritDoc
5443
*/
55-
public function readFormParameters()
56-
{
57-
parent::readFormParameters();
58-
59-
if (isset($_POST['serverURL'])) {
60-
$this->serverURL = StringUtil::trim($_POST['serverURL']);
61-
}
62-
if (isset($_POST['loginUsername'])) {
63-
$this->loginUsername = $_POST['loginUsername'];
64-
}
65-
if (isset($_POST['loginPassword'])) {
66-
$this->loginPassword = $_POST['loginPassword'];
67-
}
68-
}
44+
public $objectActionClass = PackageUpdateServerAction::class;
6945

7046
/**
7147
* @inheritDoc
7248
*/
73-
public function validate()
74-
{
75-
parent::validate();
49+
public $objectEditLinkController = PackageUpdateServerEditForm::class;
7650

77-
$this->validateServerURL();
51+
#[\Override]
52+
protected function createForm()
53+
{
54+
parent::createForm();
55+
56+
$this->form->appendChildren([
57+
FormContainer::create('data')
58+
->appendChildren([
59+
UrlFormField::create('serverURL')
60+
->label('wcf.acp.updateServer.serverURL')
61+
->required()
62+
->autoFocus()
63+
->addValidator(
64+
new FormFieldValidator('serverUrlValidator', function (UrlFormField $formField) {
65+
try {
66+
$url = new Uri($formField->getValue());
67+
68+
if (!$url->getHost()) {
69+
$formField->addValidationError(
70+
new FormFieldValidationError(
71+
'invalid',
72+
'wcf.acp.updateServer.serverURL.error.invalid'
73+
)
74+
);
75+
return;
76+
}
77+
if ($url->getHost() !== 'localhost') {
78+
if ($url->getScheme() !== 'https') {
79+
$formField->addValidationError(
80+
new FormFieldValidationError(
81+
'invalidScheme',
82+
'wcf.acp.updateServer.serverURL.error.invalidScheme'
83+
)
84+
);
85+
return;
86+
}
87+
if ($url->getPort()) {
88+
$formField->addValidationError(
89+
new FormFieldValidationError(
90+
'nonStandardPort',
91+
'wcf.acp.updateServer.serverURL.error.nonStandardPort'
92+
)
93+
);
94+
return;
95+
}
96+
}
97+
if ($url->getUserInfo()) {
98+
$formField->addValidationError(
99+
new FormFieldValidationError(
100+
'userinfo',
101+
'wcf.acp.updateServer.serverURL.error.userinfo'
102+
)
103+
);
104+
return;
105+
}
106+
if (\str_ends_with(\strtolower($url->getHost()), '.woltlab.com')) {
107+
$formField->addValidationError(
108+
new FormFieldValidationError(
109+
'woltlab',
110+
'wcf.acp.updateServer.serverURL.error.woltlab'
111+
)
112+
);
113+
return;
114+
}
115+
} catch (\InvalidArgumentException) {
116+
$formField->addValidationError(
117+
new FormFieldValidationError(
118+
'invalid',
119+
'wcf.acp.updateServer.serverURL.error.invalid'
120+
)
121+
);
122+
return;
123+
}
124+
125+
if (($duplicate = $this->findDuplicateServer((string)$url))) {
126+
$formField->addValidationError(
127+
new FormFieldValidationError(
128+
'duplicate',
129+
'wcf.acp.updateServer.serverURL.error.duplicate',
130+
['duplicate' => $duplicate]
131+
)
132+
);
133+
return;
134+
}
135+
})
136+
),
137+
TextFormField::create('loginUsername')
138+
->label('wcf.acp.updateServer.loginUsername')
139+
->description('wcf.acp.updateServer.loginUsername.description')
140+
->addFieldClass('medium'),
141+
PasswordFormField::create('loginPassword')
142+
->label('wcf.acp.updateServer.loginPassword')
143+
->description('wcf.acp.updateServer.loginPassword.description')
144+
->addFieldClass('medium')
145+
->passwordStrengthMeter(false)
146+
->autocomplete('off'),
147+
BooleanFormField::create('isDisabled')
148+
->label('wcf.acp.updateServer.isDisabled'),
149+
]),
150+
]);
78151
}
79152

80-
/**
81-
* Validates the server URL.
82-
*
83-
* @return void
84-
* @since 5.3
85-
*/
86-
protected function validateServerURL()
153+
#[\Override]
154+
public function finalizeForm()
87155
{
88-
if (empty($this->serverURL)) {
89-
throw new UserInputException('serverURL');
90-
}
156+
parent::finalizeForm();
91157

92-
try {
93-
$url = new Uri($this->serverURL);
94-
$this->serverURL = (string)$url;
158+
$this->form->getDataHandler()->addProcessor(
159+
new CustomFormDataProcessor(
160+
'saveServerProcessor',
161+
function (IFormDocument $document, array $parameters) {
162+
// This ensures that the URL is well-formed.
163+
$uri = new Uri($parameters['data']['serverURL']);
164+
$parameters['data']['serverURL'] = (string)$uri;
95165

96-
if (!$url->getHost()) {
97-
throw new UserInputException('serverURL', 'invalid');
98-
}
99-
if ($url->getHost() !== 'localhost') {
100-
if ($url->getScheme() !== 'https') {
101-
throw new UserInputException('serverURL', 'invalidScheme');
102-
}
103-
if ($url->getPort()) {
104-
throw new UserInputException('serverURL', 'nonStandardPort');
166+
return $parameters;
105167
}
106-
}
107-
if ($url->getUserInfo()) {
108-
throw new UserInputException('serverURL', 'userinfo');
109-
}
110-
if (\str_ends_with(\strtolower($url->getHost()), '.woltlab.com')) {
111-
throw new UserInputException('serverURL', 'woltlab');
112-
}
113-
} catch (\InvalidArgumentException) {
114-
throw new UserInputException('serverURL', 'invalid');
115-
}
116-
117-
if (($duplicate = $this->findDuplicateServer())) {
118-
throw new UserInputException('serverURL', [
119-
'duplicate' => $duplicate,
120-
]);
121-
}
168+
)
169+
);
122170
}
123171

124172
/**
125173
* Returns the first package update server with a matching serverURL.
126-
*
127-
* @return ?PackageUpdateServer
128-
* @since 5.3
174+
* @since 5.3
129175
*/
130-
protected function findDuplicateServer()
176+
protected function findDuplicateServer(string $serverURL): ?PackageUpdateServer
131177
{
132178
$packageServerList = new PackageUpdateServerList();
133179
$packageServerList->readObjects();
134180
foreach ($packageServerList as $packageServer) {
135-
if ($packageServer->serverURL == $this->serverURL) {
181+
if ($packageServer->serverURL == $serverURL) {
136182
return $packageServer;
137183
}
138184
}
139185

140186
return null;
141187
}
142-
143-
/**
144-
* @inheritDoc
145-
*/
146-
public function save()
147-
{
148-
parent::save();
149-
150-
// save server
151-
$this->objectAction = new PackageUpdateServerAction([], 'create', [
152-
'data' => \array_merge($this->additionalFields, [
153-
'serverURL' => $this->serverURL,
154-
'loginUsername' => $this->loginUsername,
155-
'loginPassword' => $this->loginPassword,
156-
]),
157-
]);
158-
$returnValues = $this->objectAction->executeAction();
159-
$this->saved();
160-
161-
// reset values
162-
$this->serverURL = $this->loginUsername = $this->loginPassword = '';
163-
164-
// show success message
165-
WCF::getTPL()->assign([
166-
'success' => true,
167-
'objectEditLink' => LinkHandler::getInstance()->getControllerLink(
168-
PackageUpdateServerEditForm::class,
169-
['id' => $returnValues['returnValues']->packageUpdateServerID]
170-
),
171-
]);
172-
}
173-
174-
/**
175-
* @inheritDoc
176-
*/
177-
public function assignVariables()
178-
{
179-
parent::assignVariables();
180-
181-
WCF::getTPL()->assign([
182-
'serverURL' => $this->serverURL,
183-
'loginUsername' => $this->loginUsername,
184-
'loginPassword' => $this->loginPassword,
185-
'action' => 'add',
186-
]);
187-
}
188188
}

0 commit comments

Comments
 (0)