如何在ModelAdmin(SilverStripe 3.1)中将所有行导出为CSV?
显然,如何在ModelAdmin(SilverStripe 3.1)中将所有行导出为CSV?,silverstripe,modeladmin,Silverstripe,Modeladmin,显然,GridFieldExportButton只导出当前可见的数据集(分页)。有没有办法让它从模型中导出所有行 或者:是否有一种方法可以显示所有行(例如绕过分页),以便用户可以在显示所有行后执行导出?我不想一直显示所有行(通过设置ModelAdmin::set_page_length();),但只能按需显示。通过创建GridFieldExportButton的自定义子类并将其用于我的模型,解决了这一问题。关键是使用$gridField->getList()而不是$gridField->getM
GridFieldExportButton
只导出当前可见的数据集(分页)。有没有办法让它从模型中导出所有行
或者:是否有一种方法可以显示所有行(例如绕过分页),以便用户可以在显示所有行后执行导出?我不想一直显示所有行(通过设置
ModelAdmin::set_page_length();
),但只能按需显示。通过创建GridFieldExportButton
的自定义子类并将其用于我的模型,解决了这一问题。关键是使用$gridField->getList()代码>而不是$gridField->getManufacturedList()在generateExportFileData
方法中的code>
以下是所有感兴趣的人的完整课程:
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;
}
}
谢谢你
我不得不在安全管理中为成员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文件
它附带一个按钮,您可以将其添加到网格字段中
它依赖于PHP Excel。干得好!您可以将请求拉入sapphire或将其放入模块(如新模块或将其添加到模块)中的任何机会都已在3.1.2中修复