SilverStripe GridField下载链接没有Ajax


SilverStripe GridField Download Links without the Ajax

这是我之前遇到的一个问题的延续,在这个问题中,每个项目都需要在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');

工作非常完美。