Skip to content

Commit b230517

Browse files
committed
Add methods for list view filtering
1 parent 5789cb4 commit b230517

File tree

10 files changed

+171
-17
lines changed

10 files changed

+171
-17
lines changed

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

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -110,28 +110,12 @@ protected function getSharedConfigurationFormFields(): array
110110
return $formFields;
111111
}
112112

113-
/**
114-
* @return array<string, string>
115-
*/
116-
protected function getAvailableOptionTypes(): array
117-
{
118-
$optionTypes = \array_map(fn($option) => $option->getTitle(), FormOptionHandler::getInstance()->getOptions());
119-
120-
$collator = new \Collator(WCF::getLanguage()->getLocale());
121-
\uasort(
122-
$optionTypes,
123-
static fn(string $a, string $b) => $collator->compare($a, $b)
124-
);
125-
126-
return $optionTypes;
127-
}
128-
129113
protected function getOptionTypeFormField(): SelectFormField
130114
{
131115
return SelectFormField::create('optionType')
132116
->label('wcf.form.option.optionType')
133117
->immutable($this->formAction != 'create')
134-
->options($this->getAvailableOptionTypes())
118+
->options(FormOptionHandler::getInstance()->getSortedOptionTypes())
135119
->required();
136120
}
137121
}

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

Lines changed: 14 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\data\DatabaseObjectList;
6+
use wcf\system\form\builder\field\AbstractFormField;
57
use wcf\system\form\option\formatter\DefaultFormatter;
68
use wcf\system\form\option\formatter\DefaultPlainTextFormatter;
79
use wcf\system\form\option\formatter\IFormOptionFormatter;
@@ -40,4 +42,16 @@ public function getPlainTextFormatter(): IFormOptionFormatter
4042
{
4143
return new DefaultPlainTextFormatter();
4244
}
45+
46+
#[\Override]
47+
public function getFilterFormField(string $id, array $configurationData = []): AbstractFormField
48+
{
49+
return $this->getFormField($id, $configurationData);
50+
}
51+
52+
#[\Override]
53+
public function applyFilter(DatabaseObjectList $list, string $columnName, mixed $value): void
54+
{
55+
$list->getConditionBuilder()->add("{$columnName} = ?", [$value]);
56+
}
4357
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22

33
namespace wcf\system\form\option;
44

5+
use wcf\data\DatabaseObjectList;
56
use wcf\system\form\builder\field\AbstractFormField;
67
use wcf\system\form\builder\field\EmailFormField;
8+
use wcf\system\form\builder\field\TextFormField;
79
use wcf\system\form\option\formatter\EmailFormatter;
10+
use wcf\system\WCF;
811

912
/**
1013
* Implementation of a form field for email addresses.
@@ -39,4 +42,16 @@ public function getPlainTextFormatter(): EmailFormatter
3942
{
4043
return $this->getFormatter();
4144
}
45+
46+
#[\Override]
47+
public function getFilterFormField(string $id, array $configurationData = []): AbstractFormField
48+
{
49+
return TextFormField::create($id);
50+
}
51+
52+
#[\Override]
53+
public function applyFilter(DatabaseObjectList $list, string $columnName, mixed $value): void
54+
{
55+
$list->getConditionBuilder()->add("{$columnName} LIKE ?", ['%' . WCF::getDB()->escapeLikeValue($value) . '%']);
56+
}
4257
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use wcf\event\form\option\FormOptionCollecting;
66
use wcf\system\event\EventHandler;
77
use wcf\system\SingletonFactory;
8+
use wcf\system\WCF;
89

910
/**
1011
* Provides the available form options.
@@ -82,4 +83,20 @@ public function getOption(string $identifier): ?IFormOption
8283
{
8384
return $this->options[$identifier] ?? null;
8485
}
86+
87+
/**
88+
* @return array<string, string>
89+
*/
90+
public function getSortedOptionTypes(): array
91+
{
92+
$optionTypes = \array_map(fn($option) => $option->getTitle(), $this->getOptions());
93+
94+
$collator = new \Collator(WCF::getLanguage()->getLocale());
95+
\uasort(
96+
$optionTypes,
97+
static fn(string $a, string $b) => $collator->compare($a, $b)
98+
);
99+
100+
return $optionTypes;
101+
}
85102
}

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

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

33
namespace wcf\system\form\option;
44

5+
use wcf\data\DatabaseObjectList;
56
use wcf\system\form\builder\field\AbstractFormField;
67
use wcf\system\form\option\formatter\IFormOptionFormatter;
78

@@ -24,6 +25,11 @@ public function getTitle(): string;
2425
*/
2526
public function getFormField(string $id, array $configurationData = []): AbstractFormField;
2627

28+
/**
29+
* @param array<string, mixed> $configurationData
30+
*/
31+
public function getFilterFormField(string $id, array $configurationData = []): AbstractFormField;
32+
2733
/**
2834
* @return string[]
2935
*/
@@ -32,4 +38,6 @@ public function getConfigurationFormFields(): array;
3238
public function getFormatter(): IFormOptionFormatter;
3339

3440
public function getPlainTextFormatter(): IFormOptionFormatter;
41+
42+
public function applyFilter(DatabaseObjectList $list, string $columnName, mixed $value): void;
3543
}

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

Lines changed: 16 additions & 0 deletions
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\form\builder\field\AbstractFormField;
57
use wcf\system\form\builder\field\SourceCodeFormField;
8+
use wcf\system\form\builder\field\TextFormField;
69
use wcf\system\form\option\formatter\SourceCodeFormatter;
10+
use wcf\system\WCF;
711

