SilverStripe GridField下载没有Ajax的链接

时间:2015-02-08 15:35:31

标签: php ajax silverstripe

这是我遇到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);
        }
    } 
}

1 个答案:

答案 0 :(得分:3)

即使我发布了这个问题,答案仍然存在。 在GetColumnContent中正在创建一个GridField_FormAction对象。

在GridFieldExportButton中,有一条无辜的线条,其中一个按钮接收一个名为“不要笑”的额外css类 - ' no ajax'该按钮也是GridField_FormAction。

GetColumnContent中的

添加了这一行:

$field->addExtraClass('no-ajax');

完美无缺。