mirror of
https://github.com/silverstripe/silverstripe-userforms.git
synced 2024-10-22 17:05:42 +02:00
ENHANCEMENT Added CSV export functionality to the userforms module
This commit is contained in:
parent
1bb12dce72
commit
74d69a30fe
@ -5,15 +5,11 @@
|
||||
* @subpackage pagetypes
|
||||
*/
|
||||
class UserDefinedForm extends Page {
|
||||
|
||||
static $add_action = "a contact form";
|
||||
|
||||
static $icon = "cms/images/treeicons/task";
|
||||
|
||||
// a list of groups that are permitted to create pages of this type.
|
||||
/*static $can_create = array(
|
||||
'Administrators'
|
||||
);*/
|
||||
|
||||
static $need_permission = 'ADMIN';
|
||||
|
||||
static $db = array(
|
||||
@ -137,7 +133,7 @@ class UserDefinedForm extends Page {
|
||||
public function customFormActions( $isReadonly = false ) {
|
||||
return new FieldSet( new TextField( "SubmitButtonText", _t('UserDefinedForm.TEXTONSUBMIT', 'Text on submit button:'), $this->SubmitButtonText ) );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Duplicate this UserDefinedForm page, and its form fields.
|
||||
* Submissions, on the other hand, won't be duplicated.
|
||||
@ -167,6 +163,97 @@ class UserDefinedForm_Controller extends Page_Controller {
|
||||
parent::init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Export each of the form submissions for this UserDefinedForm
|
||||
* instance into a CSV file.
|
||||
*
|
||||
* In order to run this export function, the user must be
|
||||
* able to edit the page, so we check canEdit()
|
||||
*/
|
||||
function export() {
|
||||
if(!$this->canEdit()) return false;
|
||||
|
||||
$now = Date("Y-m-d_h.i.s");
|
||||
$fileName = "export-$now.csv";
|
||||
$separator = ",";
|
||||
|
||||
// Get the UserDefinedForm to export data from the URL
|
||||
$SQL_ID = Convert::raw2sql(Director::urlParam('ID'));
|
||||
|
||||
if($SQL_ID) {
|
||||
$udf = DataObject::get_by_id("UserDefinedForm", $SQL_ID);
|
||||
if($udf) {
|
||||
$submissions = $udf->Submissions();
|
||||
if($submissions && $submissions->Count() > 0) {
|
||||
|
||||
// Get all the submission IDs (so we know what names/titles to get - helps for sites with many UDF's)
|
||||
$inClause = array();
|
||||
foreach($submissions as $submission) {
|
||||
$inClause[] = $submission->ID;
|
||||
}
|
||||
|
||||
// Get the CSV header rows from the database
|
||||
$tmp = DB::query("SELECT DISTINCT Name, Title FROM SubmittedFormField LEFT JOIN SubmittedForm ON SubmittedForm.ID = SubmittedFormField.ParentID WHERE SubmittedFormField.ParentID IN (" . implode(',', $inClause) . ")");
|
||||
|
||||
// Sort the Names and Titles from the database query into separate keyed arrays
|
||||
foreach($tmp as $array) {
|
||||
$csvHeaderNames[] = $array['Name'];
|
||||
$csvHeaderTitle[] = $array['Title'];
|
||||
}
|
||||
|
||||
// For every submission...
|
||||
$i = 0;
|
||||
foreach($submissions as $submission) {
|
||||
|
||||
// Get the rows for this submission (One row = one form field)
|
||||
$dataRow = $submission->FieldValues();
|
||||
$rows[$i] = array();
|
||||
|
||||
// For every row/field, get all the columns
|
||||
foreach($dataRow as $column) {
|
||||
|
||||
// If the Name of this field is in the $csvHeaderNames array, get an array of all the places it exists
|
||||
if($index = array_keys($csvHeaderNames, $column->Name)) {
|
||||
if(is_array($index)) {
|
||||
|
||||
// Set the final output array for each index that we want to insert this value into
|
||||
foreach($index as $idx) {
|
||||
$rows[$i][$idx] = $column->Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$i++;
|
||||
}
|
||||
|
||||
// CSV header row
|
||||
$csvData = '"' . implode('","', $csvHeaderTitle) . '"' . "\n";
|
||||
|
||||
// For every row of data (one form submission = one row)
|
||||
foreach($rows as $row) {
|
||||
|
||||
// Loop over all the names we can use
|
||||
for($i=0;$i<count($csvHeaderNames);$i++) {
|
||||
if(!$row[$i]) $csvData .= '"",'; // If there is no data for this column, output it as blank instead
|
||||
else $csvData .= '"'.$row[$i].'",'; // Otherwise, output the value for this column
|
||||
}
|
||||
// Start a new row for each submission
|
||||
$csvData .= "\n";
|
||||
}
|
||||
} else {
|
||||
user_error("No submissions to export.", E_USER_ERROR);
|
||||
}
|
||||
|
||||
HTTP::sendFileToBrowser($csvData, $fileName);
|
||||
} else {
|
||||
user_error("'$SQL_ID' is a valid type, but we can't find a UserDefinedForm in the database that matches the ID.", E_USER_ERROR);
|
||||
}
|
||||
} else {
|
||||
user_error("'$SQL_ID' is not a valid UserDefinedForm ID.", E_USER_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
function Form() {
|
||||
// Build fields
|
||||
$fields = new FieldSet();
|
||||
|
@ -5,14 +5,6 @@
|
||||
*/
|
||||
class SubmittedFormReportField extends FormField {
|
||||
|
||||
/**
|
||||
* Displays the form (without defaults) submitted as it appears on the front of the site
|
||||
* Users will use this instance of the form to filter results
|
||||
*/
|
||||
function Form() {
|
||||
/*return $this->form->Form();*/
|
||||
}
|
||||
|
||||
function Field() {
|
||||
Requirements::css(SAPPHIRE_DIR . "/css/SubmittedFormReportField.css");
|
||||
|
||||
@ -22,5 +14,12 @@ class SubmittedFormReportField extends FormField {
|
||||
function Submissions() {
|
||||
return $this->form->getRecord()->Submissions();
|
||||
}
|
||||
|
||||
function ExportLink() {
|
||||
if($this->Submissions() && $this->Submissions()->Count() > 0) {
|
||||
return $this->form->getRecord()->Link() . 'export/' . $this->form->getRecord()->ID;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
@ -2,6 +2,11 @@
|
||||
$FilterForm
|
||||
</div>
|
||||
<div class="reports" id="FormSubmissions">
|
||||
|
||||
<% if ExportLink %>
|
||||
<a href="$ExportLink" title="Export CSV file"><strong><% _t('EXPORTSUBMISSIONS', 'Export submissions to CSV') %></strong></a>
|
||||
<% end_if %>
|
||||
|
||||
<% control Submissions %>
|
||||
<div class="report">
|
||||
<span class="submitted"><% _t('SUBMITTED', 'Submitted at') %> $Created.Nice <% if Recipient %>to $Recipient<% end_if %></span>
|
||||
|
Loading…
Reference in New Issue
Block a user