812
/**
913
* Implementation of a form field for source code values.
@@ -32,4 +36,16 @@ public function getFormatter(): SourceCodeFormatter
3236
{
3337
return new SourceCodeFormatter();
3438
}
39+
40+
#[\Override]
41+
public function getFilterFormField(string $id, array $configurationData = []): AbstractFormField
42+
{
43+
return TextFormField::create($id);
44+
}
45+
46+
#[\Override]
47+
public function applyFilter(DatabaseObjectList $list, string $columnName, mixed $value): void
48+
{
49+
$list->getConditionBuilder()->add("{$columnName} LIKE ?", ['%' . WCF::getDB()->escapeLikeValue($value) . '%']);
50+
}
3551
}

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

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

33
namespace wcf\system\form\option;
44

5+
use wcf\data\DatabaseObjectList;
56
use wcf\system\form\builder\field\AbstractFormField;
67
use wcf\system\form\builder\field\TextFormField;
8+
use wcf\system\WCF;
79

810
/**
911
* Implementation of a form field for single-line text values.
@@ -21,6 +23,12 @@ public function getId(): string
2123
return 'text';
2224
}
2325

26+
#[\Override]
27+
public function getFilterFormField(string $id, array $configurationData = []): AbstractFormField
28+
{
29+
return TextFormField::create($id);
30+
}
31+
2432
#[\Override]
2533
public function getFormField(string $id, array $configurationData = []): AbstractFormField
2634
{
@@ -40,4 +48,10 @@ public function getConfigurationFormFields(): array
4048
{
4149
return ['maxLength', 'defaultTextValue', 'required'];
4250
}
51+
52+
#[\Override]
53+
public function applyFilter(DatabaseObjectList $list, string $columnName, mixed $value): void
54+
{
55+
$list->getConditionBuilder()->add("{$columnName} LIKE ?", ['%' . WCF::getDB()->escapeLikeValue($value) . '%']);
56+
}
4357
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22

33
namespace wcf\system\form\option;
44

5+
use wcf\data\DatabaseObjectList;
56
use wcf\system\form\builder\field\AbstractFormField;
67
use wcf\system\form\builder\field\MultilineTextFormField;
8+
use wcf\system\form\builder\field\TextFormField;
79
use wcf\system\form\option\formatter\MultilineTextFormatter;
10+
use wcf\system\WCF;
811

912
/**
1013
* Implementation of a form field for multi-line text values.
@@ -44,4 +47,16 @@ public function getFormatter(): MultilineTextFormatter
4447
{
4548
return new MultilineTextFormatter();
4649
}
50+
51+
#[\Override]
52+
public function getFilterFormField(string $id, array $configurationData = []): AbstractFormField
53+
{
54+
return TextFormField::create($id);
55+
}
56+
57+
#[\Override]
58+
public function applyFilter(DatabaseObjectList $list, string $columnName, mixed $value): void
59+
{
60+
$list->getConditionBuilder()->add("{$columnName} LIKE ?", ['%' . WCF::getDB()->escapeLikeValue($value) . '%']);
61+
}
4762
}

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

Lines changed: 16 additions & 0 deletions
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\form\builder\field\AbstractFormField;
7+
use wcf\system\form\builder\field\TextFormField;
58
use wcf\system\form\builder\field\UrlFormField;
69
use wcf\system\form\option\formatter\UrlFormatter;
10+
use wcf\system\WCF;
711

812
/**
913
* Implementation of a form field for URLs.
@@ -32,4 +36,16 @@ public function getFormatter(): UrlFormatter
3236
{
3337
return new UrlFormatter();
3438
}
39+
40+
#[\Override]
41+
public function getFilterFormField(string $id, array $configurationData = []): AbstractFormField
42+
{
43+
return TextFormField::create($id);
44+
}
45+
46+
#[\Override]
47+
public function applyFilter(DatabaseObjectList $list, string $columnName, mixed $value): void
48+
{
49+
$list->getConditionBuilder()->add("{$columnName} LIKE ?", ['%' . WCF::getDB()->escapeLikeValue($value) . '%']);
50+
}
3551
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
namespace wcf\system\listView\filter;
4+
5+
use wcf\data\DatabaseObjectList;
6+
use wcf\system\form\builder\field\AbstractFormField;
7+
use wcf\system\form\option\IFormOption;
8+
use wcf\system\listView\filter\AbstractFilter;
9+
use wcf\system\WCF;
10+
11+
/**
12+
* Filter for columns that contain form option values.
13+
*
14+
* @author Marcel Werk
15+
* @copyright 2001-2025 WoltLab GmbH
16+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
17+
* @since 6.2
18+
*/
19+
final class FormOptionFilter extends AbstractFilter
20+
{
21+
/**
22+
* @param array<string, mixed $configurationData
23+
*/
24+
public function __construct(
25+
private readonly IFormOption $option,
26+
private readonly array $configurationData,
27+
string $id,
28+
string $languageItem,
29+
string $databaseColumn = ''
30+
) {
31+
parent::__construct($id, $languageItem, $databaseColumn);
32+
}
33+
34+
#[\Override]
35+
public function getFormField(): AbstractFormField
36+
{
37+
return $this->option->getFilterFormField($this->id, $this->configurationData)->label($this->languageItem);
38+
}
39+
40+
#[\Override]
41+
public function applyFilter(DatabaseObjectList $list, string $value): void
42+
{
43+
$this->option->applyFilter($list, $this->getDatabaseColumnName($list), $value);
44+
}
45+
46+
#[\Override]
47+
public function renderValue(string $value): string
48+
{
49+
return $this->option->getPlainTextFormatter()->format(
50+
$value,
51+
WCF::getLanguage()->languageID,
52+
$this->configurationData
53+
);
54+
}
55+
}

0 commit comments

Comments
 (0)