2011-12-06 01:56:24 +01:00
|
|
|
<?php
|
|
|
|
/**
|
2012-03-05 12:27:25 +01:00
|
|
|
* Encapsulates a collection of components following the {@link GridFieldComponent} interface.
|
|
|
|
* While the {@link GridField} itself has some configuration in the form of setters,
|
|
|
|
* most of the details are dealt with through components.
|
|
|
|
*
|
|
|
|
* For example, you would add a {@link GridFieldPaginator} component to enable
|
|
|
|
* pagination on the listed records, and configure it through {@link GridFieldPaginator->setItemsPerPage()}.
|
|
|
|
*
|
|
|
|
* In order to reduce the amount of custom code required, the framework provides
|
|
|
|
* some default configurations for common use cases:
|
|
|
|
* - {@link GridFieldConfig_Base} (added by default to GridField)
|
|
|
|
* - {@link GridFieldConfig_RecordEditor}
|
|
|
|
* - {@link GridFieldConfig_RelationEditor}
|
2011-12-06 01:56:24 +01:00
|
|
|
*/
|
|
|
|
class GridFieldConfig {
|
|
|
|
/**
|
|
|
|
*
|
2012-08-19 16:01:09 +02:00
|
|
|
* @var ArrayList
|
2011-12-06 01:56:24 +01:00
|
|
|
*/
|
2012-08-19 16:01:09 +02:00
|
|
|
protected $components = null;
|
2011-12-06 01:56:24 +01:00
|
|
|
|
|
|
|
/**
|
2012-08-19 16:01:09 +02:00
|
|
|
* @param mixed $arguments,... arguments to pass to the constructor
|
|
|
|
* @return GridFieldConfig
|
2011-12-06 01:56:24 +01:00
|
|
|
*/
|
2012-08-19 16:01:09 +02:00
|
|
|
public static function create() {
|
|
|
|
return call_user_func_array('Object::create', array_merge(
|
|
|
|
array(get_called_class()),
|
|
|
|
func_get_args()
|
|
|
|
));
|
|
|
|
}
|
2011-12-06 01:56:24 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
public function __construct() {
|
2012-01-30 15:47:22 +01:00
|
|
|
$this->components = new ArrayList();
|
2011-12-06 01:56:24 +01:00
|
|
|
}
|
|
|
|
|
2012-02-21 22:06:41 +01:00
|
|
|
/**
|
|
|
|
* @param GridFieldComponent $component
|
2012-05-18 03:36:52 +02:00
|
|
|
* @param string $insertBefore The class of the component to insert this one before
|
2012-02-21 22:06:41 +01:00
|
|
|
*/
|
2012-05-18 03:36:52 +02:00
|
|
|
public function addComponent(GridFieldComponent $component, $insertBefore = null) {
|
|
|
|
if($insertBefore) {
|
|
|
|
$existingItems = $this->getComponents();
|
|
|
|
$this->components = new ArrayList;
|
|
|
|
$inserted = false;
|
|
|
|
foreach($existingItems as $existingItem) {
|
|
|
|
if(!$inserted && $existingItem instanceof $insertBefore) {
|
|
|
|
$this->components->push($component);
|
|
|
|
$inserted = true;
|
|
|
|
}
|
|
|
|
$this->components->push($existingItem);
|
|
|
|
}
|
|
|
|
if(!$inserted) $this->components->push($component);
|
|
|
|
} else {
|
|
|
|
$this->getComponents()->push($component);
|
|
|
|
}
|
2011-12-06 01:56:24 +01:00
|
|
|
return $this;
|
|
|
|
}
|
2012-02-21 22:06:41 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @param GridFieldComponent One or more components
|
|
|
|
*/
|
|
|
|
public function addComponents() {
|
|
|
|
$components = func_get_args();
|
|
|
|
foreach($components as $component) $this->addComponent($component);
|
|
|
|
return $this;
|
2012-03-08 08:00:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param GridFieldComponent $component
|
|
|
|
* @return GridFieldConfig $this
|
|
|
|
*/
|
|
|
|
public function removeComponent(GridFieldComponent $component) {
|
|
|
|
$this->getComponents()->remove($component);
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param String Class name or interface
|
|
|
|
* @return GridFieldConfig $this
|
|
|
|
*/
|
|
|
|
public function removeComponentsByType($type) {
|
|
|
|
$components = $this->getComponentsByType($type);
|
|
|
|
foreach($components as $component) {
|
|
|
|
$this->removeComponent($component);
|
|
|
|
}
|
|
|
|
return $this;
|
2012-02-21 22:06:41 +01:00
|
|
|
}
|
2011-12-06 01:56:24 +01:00
|
|
|
|
|
|
|
/**
|
2012-01-30 15:47:22 +01:00
|
|
|
* @return ArrayList Of GridFieldComponent
|
2011-12-06 01:56:24 +01:00
|
|
|
*/
|
|
|
|
public function getComponents() {
|
|
|
|
if(!$this->components) {
|
|
|
|
$this->components = new ArrayList();
|
|
|
|
}
|
|
|
|
return $this->components;
|
|
|
|
}
|
2012-01-30 15:47:22 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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;
|
|
|
|
}
|
|
|
|
}
|
2012-01-24 00:36:25 +01:00
|
|
|
}
|
|
|
|
|
2012-03-05 12:27:25 +01:00
|
|
|
/**
|
|
|
|
* A simple readonly, paginated view of records,
|
|
|
|
* with sortable and searchable headers.
|
|
|
|
*/
|
2012-01-24 00:36:25 +01:00
|
|
|
class GridFieldConfig_Base extends GridFieldConfig {
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param int $itemsPerPage - How many items per page should show up
|
|
|
|
*/
|
2012-03-05 13:30:07 +01:00
|
|
|
public function __construct($itemsPerPage=null) {
|
2012-03-09 00:54:02 +01:00
|
|
|
$this->addComponent(new GridFieldToolbarHeader());
|
2012-03-09 02:32:16 +01:00
|
|
|
$this->addComponent($sort = new GridFieldSortableHeader());
|
|
|
|
$this->addComponent($filter = new GridFieldFilterHeader());
|
2012-03-09 02:07:40 +01:00
|
|
|
$this->addComponent(new GridFieldDataColumns());
|
2012-09-25 05:55:59 +02:00
|
|
|
$this->addComponent(new GridFieldPageCount('toolbar-header-right'));
|
2012-03-09 02:32:16 +01:00
|
|
|
$this->addComponent($pagination = new GridFieldPaginator($itemsPerPage));
|
|
|
|
|
2012-03-10 02:44:12 +01:00
|
|
|
$sort->setThrowExceptionOnBadDataType(false);
|
|
|
|
$filter->setThrowExceptionOnBadDataType(false);
|
|
|
|
$pagination->setThrowExceptionOnBadDataType(false);
|
2011-12-06 01:56:24 +01:00
|
|
|
}
|
2012-01-24 00:36:25 +01:00
|
|
|
}
|
|
|
|
|
2012-05-11 09:44:39 +02:00
|
|
|
/**
|
|
|
|
* Allows viewing readonly details of individual records.
|
|
|
|
*/
|
|
|
|
class GridFieldConfig_RecordViewer extends GridFieldConfig_Base {
|
|
|
|
|
|
|
|
public function __construct($itemsPerPage = null) {
|
|
|
|
parent::__construct($itemsPerPage);
|
|
|
|
|
|
|
|
$this->addComponent(new GridFieldViewButton());
|
|
|
|
$this->addComponent(new GridFieldDetailForm());
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2012-01-24 00:36:25 +01:00
|
|
|
/**
|
|
|
|
*
|
2012-03-05 12:14:24 +01:00
|
|
|
*/
|
|
|
|
class GridFieldConfig_RecordEditor extends GridFieldConfig {
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param int $itemsPerPage - How many items per page should show up
|
|
|
|
*/
|
2012-03-05 13:30:07 +01:00
|
|
|
public function __construct($itemsPerPage=null) {
|
2012-05-17 03:22:24 +02:00
|
|
|
|
2012-05-21 04:41:46 +02:00
|
|
|
$this->addComponent(new GridFieldButtonRow('before'));
|
|
|
|
$this->addComponent(new GridFieldAddNewButton('buttons-before-left'));
|
|
|
|
$this->addComponent(new GridFieldToolbarHeader());
|
2012-03-09 02:32:16 +01:00
|
|
|
$this->addComponent($sort = new GridFieldSortableHeader());
|
|
|
|
$this->addComponent($filter = new GridFieldFilterHeader());
|
2012-03-09 02:07:40 +01:00
|
|
|
$this->addComponent(new GridFieldDataColumns());
|
2012-03-09 00:54:02 +01:00
|
|
|
$this->addComponent(new GridFieldEditButton());
|
2012-03-06 12:57:16 +01:00
|
|
|
$this->addComponent(new GridFieldDeleteAction());
|
2012-09-25 05:55:59 +02:00
|
|
|
$this->addComponent(new GridFieldPageCount('toolbar-header-right'));
|
2012-03-09 02:32:16 +01:00
|
|
|
$this->addComponent($pagination = new GridFieldPaginator($itemsPerPage));
|
2012-03-09 00:54:02 +01:00
|
|
|
$this->addComponent(new GridFieldDetailForm());
|
2012-03-09 02:32:16 +01:00
|
|
|
|
2012-03-10 02:44:12 +01:00
|
|
|
$sort->setThrowExceptionOnBadDataType(false);
|
|
|
|
$filter->setThrowExceptionOnBadDataType(false);
|
|
|
|
$pagination->setThrowExceptionOnBadDataType(false);
|
2012-03-05 12:14:24 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Similar to {@link GridFieldConfig_RecordEditor}, but adds features
|
|
|
|
* to work on has-many or many-many relationships.
|
|
|
|
* Allows to search for existing records to add to the relationship,
|
|
|
|
* detach listed records from the relationship (rather than removing them from the database),
|
|
|
|
* and automatically add newly created records to it.
|
2012-01-24 00:36:25 +01:00
|
|
|
*
|
2012-03-05 12:14:24 +01:00
|
|
|
* To further configure the field, use {@link getComponentByType()},
|
|
|
|
* for example to change the field to search.
|
|
|
|
* <code>
|
|
|
|
* GridFieldConfig_RelationEditor::create()
|
2012-03-09 00:54:02 +01:00
|
|
|
* ->getComponentByType('GridFieldAddExistingAutocompleter')->setSearchFields('MyField');
|
2012-03-05 12:14:24 +01:00
|
|
|
* </code>
|
2012-01-24 00:36:25 +01:00
|
|
|
*/
|
2012-03-05 12:14:24 +01:00
|
|
|
class GridFieldConfig_RelationEditor extends GridFieldConfig {
|
2012-01-24 00:36:25 +01:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param int $itemsPerPage - How many items per page should show up
|
|
|
|
*/
|
2012-03-05 13:30:07 +01:00
|
|
|
public function __construct($itemsPerPage=null) {
|
2012-05-21 04:41:46 +02:00
|
|
|
|
|
|
|
$this->addComponent(new GridFieldButtonRow('before'));
|
|
|
|
$this->addComponent(new GridFieldAddNewButton('buttons-before-left'));
|
|
|
|
$this->addComponent(new GridFieldAddExistingAutocompleter('buttons-before-left'));
|
2012-03-09 00:54:02 +01:00
|
|
|
$this->addComponent(new GridFieldToolbarHeader());
|
2012-03-09 02:32:16 +01:00
|
|
|
$this->addComponent($sort = new GridFieldSortableHeader());
|
|
|
|
$this->addComponent($filter = new GridFieldFilterHeader());
|
2012-03-09 02:07:40 +01:00
|
|
|
$this->addComponent(new GridFieldDataColumns());
|
2012-03-09 00:54:02 +01:00
|
|
|
$this->addComponent(new GridFieldEditButton());
|
2012-03-09 02:32:16 +01:00
|
|
|
$this->addComponent(new GridFieldDeleteAction());
|
2012-09-25 05:55:59 +02:00
|
|
|
$this->addComponent(new GridFieldPageCount('toolbar-header-right'));
|
2012-03-09 02:32:16 +01:00
|
|
|
$this->addComponent($pagination = new GridFieldPaginator($itemsPerPage));
|
2012-03-09 00:54:02 +01:00
|
|
|
$this->addComponent(new GridFieldDetailForm());
|
2012-03-09 02:32:16 +01:00
|
|
|
|
2012-03-10 02:44:12 +01:00
|
|
|
$sort->setThrowExceptionOnBadDataType(false);
|
|
|
|
$filter->setThrowExceptionOnBadDataType(false);
|
|
|
|
$pagination->setThrowExceptionOnBadDataType(false);
|
2011-12-06 01:56:24 +01:00
|
|
|
}
|
|
|
|
}
|