From e2ea63f57b59ba9e9e7db52b9d801e4f8caf22ac Mon Sep 17 00:00:00 2001 From: eileen <emcnaughton@wikimedia.org> Date: Tue, 8 Oct 2019 09:33:26 +0200 Subject: [PATCH] Still output csv file, even if no rows are in it --- CRM/Export/BAO/ExportProcessor.php | 39 ++++++++++++++++----- tests/phpunit/CRM/Export/BAO/ExportTest.php | 25 +++++++++++++ 2 files changed, 56 insertions(+), 8 deletions(-) diff --git a/CRM/Export/BAO/ExportProcessor.php b/CRM/Export/BAO/ExportProcessor.php index 7d311aa7df..a9e02220fa 100644 --- a/CRM/Export/BAO/ExportProcessor.php +++ b/CRM/Export/BAO/ExportProcessor.php @@ -2376,6 +2376,7 @@ WHERE id IN ( $deleteIDString ) $query = "SELECT * FROM $exportTempTable"; + $this->instantiateTempTable($headerRows); while (1) { $limitQuery = $query . " LIMIT $offset, $limit @@ -2395,16 +2396,38 @@ LIMIT $offset, $limit } $componentDetails[] = $row; } - CRM_Core_Report_Excel::writeCSVFile($this->getExportFileName(), - $headerRows, - $componentDetails, - NULL, - $writeHeader - ); - - $writeHeader = FALSE; + $this->writeRows($headerRows, $componentDetails); + $offset += $limit; } } + /** + * Set up the temp table. + * + * @param array $headerRows + */ + protected function instantiateTempTable(array $headerRows) { + CRM_Utils_System::download(CRM_Utils_String::munge($this->getExportFileName()), + 'text/x-csv', + CRM_Core_DAO::$_nullObject, + 'csv', + FALSE + ); + CRM_Core_Report_Excel::makeCSVTable($headerRows, [], NULL, TRUE, TRUE); + } + + /** + * @param array $headerRows + * @param array $componentDetails + */ + protected function writeRows(array $headerRows, array $componentDetails) { + CRM_Core_Report_Excel::writeCSVFile($this->getExportFileName(), + $headerRows, + $componentDetails, + NULL, + FALSE + ); + } + } diff --git a/tests/phpunit/CRM/Export/BAO/ExportTest.php b/tests/phpunit/CRM/Export/BAO/ExportTest.php index 537ed560bb..03947d2e1b 100644 --- a/tests/phpunit/CRM/Export/BAO/ExportTest.php +++ b/tests/phpunit/CRM/Export/BAO/ExportTest.php @@ -1178,6 +1178,31 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase { $this->assertCount(2, $this->csv); } + /** + * Test exporting when no rows are retrieved. + * + * @throws \CRM_Core_Exception + * @throws \League\Csv\Exception + */ + public function testExportNoRows() { + $contactA = $this->callAPISuccess('contact', 'create', [ + 'first_name' => 'John', + 'last_name' => 'Doe', + 'contact_type' => 'Individual', + ]); + $this->doExportTest([ + 'selectAll' => TRUE, + 'ids' => [$contactA['id']], + 'exportParams' => [ + 'postal_mailing_export' => [ + 'postal_mailing_export' => TRUE, + ], + 'mergeSameAddress' => TRUE, + ], + ]); + $this->assertEquals('Contact ID', $this->csv->getHeader()[0]); + } + /** * Test that deceased and do not mail contacts are removed from contacts before * -- 2.25.1