【问题标题】:Customising filter for ModelAdmin to support date range in SilverStripe为 ModelAdmin 自定义过滤器以支持 SilverStripe 中的日期范围
【发布时间】:2020-02-16 08:49:31
【问题描述】:

我正在开发一个 SilverStripe 项目。我现在正在努力自定义 ModelAdmin 实体的过滤器/搜索,https://silverstripe.org/learn/lessons/v4/introduction-to-modeladmin-1。我正在尝试添加一个日期范围过滤器,如下所示。

如您所见,有 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
            ],
        ];
    }
}

只有一个字段被添加到弹出窗口,因为数组键被覆盖。如何将其配置为具有两个日期字段来指定搜索表单的日期范围?

【问题讨论】:

    标签: silverstripe silverstripe-4


    【解决方案1】:

    现在可能不相关,但我今天遇到了这个问题,我尝试了你的代码,你是对的,我认为只创建了一个字段,因为你使用的是单个 DateField::class。我试图寻找一个创建日期范围字段的模块,但我只能找到这个one,但它看起来像是一个特定于项目的。

    在我的情况下,我有 2 个日期字段(创建和结束),使用您的代码,我可以通过将其调整为以下内容来获得良好的结果:

     public function searchableFields()
    {
        return [
            //other fields go here
            'StartDate' => [
                'filter' => 'GreaterThanOrEqualFilter',
                'title' => 'From',
                'field' => DateField::class
            ],
            'EndDate' => [
                'filter' => 'LessThanOrEqualFilter',
                'title' => 'To',
                'field' => DateField::class
            ],
        ];
    }
    

    希望对某人有所帮助。

    【讨论】:

      【解决方案2】:

      使用这个例子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)'));
          }
      }
      

      然后创建一个可以将其链接到ModelAdmin...的扩展程序...

      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
      

      最后在ModelAdmin 应用这些过滤器...

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

      此示例适用于最新的稳定版本 4.7.2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-24
        • 2016-06-14
        • 2010-12-12
        • 2023-04-11
        • 2016-02-04
        相关资源
        最近更新 更多