gpt4 book ai didi

php - 如何生成自定义 CSV 导出?

转载 作者:可可西里 更新时间:2023-11-01 00:56:12 25 4
gpt4 key购买 nike

我有一个名为 EventPage 的页面,我正在通过模型管理员进行管理。同时使用目录管理器:https://github.com/littlegiant/silverstripe-catalogmanager

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

我在 EventPage 上有一个 'EndDate' => 'Date', 字段。

所以我只想在我的 CSV 导出中显示 EventPages,其中 EndDate 大于或等于今天的日期,例如已过期。

以下生成一个 CSV 导出按钮,但目前它正在导出所有字段,因为我想对其进行过滤,以便我们只显示过期事件。

我该怎么做?

<?php

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功能,但添加了 filterByCallback$items 上列表以过滤具有 EndDate < date('Y-m-d') 的项目.

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 => '<p class="grid-csv-button">' . $button->Field() . '</p>',
);
}

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

关于php - 如何生成自定义 CSV 导出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42521818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com