Skip to content

Commit 8690254

Browse files
committed
Fix issues with filtering form options
1 parent 3cb1115 commit 8690254

11 files changed

+241
-17
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,15 @@ function (IFormDocument $document, array $parameters) {
3636
$configuration = [];
3737

3838
foreach ($this->getConfigurationFormFieldIds() as $parameter) {
39-
if (isset($parameters['data'][$parameter])) {
39+
if (!empty($parameters['data'][$parameter])) {
4040
$configuration[$parameter] = $parameters['data'][$parameter];
41+
}
42+
if (\array_key_exists($parameter, $parameters['data'])) {
4143
unset($parameters['data'][$parameter]);
4244
}
4345
}
4446

45-
if ($configuration !== []) {
46-
$parameters['data']['configuration'] = JSON::encode($configuration);
47-
}
47+
$parameters['data']['configuration'] = JSON::encode($configuration);
4848

4949
return $parameters;
5050
},

wcfsetup/install/files/lib/action/ListViewFilterAction.class.php

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,10 @@
88
use Psr\Http\Server\RequestHandlerInterface;
99
use wcf\data\DatabaseObject;
1010
use wcf\data\DatabaseObjectList;
11-
use wcf\data\IStorableObject;
1211
use wcf\http\Helper;
1312
use wcf\system\exception\IllegalLinkException;
1413
use wcf\system\exception\PermissionDeniedException;
1514
use wcf\system\exception\UserInputException;
16-
use wcf\system\form\builder\data\processor\CustomFormDataProcessor;
17-
use wcf\system\form\builder\IFormDocument;
1815
use wcf\system\form\builder\Psr15DialogForm;
1916
use wcf\system\listView\AbstractListView;
2017
use wcf\system\WCF;
@@ -77,7 +74,7 @@ public function handle(ServerRequestInterface $request): ResponseInterface
7774
}
7875

