Merge pull request #173 from chillu/gridfield-config-getcomponents

GridFieldConfig->getComponentsByType() and "default config" change
This commit is contained in:
Stig Lindqvist 2012-01-30 19:29:23 -08:00
commit c2c0e1b4b6
3 changed files with 106 additions and 19 deletions

View File

@ -87,7 +87,7 @@ class GridField extends FormField {
} }
if(!$config) { if(!$config) {
$this->config = $this->getDefaultConfig(); $this->config = GridFieldConfig_Base::create();
} else { } else {
$this->config = $config; $this->config = $config;
} }
@ -142,20 +142,6 @@ class GridField extends FormField {
return $this; return $this;
} }
/**
* Get a default configuration for this GridField
*
* @return GridFieldConfig
*/
protected function getDefaultConfig() {
$config = GridFieldConfig::create();
$config->addComponent(new GridFieldSortableHeader());
$config->addComponent(new GridFieldFilter());
$config->addComponent(new GridFieldDefaultColumns());
$config->addComponent(new GridFieldPaginator());
return $config;
}
/** /**
* Require the default css styling * Require the default css styling
*/ */

View File

@ -23,7 +23,7 @@ class GridFieldConfig {
* *
*/ */
public function __construct() { public function __construct() {
; $this->components = new ArrayList();
} }
public function addComponent(GridFieldComponent $component) { public function addComponent(GridFieldComponent $component) {
@ -32,8 +32,7 @@ class GridFieldConfig {
} }
/** /**
* * @return ArrayList Of GridFieldComponent
* @return ArrayList
*/ */
public function getComponents() { public function getComponents() {
if(!$this->components) { if(!$this->components) {
@ -41,6 +40,32 @@ class GridFieldConfig {
} }
return $this->components; return $this->components;
} }
/**
* Returns all components extending a certain class, or implementing a certain interface.
*
* @param String Class name or interface
* @return ArrayList Of GridFieldComponent
*/
public function getComponentsByType($type) {
$components = new ArrayList();
foreach($this->components as $component) {
if($component instanceof $type) $components->push($component);
}
return $components;
}
/**
* Returns the first available component with the given class or interface.
*
* @param String ClassName
* @return GridFieldComponent
*/
public function getComponentByType($type) {
foreach($this->components as $component) {
if($component instanceof $type) return $component;
}
}
} }
class GridFieldConfig_Base extends GridFieldConfig { class GridFieldConfig_Base extends GridFieldConfig {
@ -60,8 +85,8 @@ class GridFieldConfig_Base extends GridFieldConfig {
*/ */
public function __construct($itemsPerPage=25) { public function __construct($itemsPerPage=25) {
$this->addComponent(new GridFieldSortableHeader()); $this->addComponent(new GridFieldSortableHeader());
$this->addComponent(new GridFieldFilter());
$this->addComponent(new GridFieldDefaultColumns()); $this->addComponent(new GridFieldDefaultColumns());
$this->addComponent(new GridFieldAction_Edit());
$this->addComponent(new GridFieldPaginator($itemsPerPage)); $this->addComponent(new GridFieldPaginator($itemsPerPage));
} }
} }

View File

@ -0,0 +1,76 @@
<?php
/**
* @package sapphire
* @subpackage tests
*/
class GridFieldConfigTest extends SapphireTest {
function testGetComponents() {
$config = GridFieldConfig::create();
$this->assertType('ArrayList', $config->getComponents());
$this->assertEquals($config->getComponents()->Count(), 0);
$config
->addComponent($c1 = new GridFieldConfigTest_MyComponent())
->addComponent($c2 = new GridFieldConfigTest_MyOtherComponent())
->addComponent($c3 = new GridFieldConfigTest_MyOtherComponent());
$this->assertEquals(
new ArrayList(array($c1, $c2, $c3)),
$config->getComponents()
);
}
function testGetComponentsByType() {
$config = GridFieldConfig::create()
->addComponent($c1 = new GridFieldConfigTest_MyComponent())
->addComponent($c2 = new GridFieldConfigTest_MyOtherComponent())
->addComponent($c3 = new GridFieldConfigTest_MyOtherComponent());
$this->assertEquals(
new ArrayList(array($c1)),
$config->getComponentsByType('GridFieldConfigTest_MyComponent')
);
$this->assertEquals(
new ArrayList(array($c2, $c3)),
$config->getComponentsByType('GridFieldConfigTest_MyOtherComponent')
);
$this->assertEquals(
new ArrayList(array($c1, $c2, $c3)),
$config->getComponentsByType('GridField_URLHandler')
);
$this->assertEquals(
new ArrayList(),
$config->getComponentsByType('GridFieldConfigTest_UnknownComponent')
);
}
function testGetComponentByType() {
$config = GridFieldConfig::create()
->addComponent($c1 = new GridFieldConfigTest_MyComponent())
->addComponent($c2 = new GridFieldConfigTest_MyOtherComponent())
->addComponent($c3 = new GridFieldConfigTest_MyOtherComponent());
$this->assertEquals(
$c1,
$config->getComponentByType('GridFieldConfigTest_MyComponent')
);
$this->assertEquals(
$c2,
$config->getComponentByType('GridFieldConfigTest_MyOtherComponent')
);
$this->assertNull(
$config->getComponentByType('GridFieldConfigTest_UnknownComponent')
);
}
}
class GridFieldConfigTest_MyComponent implements GridField_URLHandler, TestOnly {
function getURLHandlers($gridField) {return array();}
}
class GridFieldConfigTest_MyOtherComponent implements GridField_URLHandler, TestOnly {
function getURLHandlers($gridField) {return array();}
}