silverstripe-gridfieldexten.../code/GridFieldRequestHandler.php
2013-07-11 12:40:13 +10:00

152 lines
2.9 KiB
PHP

<?php
/**
* A base utility class for request handlers which present a grid field detail
* view.
*
* This class provides some useful defaults for grid field detail views, such
* as tabs, breadcrumbs and a back link. Much of this code is extracted from the
* detail form.
*/
abstract class GridFieldRequestHandler extends RequestHandler {
private static $allowed_actions = array(
'Form'
);
/**
* @var GridField
*/
protected $grid;
/**
* @var GridFieldComponent
*/
protected $component;
/**
* @var string
*/
protected $name;
/**
* @var string
*/
protected $template = __CLASS__;
public function __construct(GridField $grid, GridFieldComponent $component, $name) {
$this->grid = $grid;
$this->component = $component;
$this->name = $name;
parent::__construct();
}
public function index($request) {
$result = $this->renderWith($this->template);
if($request->isAjax()) {
return $result;
} else {
return $this->getTopLevelController()->customise(array(
'Content' => $result
));
}
}
public function Link($action = null) {
return Controller::join_links($this->grid->Link(), $this->name, $action);
}
/**
* This method should be overloaded to build out the detail form.
*
* @return Form
*/
public function Form() {
$form = new Form(
$this,
'Form',
new FieldList($root = new TabSet('Root', new Tab('Main'))),
new FieldList()
);
if($this->getTopLevelController() instanceof LeftAndMain) {
$form->setTemplate('LeftAndMain_EditForm');
$form->addExtraClass('cms-content cms-edit-form cms-tabset center');
$form->setAttribute('data-pjax-fragment', 'CurrentForm Content');
$root->setTemplate('CMSTabSet');
$form->Backlink = $this->getBackLink();
}
return $form;
}
/**
* @return Controller
*/
public function getController() {
return $this->grid->getForm()->getController();
}
/**
* @param string $template
*/
public function setTemplate($template) {
$this->template = $template;
}
/**
* @return string
*/
public function getTemplate() {
return $this->template;
}
/**
* @return ArrayList
*/
public function getBreadcrumbs() {
$controller = $this->getController();
if($controller->hasMethod('Breadcrumbs')) {
return $controller->Breadcrumbs();
} else {
return new ArrayList();
}
}
/**
* @return string
*/
protected function getBackLink() {
$controller = $this->getTopLevelController();
if($controller->hasMethod('Backlink')) {
return $controller->Backlink();
} else {
return $controller->Link();
}
}
/**
* @return Controller
*/
protected function getTopLevelController() {
$controller = $this->getController();
while($controller) {
if($controller instanceof GridFieldRequestHandler) {
$controller = $controller->getController();
} elseif($controller instanceof GridFieldDetailForm_ItemRequest) {
$controller = $controller->getController();
} else {
break;
}
}
return $controller;
}
}