7976
foreach ($data as $key => $value) {
80-
if ($value === '' || $value === null) {
77+
if ($value === '' || $value === null || $value === 0) {
8178
unset($data[$key]);
8279
}
8380
}

wcfsetup/install/files/lib/system/form/option/AbstractFormOption.class.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace wcf\system\form\option;
44

55
use wcf\data\DatabaseObjectList;
6+
use wcf\system\database\table\column\AbstractDatabaseTableColumn;
7+
use wcf\system\database\table\column\MediumtextDatabaseTableColumn;
68
use wcf\system\form\builder\field\AbstractFormField;
79
use wcf\system\form\option\formatter\DefaultFormatter;
810
use wcf\system\form\option\formatter\DefaultPlainTextFormatter;
@@ -54,4 +56,20 @@ public function applyFilter(DatabaseObjectList $list, string $columnName, mixed
5456
{
5557
$list->getConditionBuilder()->add("{$columnName} = ?", [$value]);
5658
}
59+
60+
#[\Override]
61+
public function renderFilterValue(string $value, array $configuration = []): string
62+
{
63+
return $this->getPlainTextFormatter()->format(
64+
$value,
65+
WCF::getLanguage()->languageID,
66+
$configuration
67+
);
68+
}
69+
70+
#[\Override]
71+
public function getDatabaseTableColumn(string $name): AbstractDatabaseTableColumn
72+
{
73+
return MediumtextDatabaseTableColumn::create($name);
74+
}
5775
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php
2+
3+
namespace wcf\system\form\option;
4+
5+
use wcf\data\DatabaseObjectList;
6+
use wcf\system\form\builder\field\AbstractFormField;
7+
use wcf\system\form\builder\field\NumericRangeFormField;
8+
9+
/**
10+
* Implementation of a form field for currency values.
11+
*
12+
* @author Marcel Werk
13+
* @copyright 2001-2025 WoltLab GmbH
14+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
15+
* @since 6.2
16+
*/
17+
abstract class AbstractNumericFormOption extends AbstractFormOption
18+
{
19+
#[\Override]
20+
public function getFilterFormField(string $id, array $configuration = []): AbstractFormField
21+
{
22+
return NumericRangeFormField::create($id)
23+
->nullable();
24+
}
25+
26+
#[\Override]
27+
public function applyFilter(DatabaseObjectList $list, string $columnName, mixed $value): void
28+
{
29+
$values = $this->parseFilterValue($value);
30+
31+
if (!$values['from'] && !$values['to']) {
32+
return;
33+
}
34+
35+
if (!$values['to']) {
36+
$list->getConditionBuilder()->add("{$columnName} >= ?", [$values['from']]);
37+
} else {
38+
$list->getConditionBuilder()->add("{$columnName} BETWEEN ? AND ?", [$values['from'], $values['to']]);
39+
}
40+
}
41+
42+
#[\Override]
43+
public function renderFilterValue(string $value, array $configuration = []): string
44+
{
45+
$values = $this->parseFilterValue($value);
46+
47+
if ($values['from'] && $values['to']) {
48+
return $values['from'] . '' . $values['to'];
49+
} else if ($values['from']) {
50+
return '>= ' . $values['from'];
51+
} else if ($values['to']) {
52+
return '<= ' . $values['to'];
53+
}
54+
55+
return '';
56+
}
57+
58+
/**
59+
* @return array{from: int, to: int}
60+
*/
61+
protected function parseFilterValue(string $value): array
62+
{
63+
$from = 0;
64+
$to = 0;
65+
66+
$values = explode(';', $value);
67+
if (\count($values) === 2) {
68+
$from = $values[0];
69+
$to = $values[1];
70+
}
71+
72+
return [
73+
'from' => $from,
74+
'to' => $to,
75+
];
76+
}
77+
}

wcfsetup/install/files/lib/system/form/option/BooleanFormOption.class.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace wcf\system\form\option;
44

5+
use wcf\system\database\table\column\AbstractDatabaseTableColumn;
6+
use wcf\system\database\table\column\TinyintDatabaseTableColumn;
57
use wcf\system\form\builder\field\AbstractFormField;
68
use wcf\system\form\builder\field\BooleanFormField;
79
use wcf\system\form\option\formatter\BooleanFormatter;
@@ -40,4 +42,10 @@ public function getPlainTextFormatter(): IFormOptionFormatter
4042
{
4143
return $this->getFormatter();
4244
}
45+
46+
#[\Override]
47+
public function getDatabaseTableColumn(string $name): AbstractDatabaseTableColumn
48+
{
49+
return TinyintDatabaseTableColumn::create($name);
50+
}
4351
}

wcfsetup/install/files/lib/system/form/option/CurrencyFormOption.class.php

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
namespace wcf\system\form\option;
44

5+
use wcf\data\DatabaseObjectList;
6+
use wcf\system\database\table\column\AbstractDatabaseTableColumn;
7+
use wcf\system\database\table\column\IntDatabaseTableColumn;
58
use wcf\system\form\builder\field\AbstractFormField;
69
use wcf\system\form\builder\field\CurrencyFormField;
710
use wcf\system\form\option\formatter\CurrencyFormatter;
@@ -15,7 +18,7 @@
1518
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
1619
* @since 6.2
1720
*/
18-
class CurrencyFormOption extends AbstractFormOption
21+
class CurrencyFormOption extends AbstractNumericFormOption
1922
{
2023
#[\Override]
2124
public function getId(): string
@@ -57,4 +60,26 @@ public function getPlainTextFormatter(): IFormOptionFormatter
5760
{
5861
return $this->getFormatter();
5962
}
63+
64+
#[\Override]
65+
public function applyFilter(DatabaseObjectList $list, string $columnName, mixed $value): void
66+
{
67+
$values = $this->parseFilterValue($value);
68+
69+
if (!$values['from'] && !$values['to']) {
70+
return;
71+
}
72+
73+
if (!$values['to']) {
74+
$list->getConditionBuilder()->add("{$columnName} >= ?", [$values['from'] * 100]);
75+
} else {
76+
$list->getConditionBuilder()->add("{$columnName} BETWEEN ? AND ?", [$values['from'] * 100, $values['to'] * 100]);
77+
}
78+
}
79+
80+
#[\Override]
81+
public function getDatabaseTableColumn(string $name): AbstractDatabaseTableColumn
82+
{
83+
return IntDatabaseTableColumn::create($name);
84+
}
6085
}

wcfsetup/install/files/lib/system/form/option/DateFormOption.class.php

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@
22

33
namespace wcf\system\form\option;
44

5+
use wcf\data\DatabaseObjectList;
6+
use wcf\system\database\table\column\AbstractDatabaseTableColumn;
7+
use wcf\system\database\table\column\DateDatabaseTableColumn;
58
use wcf\system\form\builder\field\AbstractFormField;
69
use wcf\system\form\builder\field\DateFormField;
10+
use wcf\system\form\builder\field\DateRangeFormField;
711
use wcf\system\form\option\formatter\DateFormatter;
812
use wcf\system\form\option\formatter\IFormOptionFormatter;
913

@@ -27,11 +31,19 @@ public function getId(): string
2731
public function getFormField(string $id, array $configuration = []): AbstractFormField
2832
{
2933
$formField = DateFormField::create($id)
30-
->saveValueFormat('Y-m-d');
34+
->saveValueFormat('Y-m-d')
35+
->nullable();
3136

3237
return $formField;
3338
}
3439

40+
#[\Override]
41+
public function getFilterFormField(string $id, array $configuration = []): AbstractFormField
42+
{
43+
return DateRangeFormField::create($id)
44+
->nullable();
45+
}
46+
3547
#[\Override]
3648
public function getFormatter(): IFormOptionFormatter
3749
{
@@ -43,4 +55,62 @@ public function getPlainTextFormatter(): IFormOptionFormatter
4355
{
4456
return $this->getFormatter();
4557
}
58+
59+
#[\Override]
60+
public function applyFilter(DatabaseObjectList $list, string $columnName, mixed $value): void
61+
{
62+
$values = $this->parseFilterValue($value);
63+
64+
if (!$values['from'] && !$values['to']) {
65+
return;
66+
}
67+
68+
if (!$values['to']) {
69+
$list->getConditionBuilder()->add("{$columnName} >= ?", [$values['from']]);
70+
} else {
71+
$list->getConditionBuilder()->add("{$columnName} BETWEEN ? AND ?", [$values['from'], $values['to']]);
72+
}
73+
}
74+
75+
#[\Override]
76+
public function renderFilterValue(string $value, array $configuration = []): string
77+
{
78+
$values = $this->parseFilterValue($value);
79+
80+
if ($values['from'] && $values['to']) {
81+
return $values['from'] . '' . $values['to'];
82+
} else if ($values['from']) {
83+
return '>= ' . $values['from'];
84+
} else if ($values['to']) {
85+
return '<= ' . $values['to'];
86+
}
87+
88+
return '';
89+
}
90+
91+
/**
92+
* @return array{from: int, to: int}
93+
*/
94+
protected function parseFilterValue(string $value): array
95+
{
96+
$from = 0;
97+
$to = 0;
98+
99+
$values = explode(';', $value);
100+
if (\count($values) === 2) {
101+
$from = $values[0];
102+
$to = $values[1];
103+
}
104+
105+
return [
106+
'from' => $from,
107+
'to' => $to,
108+
];
109+
}
110+
111+
#[\Override]
112+
public function getDatabaseTableColumn(string $name): AbstractDatabaseTableColumn
113+
{
114+
return DateDatabaseTableColumn::create($name);
115+
}
46116
}

wcfsetup/install/files/lib/system/form/option/FloatFormOption.class.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace wcf\system\form\option;
44

5+
use wcf\system\database\table\column\AbstractDatabaseTableColumn;
6+
use wcf\system\database\table\column\FloatDatabaseTableColumn;
57
use wcf\system\form\builder\field\AbstractFormField;
68
use wcf\system\form\builder\field\FloatFormField;
79
use wcf\system\form\option\formatter\FloatFormatter;
@@ -15,7 +17,7 @@
1517
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
1618
* @since 6.2
1719
*/
18-
class FloatFormOption extends AbstractFormOption
20+
class FloatFormOption extends AbstractNumericFormOption
1921
{
2022
#[\Override]
2123
public function getId(): string
@@ -54,4 +56,10 @@ public function getPlainTextFormatter(): IFormOptionFormatter
5456
{
5557
return $this->getFormatter();
5658
}
59+
60+
#[\Override]
61+
public function getDatabaseTableColumn(string $name): AbstractDatabaseTableColumn
62+
{
63+
return FloatDatabaseTableColumn::create($name);
64+
}
5765
}

wcfsetup/install/files/lib/system/form/option/IFormOption.class.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace wcf\system\form\option;
44

55
use wcf\data\DatabaseObjectList;
6+
use wcf\system\database\table\column\AbstractDatabaseTableColumn;
67
use wcf\system\form\builder\field\AbstractFormField;
78
use wcf\system\form\option\formatter\IFormOptionFormatter;
89

@@ -40,4 +41,11 @@ public function getFormatter(): IFormOptionFormatter;
4041
public function getPlainTextFormatter(): IFormOptionFormatter;
4142

4243
public function applyFilter(DatabaseObjectList $list, string $columnName, mixed $value): void;
44+
45+
/**
46+
* @param array<string, mixed> $configuration
47+
*/
48+
public function renderFilterValue(string $value, array $configuration = []): string;
49+
50+
public function getDatabaseTableColumn(string $name): AbstractDatabaseTableColumn;
4351
}

0 commit comments

Comments
 (0)