Merge pull request #257 from halkyon/gridfield_export

GridFieldExportButton changes to support customisation of which fields to export
This commit is contained in:
Sam Minnée 2012-03-25 02:09:06 -07:00
commit 3f78aab8d8
4 changed files with 72 additions and 20 deletions

View File

@ -115,12 +115,14 @@ abstract class ModelAdmin extends LeftAndMain {
function getEditForm($id = null) { function getEditForm($id = null) {
$list = $this->getList(); $list = $this->getList();
$exportButton = new GridFieldExportButton();
$exportButton->setExportColumns($this->getExportFields());
$listField = Object::create('GridField', $listField = Object::create('GridField',
$this->modelClass, $this->modelClass,
false, false,
$list, $list,
$fieldConfig = GridFieldConfig_RecordEditor::create($this->stat('page_length')) $fieldConfig = GridFieldConfig_RecordEditor::create($this->stat('page_length'))
->addComponent(new GridFieldExportButton()) ->addComponent($exportButton)
->removeComponentsByType('GridFieldFilterHeader') ->removeComponentsByType('GridFieldFilterHeader')
); );
@ -145,6 +147,16 @@ abstract class ModelAdmin extends LeftAndMain {
return $form; return $form;
} }
/**
* Define which fields are used in the {@link getEditForm} GridField export.
* By default, it uses the summary fields from the model definition.
*
* @return array
*/
public function getExportFields() {
return singleton($this->modelClass)->summaryFields();
}
/** /**
* @return SearchContext * @return SearchContext
*/ */

View File

@ -6,6 +6,7 @@ class ModelAdminTest extends FunctionalTest {
protected $extraDataObjects = array( protected $extraDataObjects = array(
'ModelAdminTest_Admin', 'ModelAdminTest_Admin',
'ModelAdminTest_Contact', 'ModelAdminTest_Contact',
'ModelAdminTest_Player'
); );
function testModelAdminOpens() { function testModelAdminOpens() {
@ -14,6 +15,22 @@ class ModelAdminTest extends FunctionalTest {
$this->assertTrue((bool)Permission::check("ADMIN")); $this->assertTrue((bool)Permission::check("ADMIN"));
$this->assertEquals(200, $this->get('ModelAdminTest_Admin')->getStatusCode()); $this->assertEquals(200, $this->get('ModelAdminTest_Admin')->getStatusCode());
} }
function testExportFieldsDefaultIsSummaryFields() {
$admin = new ModelAdminTest_Admin();
$admin->modelClass = 'ModelAdminTest_Contact';
$this->assertEquals($admin->getExportFields(), singleton('ModelAdminTest_Contact')->summaryFields());
}
function testExportFieldsOverloadedMethod() {
$admin = new ModelAdminTest_PlayerAdmin();
$admin->modelClass = 'ModelAdminTest_Player';
$this->assertEquals($admin->getExportFields(), array(
'Name' => 'Name',
'Position' => 'Position'
));
}
} }
class ModelAdminTest_Admin extends ModelAdmin implements TestOnly { class ModelAdminTest_Admin extends ModelAdmin implements TestOnly {
@ -23,10 +40,36 @@ class ModelAdminTest_Admin extends ModelAdmin implements TestOnly {
'ModelAdminTest_Contact', 'ModelAdminTest_Contact',
); );
} }
class ModelAdminTest_PlayerAdmin extends ModelAdmin implements TestOnly {
static $url_segment = 'testadmin';
class ModelAdminTest_Contact extends DataObject implements TestOnly { public static $managed_models = array(
static $db = array( 'ModelAdminTest_Player'
"Name" => "Varchar", );
"Phone" => "Varchar",
public function getExportFields() {
return array(
'Name' => 'Name',
'Position' => 'Position'
);
}
}
class ModelAdminTest_Contact extends DataObject implements TestOnly {
static $db = array(
'Name' => 'Varchar',
'Phone' => 'Varchar',
);
static $summary_fields = array(
'Name' => 'Name',
'Phone' => 'Phone'
);
}
class ModelAdminTest_Player extends DataObject implements TestOnly {
static $db = array(
'Name' => 'Varchar',
'Position' => 'Varchar',
);
static $has_one = array(
'Contact' => 'ModelAdminTest_Contact'
); );
} }

View File

@ -167,26 +167,22 @@ Export is also available, although at the moment only to the CSV format,
through a button at the end of a results list. You can also export search results. through a button at the end of a results list. You can also export search results.
It is handled through the `[api:GridFieldExportButton]` component. It is handled through the `[api:GridFieldExportButton]` component.
To customize the exported columns, override the edit form implementation in your `ModelAdmin`: To customize the exported columns, create a new method called `getExportFields` in your `ModelAdmin`:
:::php :::php
class MyAdmin extends ModelAdmin { class MyAdmin extends ModelAdmin {
// ... // ...
function getEditForm($id = null) { function getExportFields() {
$form = parent::getEditForm($id); return array(
if($this->modelClass == 'Product') {
$grid = $form->Fields()->fieldByName('Product');
$grid->getConfig()->getComponentByType('GridFieldExportButton')
->setExportColumns(array(
// Excludes 'ProductCode' from the export
'Name' => 'Name', 'Name' => 'Name',
'Price' => 'Price' 'ProductCode' => 'Product Code',
)); 'Category.Title' => 'Category'
} );
return $form;
} }
} }
Dot syntax support allows you to select a field on a related `has_one` object.
## Extending existing ModelAdmins ## Extending existing ModelAdmins
Sometimes you'll work with ModelAdmins from other modules, e.g. the product management Sometimes you'll work with ModelAdmins from other modules, e.g. the product management
@ -195,6 +191,7 @@ also another tool at your disposal: The `[api:Extension]` API.
:::php :::php
class MyAdminExtension extends Extension { class MyAdminExtension extends Extension {
// ...
function updateEditForm(&$form) { function updateEditForm(&$form) {
$form->Fields()->push(/* ... */) $form->Fields()->push(/* ... */)
} }

View File

@ -113,7 +113,7 @@ class GridFieldExportButton implements GridField_HTMLProvider, GridField_ActionP
foreach($items as $item) { foreach($items as $item) {
$columnData = array(); $columnData = array();
foreach($csvColumns as $columnSource => $columnHeader) { foreach($csvColumns as $columnSource => $columnHeader) {
$value = $item->$columnSource; $value = $item->relField($columnSource);
$value = str_replace(array("\r", "\n"), "\n", $value); $value = str_replace(array("\r", "\n"), "\n", $value);
$columnData[] = '"' . str_replace('"', '\"', $value) . '"'; $columnData[] = '"' . str_replace('"', '\"', $value) . '"';
} }