自定义ModelAdmin筛选器以支持SilverStripe中的日期范围
我正在开发一个SilverStripe项目。我现在正在努力定制ModelAdmin实体的过滤器/搜索。我试图添加一个日期范围过滤器,如下所示 正如您所看到的,有from和to字段。我有一个名为Property的类,我正试图自定义CMS的搜索/过滤器,如下所示,以支持日期范围过滤自定义ModelAdmin筛选器以支持SilverStripe中的日期范围,silverstripe,silverstripe-4,Silverstripe,Silverstripe 4,我正在开发一个SilverStripe项目。我现在正在努力定制ModelAdmin实体的过滤器/搜索。我试图添加一个日期范围过滤器,如下所示 正如您所看到的,有from和to字段。我有一个名为Property的类,我正试图自定义CMS的搜索/过滤器,如下所示,以支持日期范围过滤 class Property extends DataObject { public function searchableFields() { return [
class Property extends DataObject
{
public function searchableFields()
{
return [
//other fields go here
'Created' => [
'filter' => 'GreaterThanOrEqualFilter',
'title' => 'From',
'field' => DateField::class
],
'Created' => [
'filter' => 'To',
'title' => 'Decision date until',
'field' => DateField::class
],
];
}
}
由于数组键被覆盖,因此只向弹出窗口添加一个字段。如何将其配置为具有两个日期字段以指定搜索表单的日期范围?现在可能不相关,但我今天突然遇到了这个问题,并尝试了您的代码,您是对的,我认为只创建了一个字段,因为您使用的是单个DateField::class。我试图寻找一个模块,创建一个日期范围字段,我只能找到这个,但它看起来像是一个项目特定的 在我的例子中,我有两个日期字段(已创建和已结束),使用您的代码,我可以通过将其调整为以下内容来获得良好的结果:
public function searchableFields()
{
return [
//other fields go here
'StartDate' => [
'filter' => 'GreaterThanOrEqualFilter',
'title' => 'From',
'field' => DateField::class
],
'EndDate' => [
'filter' => 'LessThanOrEqualFilter',
'title' => 'To',
'field' => DateField::class
],
];
}
希望它能帮助一些人。使用此示例
DataObject
创建自定义更新函数updateAdminSearchFields
app/src/Test/MyDataObject.php
namespace MyVendor\MyNamespace;
use SilverStripe\Forms\DateField;
use SilverStripe\ORM\DataObject;
class MyDataObject extends DataObject {
private static $db = [
'Title' => 'Varchar',
'MyDateTimeField' => 'DBDatetime'
];
private static $summary_fields = ['Title','MyDateTimeField'];
public function updateAdminSearchFields($fields) {
$fields->removeByName('MyDateTimeField');//needed as added in summary field
$fields->push(DateField::create('MyDateTimeField:GreaterThanOrEqual', 'MyDateTimeField (Start)'));
$fields->push(DateField::create('MyDateTimeField:LessThanOrEqual', 'MyDateTimeField (End)'));
}
}
namespace MyVendor\MyNamespace;
use SilverStripe\ORM\DataExtension;
class MyAdminExtension extends DataExtension {
public function updateSearchContext($context) {
$class = $context->getQuery([])->dataClass();
if (method_exists($class, 'updateAdminSearchFields'))
(new $class)->updateAdminSearchFields($context->getFields());
return $context;
}
}
namespace MyVendor\MyNamespace;
use SilverStripe\Admin\ModelAdmin;
class MyAdmin extends ModelAdmin {
private static $menu_title = 'MyAdmin';
private static $url_segment = 'myadmin';
private static $managed_models = [MyDataObject::class];
public function getList() {
$list = parent::getList();
if ($params = $this->getRequest()->requestVar('filter'))
if ($filters = $params[$this->sanitiseClassName($this->modelClass)])
return $list->filter($filters);
return $list;
}
}
然后创建一个扩展,可以将其链接到ModelAdmin
app/src/Test/MyAdminExtension.php
namespace MyVendor\MyNamespace;
use SilverStripe\Forms\DateField;
use SilverStripe\ORM\DataObject;
class MyDataObject extends DataObject {
private static $db = [
'Title' => 'Varchar',
'MyDateTimeField' => 'DBDatetime'
];
private static $summary_fields = ['Title','MyDateTimeField'];
public function updateAdminSearchFields($fields) {
$fields->removeByName('MyDateTimeField');//needed as added in summary field
$fields->push(DateField::create('MyDateTimeField:GreaterThanOrEqual', 'MyDateTimeField (Start)'));
$fields->push(DateField::create('MyDateTimeField:LessThanOrEqual', 'MyDateTimeField (End)'));
}
}
namespace MyVendor\MyNamespace;
use SilverStripe\ORM\DataExtension;
class MyAdminExtension extends DataExtension {
public function updateSearchContext($context) {
$class = $context->getQuery([])->dataClass();
if (method_exists($class, 'updateAdminSearchFields'))
(new $class)->updateAdminSearchFields($context->getFields());
return $context;
}
}
namespace MyVendor\MyNamespace;
use SilverStripe\Admin\ModelAdmin;
class MyAdmin extends ModelAdmin {
private static $menu_title = 'MyAdmin';
private static $url_segment = 'myadmin';
private static $managed_models = [MyDataObject::class];
public function getList() {
$list = parent::getList();
if ($params = $this->getRequest()->requestVar('filter'))
if ($filters = $params[$this->sanitiseClassName($this->modelClass)])
return $list->filter($filters);
return $list;
}
}
app/\u config/mysite.yml
MyVendor\MyNamespace\MyAdmin:
extensions:
- MyVendor\MyNamespace\MyAdminExtension
最后在ModelAdmin
上应用这些过滤器
app/src/Test/MyAdmin.php
namespace MyVendor\MyNamespace;
use SilverStripe\Forms\DateField;
use SilverStripe\ORM\DataObject;
class MyDataObject extends DataObject {
private static $db = [
'Title' => 'Varchar',
'MyDateTimeField' => 'DBDatetime'
];
private static $summary_fields = ['Title','MyDateTimeField'];
public function updateAdminSearchFields($fields) {
$fields->removeByName('MyDateTimeField');//needed as added in summary field
$fields->push(DateField::create('MyDateTimeField:GreaterThanOrEqual', 'MyDateTimeField (Start)'));
$fields->push(DateField::create('MyDateTimeField:LessThanOrEqual', 'MyDateTimeField (End)'));
}
}
namespace MyVendor\MyNamespace;
use SilverStripe\ORM\DataExtension;
class MyAdminExtension extends DataExtension {
public function updateSearchContext($context) {
$class = $context->getQuery([])->dataClass();
if (method_exists($class, 'updateAdminSearchFields'))
(new $class)->updateAdminSearchFields($context->getFields());
return $context;
}
}
namespace MyVendor\MyNamespace;
use SilverStripe\Admin\ModelAdmin;
class MyAdmin extends ModelAdmin {
private static $menu_title = 'MyAdmin';
private static $url_segment = 'myadmin';
private static $managed_models = [MyDataObject::class];
public function getList() {
$list = parent::getList();
if ($params = $this->getRequest()->requestVar('filter'))
if ($filters = $params[$this->sanitiseClassName($this->modelClass)])
return $list->filter($filters);
return $list;
}
}
此示例正在使用最新的稳定版本4.7.2