我有一个项目,人们可以在活动中预订地点。有几十个事件。我被要求生成一份列出与会者的报告,以便他们可以在门口办理登机手续。因为有这么多事件,我想为每个事件(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打开或保存对话框。
答案 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()
方法,以返回模型中所有字段的数组。以这种方式出口。