Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义ModelAdmin筛选器以支持SilverStripe中的日期范围_Silverstripe_Silverstripe 4 - Fatal编程技术网

自定义ModelAdmin筛选器以支持SilverStripe中的日期范围

自定义ModelAdmin筛选器以支持SilverStripe中的日期范围,silverstripe,silverstripe-4,Silverstripe,Silverstripe 4,我正在开发一个SilverStripe项目。我现在正在努力定制ModelAdmin实体的过滤器/搜索。我试图添加一个日期范围过滤器,如下所示 正如您所看到的,有from和to字段。我有一个名为Property的类,我正试图自定义CMS的搜索/过滤器,如下所示,以支持日期范围过滤 class Property extends DataObject { public function searchableFields() { return [

我正在开发一个SilverStripe项目。我现在正在努力定制ModelAdmin实体的过滤器/搜索。我试图添加一个日期范围过滤器,如下所示

正如您所看到的,有from和to字段。我有一个名为Property的类,我正试图自定义CMS的搜索/过滤器,如下所示,以支持日期范围过滤

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