首页 > 解决方案 > 无法在 SilverStripe 4.4.4 中自定义 ModelAdmin 的过滤器/搜索表单

问题描述

我正在从事 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 的升级版中不起作用。我错过了什么,我该如何解决?

标签: silverstripesilverstripe-4

解决方案


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

推荐阅读