【问题标题】:Unable to customize filter/ search form of ModelAdmin in SilverStripe 4.4.4无法在 SilverStripe 4.4.4 中自定义 ModelAdmin 的过滤器/搜索表单
【发布时间】:2020-03-24 07:16:45
【问题描述】:

我正在从事 SilverStripe 项目。基本上,我将我的项目更新到 SilverStripe 版本 4.4.4。升级后发现ModelAdmin的搜索/过滤表单发生了变化,如下图所示。

我现在要做的是在本课之后尝试自定义 ModelAdmin 的搜索/过滤表单的字段。 https://www.silverstripe.org/learn/lessons/v4/introduction-to-modeladmin-1.

我有一个链接到模型管理类的数据对象类。以下是模型管理类的虚拟代码。

class EnquirySubmission extends DataObject
{
    private static $db = [
        //some hidden fields are here
    ];

    private static $has_one = [
        'Member' => Member::class
    ];

    private static $summary_fields = [
        'Member.Name'   => 'Member',
        //some hidden fields are here
    ];

    //some hidden code goes here

    public function searchableFields()
    {
        return [
            'Member.Name' => [
                'filter' => 'PartialMatchFilter',
                'title' => 'Member',
                'field' => \SilverStripe\Forms\DropdownField::create('Member.Name')
                 ->setSource(
                        Member::get()->map('ID','Email')
                    )->setEmptyString('-- Member --')
            ],
        ];
    }
}

正如您在代码中看到的,我正在通过覆盖 searchableFields 方法来自定义过滤器/搜索表单。但它在 SilverStripe 的升级版中不起作用。我缺少什么以及如何解决?

【问题讨论】:

    标签: silverstripe silverstripe-4


    【解决方案1】:

    Silverstripe 和 ModelAdmin 是王牌,但令人困惑的是,为什么到目前为止这个日期范围搜索问题都需要在每个版本中进行调整。这是我刚刚在 4.7.2 上工作的完整示例(发布时的最新稳定版本)...

    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)'));
        }
    }
    

    app/src/Test/MyAdmin.php

    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/src/Test/MyAdminExtension.php

    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;
        }
    }
    

    app/_config/mysite.yml

    MyVendor\MyNamespace\MyAdmin:
      extensions:
        - MyVendor\MyNamespace\MyAdminExtension
    

    【讨论】:

      猜你喜欢
      • 2016-02-04
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      相关资源
      最近更新 更多