这是我之前遇到的一个问题的延续,在这个问题中,每个项目都需要在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);
}
}
}
即使在我发布问题时,答案也会出现。在GetColumnContent中,正在创建GridField_FormAction对象。
在GridFieldExportButton中,有一条看起来很无辜的线,其中一个按钮接收一个额外的css类,名为——别笑——‘no ajax’。该按钮也是GridField_FormAction。
在GetColumnContent中添加了此行:
$field->addExtraClass('no-ajax');
工作非常完美。