没有 Ajax 的 SilverStripe GridField 下载链接
SilverStripe GridField Download Links without the Ajax
这是我遇到的 问题的延续,其中需要将 link 插入到每个项目的 SilverStripe GridField 中。
现在的想法是,将有一个自定义操作来启动下载,而不是 link,因此需要一个自定义 GridFieldAction。我通过查看 GridFieldDeleteAction class 并将我在那里找到的内容与来自 GridFieldExportButton class 的信息相结合,找到了如何做到这一点。结果 almost 有效,但文件直接传递到 CMS 选项卡的 div 元素,而不是通过浏览器的下载管理器下载。
这一定是因为数据是使用 ajax 传回的,但是如果不这样做,我该如何停止呢? GridFieldExportButton 能够做到这一点,所以我的 class 也应该如此,该死的!
/**
*
* @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 class 调用 -- 别笑 -- 'no ajax' 该按钮也是一个 GridField_FormAction.
在 GetColumnContent 中添加了这一行:
$field->addExtraClass('no-ajax');
完美运行。
这是我遇到的
现在的想法是,将有一个自定义操作来启动下载,而不是 link,因此需要一个自定义 GridFieldAction。我通过查看 GridFieldDeleteAction class 并将我在那里找到的内容与来自 GridFieldExportButton class 的信息相结合,找到了如何做到这一点。结果 almost 有效,但文件直接传递到 CMS 选项卡的 div 元素,而不是通过浏览器的下载管理器下载。 这一定是因为数据是使用 ajax 传回的,但是如果不这样做,我该如何停止呢? GridFieldExportButton 能够做到这一点,所以我的 class 也应该如此,该死的!
/**
*
* @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 class 调用 -- 别笑 -- 'no ajax' 该按钮也是一个 GridField_FormAction.
在 GetColumnContent 中添加了这一行:
$field->addExtraClass('no-ajax');
完美运行。