Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

API CHANGE: Added GridFieldExporter, a GridField component that adds …

…export functionality, and added it to the security admin.
  • Loading branch information...
commit 2d898cab63586caa5d06525658f50d2a61e332c5 1 parent 2485095
@sminnee sminnee authored
View
1  admin/code/SecurityAdmin.php
@@ -108,6 +108,7 @@ public function getEditForm($id = null, $fields = null) {
function RootForm() {
$config = new GridFieldConfig_Base(25);
$config->addComponent(new GridFieldPopupForms($this, 'RootForm'));
+ $config->addComponent(new GridFieldExporter());
$memberList = new GridField('Members', 'All members', DataList::create('Member'), $config);
$fields = new FieldList(
View
95 forms/gridfield/GridFieldExporter.php
@@ -0,0 +1,95 @@
+<?php
+
+/**
+ * Adds an "Export list" button to the bottom of a GridField.
+ *
+ * WARNING: This is experimental and its API is subject to change. Feel free to use it as long as you are happy of
+ * refactoring your code in the future.
+ */
+
+class GridFieldExporter implements GridField_HTMLProvider, GridField_ActionProvider, GridField_URLHandler {
+ protected $exportColumns;
+ protected $csvSeparator = ",";
+ protected $csvHasHeader = true;
+
@chillu Owner
chillu added a note

$csvHasHeader and $csvSeparator didn't have accessors, and the phpdoc was incomplete. Fixed in 5faca9c

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ public function __construct($exportColumns = null) {
+ $this->exportColumns = $exportColumns;
+ }
+
+ /**
+ * Place the export button in a <p> tag below the field
+ */
+ public function getHTMLFragments($gridField) {
+ $button = new GridField_Action($gridField, 'export', 'Export to CSV', 'export', null);
+ return array(
+ 'after' => '<p>' . htmlentities($button->Field()) . '</p>',
+ );
+ }
+
+ /**
+ * export is an action button
+ */
+ public function getActions($gridField) {
+ return array('export');
+ }
+
+ function handleAction(GridField $gridField, $actionName, $arguments, $data) {
+ if($actionName == 'export') {
+ return $this->handleExport($gridField);
+ }
+ }
+
+ /**
+ * it is also a URL
+ */
+ function getURLHandlers($gridField) {
+ return array(
+ 'export' => 'handleExport',
+ );
+ }
+
+ /**
+ * Handle the export, for both the action button and the URL
+ */
+ public function handleExport($gridField, $request = null) {
+ $now = Date("d-m-Y-H-i");
+ $fileName = "export-$now.csv";
+
+ if($fileData = $this->generateExportFileData($gridField)){
+ return SS_HTTPRequest::send_file($fileData, $fileName);
+ }
+ }
+
+ /**
+ * Export core.
+ */
+ function generateExportFileData($gridField) {
+ $separator = $this->csvSeparator;
+ $csvColumns = ($this->exportColumns) ? $this->exportColumns : $gridField->getDisplayFields();
+ $fileData = '';
+ $columnData = array();
+ $fieldItems = new ArrayList();
+
+ if($this->csvHasHeader) {
+ $fileData .= "\"" . implode("\"{$separator}\"", array_values($csvColumns)) . "\"";
+ $fileData .= "\n";
+ }
+
+ $items = $gridField->getList();
+ foreach($items as $item) {
+ $columnData = array();
+ foreach($csvColumns as $columnSource => $columnHeader) {
+ $value = $item->$columnSource;
+ $value = str_replace(array("\r", "\n"), "\n", $value);
+ $columnData[] = '"' . str_replace('"', '\"', $value) . '"';
+ }
+ $fileData .= implode($separator, $columnData);
+ $fileData .= "\n";
+
+ $item->destroy();
+ }
+
+ return $fileData;
+ }
+
+}
View
1  security/Group.php
@@ -64,6 +64,7 @@ public function getCMSFields() {
$config = new GridFieldConfig_ManyManyEditor('FirstName', false, 20);
$config->addComponent(new GridFieldPopupForms(Controller::curr(), 'EditForm'));
+ $config->addComponent(new GridFieldExporter());
$memberList = new GridField('Members','Members', $this->Members(), $config);
// @todo Implement permission checking on GridField
Please sign in to comment.
Something went wrong with that request. Please try again.