【问题标题】:How do you Filter CSV exports on silverstripe CMS?您如何在 silverstripe CMS 上过滤 CSV 导出?
【发布时间】:2019-01-17 01:07:39
【问题描述】:

我正在尝试导出我的数据的 CSV,该数据当前显示在我的 Silverstripe CMS 的一部分中,按特定日期范围过滤。它在导出整个内容时工作正常,但我希望能够过滤导出的结果,以便它返回特定日期范围内的所有结果。

我的数据库有一个记录创建日期的列 - 格式为 'D-M-Y;我认为可以使用 H-M-S' 进行过滤,但我不知道如何设置搜索过滤器。我知道,如果您使用可搜索字段然后导出,您只会导出过滤后的搜索结果,因此会假设这是最好的方法,但无法弄清楚如何实现它。

任何建议将不胜感激。

-- 免责声明 - 我本来想把它放在 silverstripe 论坛上,但由于某种原因我完全无法注册 - 我从未收到电子邮件确认。 ---

<?php
namespace AffiliateProgram;

use SilverStripe\Forms\GridField\GridField;
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
use SilverStripe\Security\Permission;
use SilverStripe\ORM\DataObject;


class MemberBonus extends DataObject
 {
private static $db = [
    'Amount' => 'Currency',
    'Confirmed' => 'Boolean',
    'Level' => 'Int',
    'Percentage' => 'Int'
];

private static $has_one = [
    'Member' => 'AffiliateProgram\Member',
    'MemberPayment' => 'AffiliateProgram\MemberPayment',
    'PaymentType' => 'AffiliateProgram\PaymentType',
    'ProgramType' => 'AffiliateProgram\ProgramType'
];

private static $summary_fields = [
    'Amount' => 'Amount (USD)',
    'Member.Email' => 'Email', 
    'Level',
    'MemberPayment.PaymentType.Symbol' => 'Recieved As',
    'Percentage' => 'Percentage Bonus Applied',
    'ProgramType.Name' => 'Program Type',
    'MemberPayment.Created' => 'Payment Date',
    'Confirmed' => 'Confirmed?',
    'MemberPayment.ID' => 'Payment ID'
];
}

表格上还有一个 DateCreated 列。

【问题讨论】:

  • 默认情况下,“导出为 CSV”按钮将从您的 GridField 中导出当前 过滤 DataList(假设您在这里使用的是 GridField),所以如果您已经按日期过滤它然后导出应该只获取这些记录并导出它们。这不是你看到的吗?如果不是,请提供您正在使用的 SilverStripe 版本以及您用于创建此 GridField 的代码
  • 嗨@RobbieAverill,对不起,我没有说得很清楚。我可以按其他变量过滤,但不能按创建日期过滤。我正在使用 Silverstripe 4.1(我很确定)。这是我想弄清楚的过滤。我会将模型的代码添加到上面。谢谢大家!

标签: silverstripe silverstripe-4


【解决方案1】:

您可以通过getSearchContext() 将自定义搜索字段添加到ModelAdmin,并使用getList() 根据它们自定义查询。请参阅 SilverStripe 文档的 this section

以下示例排除了 CreatedAt 值低于搜索字段中提供的日期的结果(假设您的 ModelAdmin 仅管理 MemberBonus):

<?php

use SilverStripe\Admin\ModelAdmin;
use SilverStripe\Forms\DatetimeField;

class MemberBonusAdmin extends ModelAdmin
{
    ...

    public function getSearchContext()
    {
        $context = parent::getSearchContext();

        $context->getFields()->push(new DatetimeField('q[CreatedAfter]', 'Created After'));

        return $context;
    }

    public function getList() 
    {
        $list = parent::getList();

        $params = $this->getRequest()->requestVar('q');

        if (!empty($params['CreatedAfter'])) {
            $list = $list->exclude('CreatedAt:LessThan', $params['CreatedAfter']);
        }

        return $list;
    }
}

要使范围正常工作,您只需要添加一个 CreatedBefore 字段和过滤器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2013-07-04
    • 2020-06-12
    • 2023-04-02
    • 2015-06-30
    • 1970-01-01
    相关资源
    最近更新 更多