diff --git a/forms/gridfield/GridFieldExportButton.php b/forms/gridfield/GridFieldExportButton.php index 9c865b6a1..3243d090a 100644 --- a/forms/gridfield/GridFieldExportButton.php +++ b/forms/gridfield/GridFieldExportButton.php @@ -124,12 +124,12 @@ class GridFieldExportButton implements GridField_HTMLProvider, GridField_ActionP * Generate export fields for CSV. * * @param GridField $gridField - * @return array + * @return string */ public function generateExportFileData($gridField) { - $separator = $this->csvSeparator; + $separator = $this->getCsvSeparator(); $csvColumns = $this->getExportColumnsForGridField($gridField); - $fileData = ''; + $fileData = array(); if($this->csvHasHeader) { $headers = array(); @@ -145,8 +145,7 @@ class GridFieldExportButton implements GridField_HTMLProvider, GridField_ActionP } } - $fileData .= "\"" . implode("\"{$separator}\"", array_values($headers)) . "\""; - $fileData .= "\n"; + $fileData[] = $headers; } //Remove GridFieldPaginator as we're going to export the entire list. @@ -190,11 +189,10 @@ class GridFieldExportButton implements GridField_HTMLProvider, GridField_ActionP ) { $value = "\t" . $value; } - $columnData[] = '"' . str_replace('"', '""', $value) . '"'; + $columnData[] = $value; } - $fileData .= implode($separator, $columnData); - $fileData .= "\n"; + $fileData[] = $columnData; } if($item->hasMethod('destroy')) { @@ -202,7 +200,13 @@ class GridFieldExportButton implements GridField_HTMLProvider, GridField_ActionP } } - return $fileData; + // Convert the $fileData array into csv by capturing fputcsv's output + $csv = fopen('php://temp', 'r+'); + foreach($fileData as $line) { + fputcsv($csv, $line, $separator); + } + rewind($csv); + return stream_get_contents($csv); } /** diff --git a/tests/forms/gridfield/GridFieldExportButtonTest.php b/tests/forms/gridfield/GridFieldExportButtonTest.php index 516a2bc13..f27824322 100644 --- a/tests/forms/gridfield/GridFieldExportButtonTest.php +++ b/tests/forms/gridfield/GridFieldExportButtonTest.php @@ -48,7 +48,9 @@ class GridFieldExportButtonTest extends SapphireTest { $button->setExportColumns(array('Name' => 'My Name')); $this->assertEquals( - "\"My Name\"\n\"Test\"\n\"Test2\"\n", + '"My Name"'."\n". + 'Test'."\n". + 'Test2'."\n", $button->generateExportFileData($this->gridField) ); } @@ -64,7 +66,7 @@ class GridFieldExportButtonTest extends SapphireTest { $button->setExportColumns(array('Name' => 'My Name')); $this->assertEquals( - "\"My Name\"\n\"\t=SUM(1, 2)\"\n\"Test\"\n\"Test2\"\n", + "\"My Name\"\n\"\t=SUM(1, 2)\"\nTest\nTest2\n", $button->generateExportFileData($this->gridField) ); } @@ -79,7 +81,9 @@ class GridFieldExportButtonTest extends SapphireTest { )); $this->assertEquals( - "\"Name\",\"City\"\n\"Test\",\"City city\"\n\"Test2\",\"City2 city\"\n", + 'Name,City'."\n". + 'Test,"City city"'."\n". + 'Test2,"Quoted ""City"" 2 city"'."\n", $button->generateExportFileData($this->gridField) ); } @@ -92,7 +96,9 @@ class GridFieldExportButtonTest extends SapphireTest { )); $this->assertEquals( - "\"Name\",\"strtolower\"\n\"Test\",\"City\"\n\"Test2\",\"City2\"\n", + 'Name,strtolower'."\n". + 'Test,City'."\n". + 'Test2,"Quoted ""City"" 2"'."\n", $button->generateExportFileData($this->gridField) ); } @@ -106,7 +112,8 @@ class GridFieldExportButtonTest extends SapphireTest { $button->setCsvHasHeader(false); $this->assertEquals( - "\"Test\",\"City\"\n\"Test2\",\"City2\"\n", + 'Test,City'."\n". + 'Test2,"Quoted ""City"" 2"'."\n", $button->generateExportFileData($this->gridField) ); } @@ -126,8 +133,23 @@ class GridFieldExportButtonTest extends SapphireTest { $this->gridField->setList($arrayList); $this->assertEquals( - "\"ID\"\n\"1\"\n\"2\"\n\"3\"\n\"4\"\n\"5\"\n\"6\"\n\"7\"\n\"8\"\n" - ."\"9\"\n\"10\"\n\"11\"\n\"12\"\n\"13\"\n\"14\"\n\"15\"\n\"16\"\n", + "ID\n". + "1\n". + "2\n". + "3\n". + "4\n". + "5\n". + "6\n". + "7\n". + "8\n". + "9\n". + "10\n". + "11\n". + "12\n". + "13\n". + "14\n". + "15\n". + "16\n", $button->generateExportFileData($this->gridField) ); } @@ -139,7 +161,7 @@ class GridFieldExportButtonTest extends SapphireTest { )); $this->assertEquals( - "\"Rugby Team Number\"\n\"2\"\n\"0\"\n", + "\"Rugby Team Number\"\n2\n0\n", $button->generateExportFileData($this->gridField) ); } diff --git a/tests/forms/gridfield/GridFieldExportButtonTest.yml b/tests/forms/gridfield/GridFieldExportButtonTest.yml index 27a1ae06b..d336bdddb 100644 --- a/tests/forms/gridfield/GridFieldExportButtonTest.yml +++ b/tests/forms/gridfield/GridFieldExportButtonTest.yml @@ -5,7 +5,7 @@ GridFieldExportButtonTest_Team: RugbyTeamNumber: 2 test-team-2: Name: Test2 - City: City2 + City: 'Quoted "City" 2' RugbyTeamNumber: 0 GridFieldExportButtonTest_NoView: