BUGFIX: remove reliance on str_getcsv (it's PHP 5.3 only).

ENHANCEMENT: sort the columns according to the most recent form setup (thanks jonomenz for the query)
ENHANCEMENT: test quotes and commas
This commit is contained in:
Mateusz Uzdowski 2010-10-07 23:06:49 +00:00
parent 14ff7759a7
commit 8d3cb472dc
4 changed files with 53 additions and 20 deletions

1
README
View File

@ -9,6 +9,7 @@ Will Rossiter (Nickname: wrossiter, willr)
Requirements
---------------------
SilverStripe 2.4.0+
PHP 5 >= 5.1.0 (fputcsv)
Documentation
-----------------------------------------------

View File

@ -84,9 +84,25 @@ class SubmittedFormReportField extends FormField {
if($udf) {
$submissions = $udf->Submissions("", "\"ID\"");
// Collect unique columns for use in the CSV.
// Do it separately as we need a fixed number of columns for the file.
// Include all fields that have ever existed in this form.
// Preserve the ordering: the most recent form setup should be dominant.
$inClause = array();
foreach($submissions as $submission) {
$inClause[] = $submission->ID;
}
$csvHeaders = DB::query("SELECT DISTINCT \"Name\" , \"Title\" FROM
((
SELECT \"Name\" , \"Title\" FROM \"SubmittedFormField\"
LEFT JOIN \"SubmittedForm\" ON \"SubmittedForm\".\"ID\" = \"SubmittedFormField\".\"ParentID\" IN (" . implode(',', $inClause) . ")
ORDER BY \"SubmittedFormField\".\"ParentID\" DESC, \"SubmittedFormField\".\"ID\"
) AS \"tmp\")");
if ($csvHeaders) $csvHeaders = $csvHeaders->map();
if($submissions && $submissions->exists()) {
$data = array();
$csvHeaders = array();
// Create CSV rows out of submissions. Fields on those submissions will become columns.
foreach($submissions as $submission) {
@ -94,14 +110,7 @@ class SubmittedFormReportField extends FormField {
$row = array();
foreach($fields as $field) {
// Collect the data
$row[$field->Name] = $field->Value;
// Collect unique columns for use in the CSV - we must have a fixed number of columns, but we want to
// include all fields that have ever existed in this form.
// NOTE: even if the field was used long time ago and only once, it will be included, so expect to see
// some empty columns, especially on heavily-edited UDFs.
$csvHeaders[$field->Name] = $field->Title;
}
$row['Submitted'] = $submission->Created;
@ -122,7 +131,7 @@ class SubmittedFormReportField extends FormField {
// Encode the row
$fp = fopen('php://memory', 'r+');
fputcsv($fp, $csvRowItems, ',', '"');
fputcsv($fp, $csvRowItems);
rewind($fp);
$csvData .= fgets($fp);
fclose($fp);

View File

@ -54,22 +54,27 @@ class SubmittedFormTest extends FunctionalTest {
$data = array();
foreach($exportLines as $line) {
$data[] = str_getcsv($line);
$fp = fopen('php://memory', 'w+');
fputs($fp, $line);
rewind($fp);
$data[] = fgetcsv($fp);
}
// check the headers are fine and include legacy field
// check the headers are fine and include every legacy field. They should also be ordered
// according to the latest form layout.
$this->assertEquals($data[0], array(
'Submitted Title','Submitted Title 2','Submitted'
'First', 'Submitted Title 2', 'Submitted Title', 'Field 2', 'Field 1', 'File', 'Submitted'
));
// check the number of records in the export
$this->assertEquals(count($data), 12);
$this->assertEquals($data[1][0], 'Value 1');
$this->assertEquals($data[1][1], "");
$this->assertEquals($data[2][0], "");
$this->assertEquals($data[1][1], 'quote " and comma , test');
$this->assertEquals($data[1][2], 'Value 1');
$this->assertEquals($data[2][1], 'Value 2');
$this->assertEquals($data[11][0], 'First');
$this->assertEquals($data[11][1], 'Second');
}
function testdeletesubmission() {

View File

@ -60,18 +60,36 @@ SubmittedFormField:
Testing until I cannot
I love my testing
long-submitted-1:
long-submitted-1a:
Name: Submitted Name
Title: Submitted Title
Parent: =>SubmittedForm.long-1
Value: Value 1
long-submitted-1b:
Name: Submitted Name 2
Title: Submitted Title 2
Parent: =>SubmittedForm.long-1
Value: 'quote " and comma , test'
long-submitted-2:
Parent: =>SubmittedForm.long-2
Name: Submitted Name 2
Title: Submitted Title 2
Value: Value 2
long-submitted-11a:
Parent: =>SubmittedForm.long-11
Name: First
Title: First
Value: First
long-submitted-11b:
Parent: =>SubmittedForm.long-11
Name: Submitted Name 2
Title: Submitted Title 2
Value: Second
SubmittedFileField:
submitted-file-1:
Name: File Field