2013-07-06 44 views
2

顯然GridFieldExportButton只導出當前可見的數據集(分頁)。有沒有辦法讓它從模型中導出所有的行?如何在ModelAdmin(SilverStripe 3.1)中將所有行導出爲CSV格式?

或者:有沒有辦法顯示所有行(例如旁路分頁),以便用戶可以在顯示所有行後執行導出?我不想一直顯示所有行(可能通過設置ModelAdmin::set_page_length(<ridiculouslyHighNumber>);),但只能根據需要顯示。

+2

這已被固定在3.1.2 – Mediabeastnz

回答

5

通過創建GridFieldExportButton的自定義子類並將其用於我的模型來解決此問題。關鍵是在generateExportFileData方法中使用$gridField->getList();而不是$gridField->getManipulatedList();

下面是完整的類人感興趣的是:

class GridFieldExportAllButton extends GridFieldExportButton { 
    /** 
    * Generate export fields for CSV. 
    * 
    * @param GridField $gridField 
    * @return array 
    */ 
    public function generateExportFileData($gridField) { 
     $separator = $this->csvSeparator; 
     $csvColumns = ($this->exportColumns) 
      ? $this->exportColumns 
      : singleton($gridField->getModelClass())->summaryFields(); 
     $fileData = ''; 
     $columnData = array(); 
     $fieldItems = new ArrayList(); 

     if($this->csvHasHeader) { 
      $headers = array(); 

      // determine the CSV headers. If a field is callable (e.g. anonymous function) then use the 
      // source name as the header instead 
      foreach($csvColumns as $columnSource => $columnHeader) { 
       $headers[] = (!is_string($columnHeader) && is_callable($columnHeader)) ? $columnSource : $columnHeader; 
      } 

      $fileData .= "\"" . implode("\"{$separator}\"", array_values($headers)) . "\""; 
      $fileData .= "\n"; 
     } 

     $items = $gridField->getList(); 

     foreach($items as $item) { 
      $columnData = array(); 
      foreach($csvColumns as $columnSource => $columnHeader) { 
       if(!is_string($columnHeader) && is_callable($columnHeader)) { 
        if($item->hasMethod($columnSource)) { 
         $relObj = $item->{$columnSource}(); 
        } else { 
         $relObj = $item->relObject($columnSource); 
        } 

        $value = $columnHeader($relObj); 
       } else { 
        $value = $gridField->getDataFieldValue($item, $columnSource); 
       } 

       $value = str_replace(array("\r", "\n"), "\n", $value); 
       $columnData[] = '"' . str_replace('"', '\"', $value) . '"'; 
      } 
      $fileData .= implode($separator, $columnData); 
      $fileData .= "\n"; 

      $item->destroy(); 
     } 

     return $fileData; 
    } 
} 
+2

不錯的工作! 任何機會,你可以拉請求,要麼進入藍寶石或將其放入一個模塊(例如一個新的模塊或將其添加到https://github.com/ajshort/silverstripe-gridfieldextensions) – Zauberfisch

0

感謝這個!

我不得不在安全管理員中使用這個會員GF。

爲任何感興趣的人創建擴展。

class SecurityAdminExtension extends Extension{ 


     function updateEditForm($form){ 

      $gf = $form->Fields()->fieldByName('Root.Users.Members'); 
      $gfConfig = $gf->getConfig(); 
      $gfConfig->removeComponentsByType('GridFieldExportButton'); 
      $gfConfig->addComponent(new GridFieldExportAllButton()); 

     } 


} 
6

您可以重寫ModelAdmin :: getExportFields()來定義要導出的列。 該方法需要返回一個數組,列名作爲鍵,db字段作爲值。

例如:

class MyCustomModelAdmin extends ModelAdmin { 

.... 

    public function getExportFields() { 
     return array(
        'FirstName' => 'FirstName', 
        'Surname' => 'Surname', 
        'Age' => 'Age' 
     ); 
    } 

} 
-1

我一會兒回來,我創建了一個小插件,可以很容易地數據對象導出爲CSV或Excel文件。

https://github.com/firebrandhq/excel-export

它配備了一個按鈕,你可以添加到一個網格場。

它對PHP-Excel有依賴性。

相關問題