2015-02-08 2 views
1

Это продолжение проблемы, с которой у меня был 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); 
     } 
    } 
} 

ответ

2

Ответ представлен сам, даже когда я разместил вопрос. в GetColumnContent Создается объект GridField_FormAction.

В GridFieldExportButton есть невидимая линия, где кнопка получает дополнительный класс css, который называется - не смеяться - «no ajax». Кнопка также является GridField_FormAction.

в GetColumnContent добавили эту строку:

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

отлично работает.

Смежные вопросы