从CMS EditForm

时间:2016-04-13 01:18:38

标签: php silverstripe

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

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

这是我的功能

public function 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打开或保存对话框。

2 个答案:

答案 0 :(得分:2)

解决方案将是你如何称呼它。我建议您制作一个完整的新控制器或修改像......这样的模块。

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

即可

已在本地测试并确认可以正常使用

答案 1 :(得分:0)

此报告是否来自CMS本身?如果是,您是否有ModelAdmin来管理CustomerOrderLine个对象?如果是这样,你能否使用GridField的“导出到CSV”按钮?

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