Это продолжение проблемы, с которой у меня был earlier, где ссылка должна была быть вставлена в SilverStripe GridField для каждого элемента.SilverStripe GridField Загрузить ссылки без Ajax
Теперь идея состоит в том, что вместо ссылки будет инициировано пользовательское действие, чтобы инициировать загрузку, поэтому должен быть пользовательский GridFieldAction. Я узнал, как это сделать, посмотрев класс GridFieldDeleteAction и смешав то, что я нашел там, с информацией из класса GridFieldExportButton. Результат почти работает, но файл передается непосредственно на элемент div вкладки CMS, а не загружается через диспетчер загрузки браузера. Это должно быть потому, что данные передаются обратно с помощью 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);
}
}
}