这是我遇到earlier问题的延续,需要在每个项目的SilverStripe GridField中插入一个链接。
现在的想法是,不是链接,而是会有自定义操作来启动下载,因此需要自定义GridFieldAction。我通过查看GridFieldDeleteAction类,并将我在那里找到的内容与GridFieldExportButton类中的信息混合,找到了如何做到这一点。结果几乎有效,但文件直接传递到CMS选项卡的div元素,而不是通过浏览器的下载管理器下载。 这必须是因为数据是使用ajax传回的,但是如果这样做我该如何停止呢? GridFieldExportButton能够做到这一点,所以我的课也应该这样,dagnabbit!
/**
*
* @param GridField $gridField
* @param DataObject $record
* @param string $columnName
* @return string - the HTML for the column
*/
public function getColumnContent($gridField, $record, $columnName) {
$field = GridField_FormAction::create($gridField, 'downloadFile'.$record->ID, "Download", "downloadfile",
array('RecordID' => $record->ID));
return $field->Field();
}
/**
* Handle the actions and apply any changes to the GridField
*
* @param GridField $gridField
* @param string $actionName
* @param mixed $arguments
* @param array $data - form data
* @return void
*/
public function handleAction(GridField $gridField, $actionName, $arguments, $data) {
if($actionName == 'downloadfile') {
$item = $gridField->getList()->byID($arguments['RecordID']);
if(!$item) {
return;
}
$filename = $item->Document()->fileName;
if(substr($filename, 0, 1) != '/') $filename = "/$filename";
$filename = Director::baseFolder( ) . $filename;//$_SERVER['DOCUMENT_ROOT']
if( file_exists($filename) ){
$fileData = file_get_contents($filename);
return SS_HTTPRequest::send_file($fileData, $item->Document()->Name);
}else{
error_log("CMS Download Failed: ($filename) not found in GFDownloadAction::handleAction. Freak out in 10 ... 9 ... 8 ...", 0);
}
}
}
答案 0 :(得分:3)
即使我发布了这个问题,答案仍然存在。 在GetColumnContent中正在创建一个GridField_FormAction对象。
在GridFieldExportButton中,有一条无辜的线条,其中一个按钮接收一个名为“不要笑”的额外css类 - ' no ajax'该按钮也是GridField_FormAction。
GetColumnContent中的添加了这一行:
$field->addExtraClass('no-ajax');
完美无缺。