Skip to content

Commit 504bef6

Browse files
authored
Merge pull request #861 from getformwork/refactor/optional-password-updates
Refactor form initialization to enable optional password updates
2 parents aaa746d + d3087db commit 504bef6

7 files changed

Lines changed: 27 additions & 35 deletions

File tree

formwork/fields/password.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,29 @@
11
<?php
22

33
use Formwork\Cms\App;
4+
use Formwork\Fields\Field;
5+
use Formwork\Utils\Constraint;
46

57
return function (App $app) {
68
return [
79
'extend' => 'text',
10+
11+
'methods' => [
12+
/**
13+
* Return whether to ignore empty values when setting the field value
14+
*
15+
* This is useful for password fields, where you don't want to overwrite the existing password with an empty value if the user doesn't enter a new password.
16+
*/
17+
'ignoreEmpty' => function (Field $field): bool {
18+
return $field->is('ignoreEmpty', false);
19+
},
20+
21+
'setValue' => function (Field $field, $value) {
22+
if ($field->ignoreEmpty() && Constraint::isEmpty($value)) {
23+
return $field->value();
24+
}
25+
return $value;
26+
},
27+
],
828
];
929
};

formwork/src/Panel/Controllers/FilesController.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
use Formwork\Files\FileFactory;
1010
use Formwork\Forms\FormData;
1111
use Formwork\Http\JsonResponse;
12-
use Formwork\Http\RequestMethod;
1312
use Formwork\Http\Response;
1413
use Formwork\Http\ResponseStatus;
1514
use Formwork\Images\Image;
@@ -145,11 +144,7 @@ public function edit(RouteParams $routeParams): Response
145144
return $this->redirectToReferer(base: $this->panel->panelRoot());
146145
}
147146

148-
// Set initial values on GET
149-
if ($this->request->method() === RequestMethod::GET) {
150-
$file->fields()->setValues($file->data())
151-
->isValid(); // Pre-validate to populate validation state
152-
}
147+
$file->fields()->setValues($file->data());
153148

154149
$form = $this->form('file-metadata', $file->fields())
155150
->processRequest($this->request, uploadFiles: false);

formwork/src/Panel/Controllers/OptionsController.php

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace Formwork\Panel\Controllers;
44

55
use Formwork\Config\Config;
6-
use Formwork\Http\RequestMethod;
76
use Formwork\Http\Response;
87
use Formwork\Parsers\Yaml;
98
use Formwork\Schemes\Schemes;
@@ -44,11 +43,7 @@ public function systemOptions(Schemes $schemes): Response
4443
$scheme = $schemes->get('config.system');
4544
$fields = $scheme->fields();
4645

47-
// Set initial values on GET
48-
if ($this->request->method() === RequestMethod::GET) {
49-
$fields->setValues($this->config->get('system'))
50-
->isValid(); // Pre-validate to populate validation state
51-
}
46+
$fields->setValues($this->config->get('system'));
5247

5348
$form = $this->form('system-options', $fields)
5449
->processRequest($this->request);
@@ -97,11 +92,7 @@ public function siteOptions(Schemes $schemes): Response
9792
$scheme = $schemes->get('config.site');
9893
$fields = $scheme->fields();
9994

100-
// Set initial values on GET
101-
if ($this->request->method() === RequestMethod::GET) {
102-
$fields->setValues($this->site->data())
103-
->isValid(); // Pre-validate to populate validation state
104-
}
95+
$fields->setValues($this->site->data());
10596

10697
$form = $this->form('site-options', $fields)
10798
->processRequest($this->request);

formwork/src/Panel/Controllers/PagesController.php

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
use Formwork\Forms\FormData;
1010
use Formwork\Http\JsonResponse;
1111
use Formwork\Http\RequestData;
12-
use Formwork\Http\RequestMethod;
1312
use Formwork\Http\Response;
1413
use Formwork\Http\ResponseStatus;
1514
use Formwork\Pages\Page;
@@ -223,10 +222,7 @@ public function edit(RouteParams $routeParams): Response
223222
// Clone the page fields to work with a separate copy
224223
$fieldCollection = $page->fields()->deepClone();
225224

226-
if ($this->request->method() === RequestMethod::GET) {
227-
$fieldCollection->setValues($page->data())
228-
->isValid(); // Pre-validate to populate validation state
229-
}
225+
$fieldCollection->setValues($page->data());
230226

231227
$form = $this->form('page-editor', $fieldCollection)
232228
->setDefaultUploadsDestination($page->contentPath())

formwork/src/Panel/Controllers/PluginsController.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use Formwork\Fields\FieldCollection;
66
use Formwork\Http\JsonResponse;
7-
use Formwork\Http\RequestMethod;
87
use Formwork\Http\Response;
98
use Formwork\Http\ResponseStatus;
109
use Formwork\Parsers\Yaml;
@@ -72,11 +71,7 @@ public function plugin(RouteParams $routeParams, Plugins $plugins): Response
7271

7372
$fields = $scheme->fields();
7473

75-
// Set initial values on GET
76-
if ($this->request->method() === RequestMethod::GET) {
77-
$data = $this->config->get("plugins.{$name}", []);
78-
$fields->setValues($data);
79-
}
74+
$fields->setValues($this->config->get("plugins.{$name}", []));
8075

8176
$form = $this->form('plugin-options', $fields)
8277
->processRequest($this->request);

formwork/src/Panel/Controllers/UsersController.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
use Formwork\Fields\Field;
88
use Formwork\Forms\FormData;
99
use Formwork\Http\FileResponse;
10-
use Formwork\Http\RequestMethod;
1110
use Formwork\Http\Response;
1211
use Formwork\Images\Image;
1312
use Formwork\Router\RouteParams;
@@ -173,11 +172,7 @@ public function profile(RouteParams $routeParams): Response
173172
// Disable role field if it cannot be changed
174173
$fields->get('role')->set('disabled', !$this->panel->user()->canChangeRoleOf($user));
175174

176-
// Set initial values on GET
177-
if ($this->request->method() === RequestMethod::GET) {
178-
$fields->setValues($user)
179-
->isValid(); // Pre-validate to populate validation state
180-
}
175+
$fields->setValues($user);
181176

182177
$form = $this->form('user-profile', $fields)
183178
->processRequest($this->request, uploadFiles: false, preserveEmpty: false);

panel/views/fields/password.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
'maxlength' => $field->maxLength(),
1313
'pattern' => $field->pattern(),
1414
'autocomplete' => $field->autocomplete(),
15-
'required' => $field->isRequired(),
15+
'required' => $field->isRequired() && !$field->ignoreEmpty(),
1616
'disabled' => $field->isDisabled(),
1717
'hidden' => $field->isHidden(),
1818
]) ?>>

0 commit comments

Comments
 (0)