【问题标题】:Generating CSV from CMS EditForm从 CMS EditForm 生成 CSV
【发布时间】:2016-04-13 01:18:38
【问题描述】:

我有一个项目,人们可以在其中预订活动地点。有几十个事件。我被要求生成一份列出与会者的报告,以便他们可以在门口办理登机手续。因为有很多事件,我想在每个事件的编辑表单中添加一个“与会者报告”按钮(在 CMS 内)。我已经创建了按钮,它可以工作。

但是...我没有在 CSV 中获取数据,而是在 CMS 中显示了(正确的)数据,就好像它正在被回显一样。

这是我的功能

公共函数 getCustomersForEvent($data, $form){

    $attendees = CustomerOrderLine::get()->filter(array("EventID" => $data["ID"]));

    if(!$attendees){
        return false;
    }

    $fileName = "report.csv";

    $separator = ",";
    $csvColumns = array("ID", "Description", "Customer");

    $fileData = "";

    foreach($attendees as $row){
        $fileData .= $row->Event()->EventName . $separator;
        $fileData .= $row->CustomerOrder()->Customer()->FirstName . " " . $row->CustomerOrder()->Customer()->Surname . "\n";
    }

    return SS_HTTPRequest::send_file($fileData, $fileName, 'text/csv');
}

我查看了这个http://www.silverstripe.org/community/forums/general-questions/show/15325,但数据还是回显到了 CMS。

谁能告诉我我做错了什么?正如我所说,数据很好,但我没有看到 CSV 打开或保存对话框。

【问题讨论】:

  • 也许你需要在发送输出之前设置一个内容处置头
  • 。 .不,它仍然在 CMS 上输出为文本。

标签: php silverstripe


【解决方案1】:

解决方案取决于您如何称呼它。我建议您制作一个全新的控制器或修改一个模块,例如...

https://github.com/axyr/silverstripe-phpexcel

...您可以在其中复制 php 代码并对其进行修改以仅从上面返回您需要的数据。

制作一个只专注于下载文件的控制器...

class CustomersForEvent_Controller extends Page_Controller {

    private static $allowed_actions = array (
        'downloadcsv',
    );

    public function downloadcsv() {
        return SS_HTTPRequest::send_file("my content",'myfile.csv','text/csv');
    }

}

并将该控制器添加到 _config/config.yml 中的路由...

Director:
  rules:
    'attendees': 'CustomersForEvent_Controller'

...然后您可以链接到 yousite.com/attendees/downloadcsv

这已经在本地测试并确认可以工作

【讨论】:

  • 它可以在 CMS 中工作吗?我会看看那个。与此同时,我通过将内容保存到一个文件(每个生成报告的每个成员一个)然后返回一个指向该文件的 sprintf 链接来解决这个问题。但这就像自制的罪恶一样丑陋,所以我会看看你的答案。
  • 是的,这两种解决方案都“在 CMS 中工作”,但方式不同 - 该模块显示了如何为此调整/制作按钮。自定义控制器的设计目的是让您可以创建一个链接(使用 target = “_blank”)并触发下载基本相同的 UX
【解决方案2】:

此报告是从 CMS 本身生成的吗?如果是这样,您是否有用于管理CustomerOrderLine 对象的ModelAdmin?如果是这样,您可以不使用 GridField 的“导出到 CSV”按钮吗?

为了输出除 GridField 本身显示的字段以外的任何内容,您需要创建/更改模型类的 $getExportFields() 方法以返回模型上您希望导出的所有字段的数组以这种方式。

【讨论】:

  • 是的,它将在 CMS 中生成,是的,我确实有一个工作的 ModelAdmin。我认为我不能使用 GridFieldExportButton 的原因是因为我试图获取参加 an 活动的人员列表,而不是整个列表。因此,用户将进入 ModelAdmin,选择一条记录,然后按钮位于 EditForm 上。我可以生成 CSV 报告,但似乎无法获得通常的“打开或保存”对话框。
  • 奇怪的是没有出现保存对话框。如果您想了解原因,请查看发送的浏览器标头,购买网络服务器和您的浏览器工具。除此之外,我知道您要做什么 - 您想要 每个 GridField 行 的导出按钮,对吗?这是创建GridField_ActionProvider 的新实现的问题。看看我几年前为高级工作流模块所做的一个。看起来它应该可以满足您的需要? github.com/silverstripe-australia/advancedworkflow/blob/master/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 2011-05-17
相关资源
最近更新 更多