php csv导出设置宽度,php-如何生成自定义CSV导出?

问题是我需要能够导出所有过期的事件(以及所有字段).

我有一个’EndDate’=>事件页面上的“日期”字段.

因此,我只想在CSV导出中显示EndDate大于今天的日期(例如过期)的EventPages.

下面的代码生成了一个CSV导出按钮,但是当前它正在导出所有字段,在这里我想对其进行过滤,因此我们只显示过期的事件.

我该怎么办?

class EventAdmin extends CatalogPageAdmin {

public $showImportForm = false;

private static $managed_models = array(

'EventPage',

'EventCategory',

'EventSubmission',

);

private static $url_segment = 'events';

private static $menu_title = 'Events';

public function getEditForm($id = null, $fields = null) {

$form = parent::getEditForm($id, $fields);

$gridFieldName = 'EventPage';

$gridField = $form->Fields()->fieldByName($gridFieldName);

if ($gridField) {

$gridField->getConfig()->addComponent(new GridFieldExportButton());

}

return $form;

}

}

解决方法:

我们可以创建一个自定义导出按钮,以在导出项目之前过滤项目列表.

首先,我们创建一个GridFieldExportExpiredEventsButton,它扩展了GridFieldExportButton.这是当前SilverStripe 3.5 generateExportFileData函数的完整副本,但在$items列表上添加了filterByCallback,以过滤EndDate

class GridFieldExportExpiredEventsButton extends GridFieldExportButton {

public function getHTMLFragments($gridField) {

$button = new GridField_FormAction(

$gridField,

'export',

'Export expired events',

'export',

null

);

$button->setAttribute('data-icon', 'download-csv');

$button->addExtraClass('no-ajax action_export');

$button->setForm($gridField->getForm());

return array(

$this->targetFragment => '

' . $button->Field() . '

',

);

}

public function generateExportFileData($gridField) {

$separator = $this->csvSeparator;

$csvColumns = $this->getExportColumnsForGridField($gridField);

$fileData = '';

$member = Member::currentUser();

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";

}

//Remove GridFieldPaginator as we're going to export the entire list.

$gridField->getConfig()->removeComponentsByType('GridFieldPaginator');

$items = $gridField->getManipulatedList();

$items = $items->filterByCallback(function($item) {

// The following line modifies what items are filtered. Change this to change what items are filtered

return $item->EndDate < date('Y-m-d');

});

// @todo should GridFieldComponents change behaviour based on whether others are available in the config?

foreach($gridField->getConfig()->getComponents() as $component){

if($component instanceof GridFieldFilterHeader || $component instanceof GridFieldSortableHeader) {

$items = $component->getManipulatedData($gridField, $items);

}

}

foreach($items->limit(null) as $item) {

if(!$item->hasMethod('canView') || $item->canView($member)) {

$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);

if($value === null) {

$value = $gridField->getDataFieldValue($item, $columnHeader);

}

}

$value = str_replace(array("\r", "\n"), "\n", $value);

$columnData[] = '"' . str_replace('"', '""', $value) . '"';

}

$fileData .= implode($separator, $columnData);

$fileData .= "\n";

}

if($item->hasMethod('destroy')) {

$item->destroy();

}

}

return $fileData;

}

}

我们添加的用于过滤导出项目的额外行是:

return $item->EndDate < date('Y-m-d');

更改此项以更改导出的项目列表.我将其设置为仅返回具有EndDate的项目.根据需要更改此设置.

然后,我们将此导出按钮添加到事件模型管理员的网格字段中:

class EventAdmin extends CatalogPageAdmin {

private static $managed_models = array(

'EventPage'

);

public function getEditForm($id = null, $fields = null) {

$form = parent::getEditForm($id);

if ($this->modelClass == 'EventPage') {

$gridField = $form->Fields()->fieldByName($this->modelClass);

$gridField->getConfig()->removeComponentsByType('GridFieldExportButton');

$gridField->getConfig()->addComponent(new GridFieldExportExpiredEventsButton('buttons-before-left'));

}

return $form;

}

}

标签:silverstripe,php

来源: https://codeday.me/bug/20191026/1934685.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值