顯然GridFieldExportButton
只導出當前可見的數據集(分頁)。有沒有辦法讓它從模型中導出所有的行?如何在ModelAdmin(SilverStripe 3.1)中將所有行導出爲CSV格式?
或者:有沒有辦法顯示所有行(例如旁路分頁),以便用戶可以在顯示所有行後執行導出?我不想一直顯示所有行(可能通過設置ModelAdmin::set_page_length(<ridiculouslyHighNumber>);
),但只能根據需要顯示。
顯然GridFieldExportButton
只導出當前可見的數據集(分頁)。有沒有辦法讓它從模型中導出所有的行?如何在ModelAdmin(SilverStripe 3.1)中將所有行導出爲CSV格式?
或者:有沒有辦法顯示所有行(例如旁路分頁),以便用戶可以在顯示所有行後執行導出?我不想一直顯示所有行(可能通過設置ModelAdmin::set_page_length(<ridiculouslyHighNumber>);
),但只能根據需要顯示。
通過創建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;
}
}
不錯的工作! 任何機會,你可以拉請求,要麼進入藍寶石或將其放入一個模塊(例如一個新的模塊或將其添加到https://github.com/ajshort/silverstripe-gridfieldextensions) – Zauberfisch
感謝這個!
我不得不在安全管理員中使用這個會員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());
}
}
您可以重寫ModelAdmin :: getExportFields()來定義要導出的列。 該方法需要返回一個數組,列名作爲鍵,db字段作爲值。
例如:
class MyCustomModelAdmin extends ModelAdmin {
....
public function getExportFields() {
return array(
'FirstName' => 'FirstName',
'Surname' => 'Surname',
'Age' => 'Age'
);
}
}
我一會兒回來,我創建了一個小插件,可以很容易地數據對象導出爲CSV或Excel文件。
https://github.com/firebrandhq/excel-export
它配備了一個按鈕,你可以添加到一個網格場。
它對PHP-Excel有依賴性。
這已被固定在3.1.2 – Mediabeastnz