From 2a70b1e86ea674dbc2c700841fe4c6acbbe91682 Mon Sep 17 00:00:00 2001 From: Guy Sartorelli <36352093+GuySartorelli@users.noreply.github.com> Date: Tue, 18 Feb 2025 14:36:44 +1300 Subject: [PATCH] DOC Document new filter by range functionality (#687) --- .../00_Model/11_Scaffolding.md | 93 ++++++++++++++++-- en/08_Changelogs/6.0.0.md | 35 +++++++ .../changelogs/5.2.0/elemental-badge.png | Bin 19182 -> 0 bytes en/_images/withinrangefilter.png | Bin 0 -> 7794 bytes 4 files changed, 122 insertions(+), 6 deletions(-) delete mode 100644 en/_images/changelogs/5.2.0/elemental-badge.png create mode 100644 en/_images/withinrangefilter.png diff --git a/en/02_Developer_Guides/00_Model/11_Scaffolding.md b/en/02_Developer_Guides/00_Model/11_Scaffolding.md index 88c8a0225..6f16442e7 100644 --- a/en/02_Developer_Guides/00_Model/11_Scaffolding.md +++ b/en/02_Developer_Guides/00_Model/11_Scaffolding.md @@ -25,6 +25,7 @@ use SilverStripe\ORM\DataObject; class MyDataObject extends DataObject { + // ... private static $db = [ 'IsActive' => 'Boolean', 'Title' => 'Varchar', @@ -226,9 +227,10 @@ use SilverStripe\ORM\DataObject; class MyDataObject extends DataObject { + // ... private static $searchable_fields = [ - 'Name', - 'ProductCode', + 'Name', + 'ProductCode', ]; } ``` @@ -251,6 +253,7 @@ use SilverStripe\ORM\DataObject; class MyDataObject extends DataObject { + // ... private static $searchable_fields = [ 'Name', 'BirthDate' => [ @@ -283,6 +286,7 @@ use SilverStripe\ORM\DataObject; class MyDataObject extends DataObject { + // ... private static string $general_search_field_name = 'my_general_field_name'; } ``` @@ -317,6 +321,7 @@ use SilverStripe\ORM\Filters\EndsWithFilter; class MyDataObject extends DataObject { + // ... private static string $general_search_field_filter = EndsWithFilter::class; } ``` @@ -350,6 +355,7 @@ use SilverStripe\ORM\DataObject; class MyDataObject extends DataObject { + // ... private static bool $general_search_split_terms = false; } ``` @@ -368,6 +374,7 @@ use SilverStripe\ORM\DataObject; class MyDataObject extends DataObject { + // ... private static $searchable_fields = [ 'Name', 'JobTitle', @@ -388,6 +395,7 @@ use SilverStripe\ORM\DataObject; class MyDataObject extends DataObject { + // ... private static $searchable_fields = [ 'Price', 'Description', @@ -405,6 +413,7 @@ use SilverStripe\ORM\DataObject; class MyDataObject extends DataObject { + // ... private static $general_search_field = 'Title'; } ``` @@ -433,15 +442,18 @@ use SilverStripe\ORM\DataObject; class MyDataObject extends DataObject { + // ... private static $searchable_fields = [ 'Name' => 'PartialMatchFilter', - 'ProductCode' => NumericField::class, + 'ProductCode' => [ + 'field' => NumericField::class, + ], ]; } ``` -If you assign a single string value, you can set it to be either a [FormField](api:SilverStripe\Forms\FormField) or [SearchFilter](api:SilverStripe\ORM\Filters\SearchFilter). To specify -both or to combine this with other configuration, you can assign an array: +If you assign a single string value, you can set it to be a [`SearchFilter`](api:SilverStripe\ORM\Filters\SearchFilter) class. To specify a specific [`FormField`](api:SilverStripe\Forms\FormField) to use or +specify both a form field *and* a filter - or to combine this with other configuration - you can assign an array: ```php namespace App\Model; @@ -452,6 +464,7 @@ use SilverStripe\ORM\DataObject; class MyDataObject extends DataObject { + // ... private static $searchable_fields = [ 'Name' => [ 'field' => TextField::class, @@ -466,6 +479,62 @@ class MyDataObject extends DataObject } ``` +#### Using `WithinRangeFilter` {#searchable-fields-withinrangefilter} + +If you want users to be able to filter by a field using a range, specify the [`WithinRangeFilter`](api:SilverStripe\ORM\Filters\WithinRangeFilter). This works out of the box with the numeric, date, datetime, and time fields that come in Silverstripe framework. + +```php +namespace App\Model; + +use SilverStripe\ORM\DataObject; +SilverStripe\ORM\Filters\WithinRangeFilter + +class MyDataObject extends DataObject +{ + // ... + private static array $db = [ + 'Price' => 'Currency', + ]; + + private static array $searchable_fields = [ + 'Price' => [ + 'filter' => WithinRangeFilter::class, + ], + ]; +} +``` + +This configuration will duplicate the form field, providing one form field for the "from" value, and another for the "to" value. Users can then filter within a range using the filters in the CMS. + +![filter by price within a range](../../_images/withinrangefilter.png) + +If a user fills in only the "from" or "to" field, the other will be populated with the minimum or maximum value defined by the relevant `DBField` class in [`getMinValue()`](api:SilverStripe\ORM\FieldType\DBField::getMinValue()) or [`getMaxValue()`](api:SilverStripe\ORM\FieldType\DBField::getMaxValue()) + +This can also be used with other field types, but you need to define what the default "from" and "to" values should be. You can do this with the `rangeFromDefault` and `rangeToDefault` keys as shown below. + +```php +namespace App\Model; + +use SilverStripe\ORM\DataObject; +SilverStripe\ORM\Filters\WithinRangeFilter + +class MyDataObject extends DataObject +{ + // ... + private static array $db = [ + 'Title' => 'Varchar', + ]; + + private static array $searchable_fields = [ + 'Title' => [ + 'filter' => WithinRangeFilter::class, + 'rangeFromDefault' => 'a', + 'rangeToDefault' => 'z', + ], + ]; +} +``` + ### Searching on relations To include relations (`$has_one`, `$has_many` and `$many_many`) in your search, you can use a dot-notation. @@ -477,6 +546,7 @@ use SilverStripe\ORM\DataObject; class Team extends DataObject { + // ... private static $db = [ 'Title' => 'Varchar', ]; @@ -499,6 +569,7 @@ use SilverStripe\ORM\DataObject; class Player extends DataObject { + // ... private static $db = [ 'Name' => 'Varchar', 'Birthday' => 'Date', @@ -515,7 +586,7 @@ class Player extends DataObject Use a single search field that matches on multiple database fields with `'match_any'`. This also supports specifying a `FormField` and a filter, though it is not necessary to do so. > [!CAUTION] -> If you don't specify a `FormField`, you must use the name of a real database field as the array key instead of a custom name so that a default field class can be determined. +> If you don't specify `field` or `dataType`, you must use the name of a real database field as the array key instead of a custom name so that a default field class can be determined. ```php namespace App\Model; @@ -524,6 +595,7 @@ use SilverStripe\Forms\TextField; class Order extends DataObject { + // ... private static $db = [ 'Name' => 'Varchar', ]; @@ -537,6 +609,8 @@ class Order extends DataObject 'CustomName' => [ 'title' => 'First Name', 'field' => TextField::class, + // Instead of defining "field" above, you could set "dataType" to a DBField instance like so: + // 'dataType' => DBVarchar::class, 'match_any' => [ // Searching with the "First Name" field will show Orders matching either // Name, Customer.FirstName, or ShippingAddress.FirstName @@ -549,6 +623,8 @@ class Order extends DataObject } ``` +You can also allow users to filter `match_any` with a range, using the configuration specified in [using `WithinRangeFilter`](#searchable-fields-withinrangefilter). + ## Summary fields Summary fields can be used to show a quick overview of the data for a specific [DataObject](api:SilverStripe\ORM\DataObject) record. The most common use @@ -561,6 +637,7 @@ use SilverStripe\ORM\DataObject; class MyDataObject extends DataObject { + // ... private static $db = [ 'Name' => 'Text', 'OtherProperty' => 'Text', @@ -585,6 +662,7 @@ use SilverStripe\ORM\DataObject; class OtherObject extends DataObject { + // ... private static $db = [ 'Title' => 'Varchar', ]; @@ -598,6 +676,7 @@ use SilverStripe\ORM\DataObject; class MyDataObject extends DataObject { + // ... private static $db = [ 'Name' => 'Text', 'Description' => 'HTMLText', @@ -626,6 +705,7 @@ use SilverStripe\ORM\DataObject; class MyDataObject extends DataObject { + // ... private static $db = [ 'Name' => 'Text', ]; @@ -652,6 +732,7 @@ use SilverStripe\ORM\DataObject; class MyDataObject extends DataObject { + // ... private static $db = [ 'Name' => 'Text', ]; diff --git a/en/08_Changelogs/6.0.0.md b/en/08_Changelogs/6.0.0.md index a2141fe7b..34f470727 100644 --- a/en/08_Changelogs/6.0.0.md +++ b/en/08_Changelogs/6.0.0.md @@ -20,6 +20,7 @@ title: 6.0.0 (unreleased) - [Changes to default cache adapters](#caching) - [Changes to scaffolded form fields](#scaffolded-fields) - [`SiteTree` uses form field scaffolding](#sitetree-scaffolding) + - [Filter within a range with `searchable_fields`](#searchable-withinrange) - [Changes to the templating/view layer](#view-layer) - [Changes to `LeftAndMain` and its subclasses](#leftandmain-refactor) - [Changes to password validation](#password-validation) @@ -599,6 +600,40 @@ SilverStripe\UserForms\Model\UserDefinedForm: +### Filter within a range with `searchable_fields` {#searchable-withinrange} + +Using the `searchable_fields` configuration, you can now declare that a field should be filtered using a range. This works out of the box with the numeric, date, datetime, and time fields that come in the Silverstripe framework. + +> [!TIP] +> You can also provide ranges for other field types, but it requires some additional configuration. + +```php +namespace App\Model; + +use SilverStripe\ORM\DataObject; +use SilverStripe\ORM\Filters\WithinRangeFilter; + +class MyDataObject extends DataObject +{ + // ... + private static array $db = [ + 'Price' => 'Currency', + ]; + + private static array $searchable_fields = [ + 'Price' => WithinRangeFilter::class, + ]; +} +``` + +This configuration will duplicate the form field, providing one form field for the "from" value, and another for the "to" value. Users can then filter within a range using the filters in the CMS. + +![filter by price within a range](../_images/withinrangefilter.png) + +If a user fills in only the "from" or "to" field, the other will be populated with the minimum or maximum value defined by the relevant `DBField` class in [`getMinValue()`](api:SilverStripe\ORM\FieldType\DBField::getMinValue()) or [`getMaxValue()`](api:SilverStripe\ORM\FieldType\DBField::getMaxValue()) + +See the [searchable fields documentation](/developer_guides/model/scaffolding/#searchable-fields-withinrangefilter) for more details. + ### Changes to the templating/view layer {#view-layer} Note that the `SilverStripe\View\ViewableData` class has been renamed to [`SilverStripe\Model\ModelData`](api:SilverStripe\Model\ModelData). We will refer to it as `ModelData` in the rest of these change logs. diff --git a/en/_images/changelogs/5.2.0/elemental-badge.png b/en/_images/changelogs/5.2.0/elemental-badge.png deleted file mode 100644 index 9a2480ee3f7815ff69bd8feb1d5128d7ccc49449..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19182 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
NhKE1%f-si`knbQF~7u3q1uaFEP^}5INWt8kWKI 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 diff --git a/en/_images/withinrangefilter.png b/en/_images/withinrangefilter.png new file mode 100644 index 0000000000000000000000000000000000000000..ae9fc2f6e97f3ab19cd6284305c55491c6b4e100 GIT binary patch literal 7794 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 literal 0 HcmV?d00001