Resurrect the list export feature - fixes #1313

This commit is contained in:
Samuel Georges 2015-07-27 08:50:26 +10:00
parent c3d44fb0b4
commit dbac4809f6
1 changed files with 90 additions and 6 deletions

View File

@ -5,7 +5,9 @@ use Lang;
use Backend; use Backend;
use Backend\Classes\ControllerBehavior; use Backend\Classes\ControllerBehavior;
use League\Csv\Reader as CsvReader; use League\Csv\Reader as CsvReader;
use League\Csv\Writer as CsvWriter;
use ApplicationException; use ApplicationException;
use SplTempFileObject;
use Exception; use Exception;
/** /**
@ -81,11 +83,6 @@ class ImportExportController extends ControllerBehavior
{ {
parent::__construct($controller); parent::__construct($controller);
$this->addJs('js/october.import.js', 'core');
$this->addJs('js/october.export.js', 'core');
$this->addCss('css/import.css', 'core');
$this->addCss('css/export.css', 'core');
/* /*
* Build configuration * Build configuration
*/ */
@ -127,6 +124,9 @@ class ImportExportController extends ControllerBehavior
public function import() public function import()
{ {
$this->addJs('js/october.import.js', 'core');
$this->addCss('css/import.css', 'core');
$this->controller->pageTitle = $this->controller->pageTitle $this->controller->pageTitle = $this->controller->pageTitle
?: Lang::get($this->getConfig('import[title]', 'Import records')); ?: Lang::get($this->getConfig('import[title]', 'Import records'));
@ -135,6 +135,11 @@ class ImportExportController extends ControllerBehavior
public function export() public function export()
{ {
$this->checkUseListExportMode();
$this->addJs('js/october.export.js', 'core');
$this->addCss('css/export.css', 'core');
$this->controller->pageTitle = $this->controller->pageTitle $this->controller->pageTitle = $this->controller->pageTitle
?: Lang::get($this->getConfig('export[title]', 'Export records')); ?: Lang::get($this->getConfig('export[title]', 'Export records'));
@ -433,7 +438,7 @@ class ImportExportController extends ControllerBehavior
protected function makeExportFormatFormWidget() protected function makeExportFormatFormWidget()
{ {
if (!$this->getConfig('export')) { if (!$this->getConfig('export') || $this->getConfig('export[useList]')) {
return null; return null;
} }
@ -483,6 +488,85 @@ class ImportExportController extends ControllerBehavior
return $result; return $result;
} }
//
// ListController integration
//
protected function checkUseListExportMode()
{
if (!$listDefinition = $this->getConfig('export[useList]')) {
return false;
}
if (!$this->controller->isClassExtendedWith('Backend.Behaviors.ListController')) {
throw new ApplicationException('You must implement the controller behavior ListController with the export "useList" option enabled.');
}
$this->exportFromList($listDefinition);
}
/**
* Outputs the list results as a CSV export.
* @param string $definition
* @param array $options
* @return void
*/
public function exportFromList($definition = null, $options = [])
{
$lists = $this->controller->makeLists();
$widget = isset($lists[$definition])
? $lists[$definition]
: reset($lists);
/*
* Parse options
*/
$defaultOptions = [
'fileName' => $this->exportFileName,
'delimiter' => ',',
'enclosure' => '"'
];
$options = array_merge($defaultOptions, $options);
/*
* Prepare CSV
*/
$csv = CsvWriter::createFromFileObject(new SplTempFileObject);
$csv->setDelimiter($options['delimiter']);
$csv->setEnclosure($options['enclosure']);
/*
* Add headers
*/
$headers = [];
$columns = $widget->getVisibleColumns();
foreach ($columns as $column) {
$headers[] = Lang::get($column->label);
}
$csv->insertOne($headers);
/*
* Add records
*/
$model = $widget->prepareModel();
$results = $model->get();
foreach ($results as $result) {
$record = [];
foreach ($columns as $column) {
$record[] = $widget->getColumnValue($result, $column);
}
$csv->insertOne($record);
}
/*
* Output
*/
$csv->output($options['fileName']);
exit;
}
// //
// Helpers // Helpers
// //