MINOR Setting existing GridState from client during request handling to allow altering it there

MINOR Parameter namespacing for GridState to avoid clashes with multiple GridField instances in same form
MINOR GridField->index() to render the field, unify with gridFieldAlterAction() to support state changes
This commit is contained in:
Ingo Schommer 2012-02-09 11:16:29 +01:00
parent 4437f9db4f
commit 47ac047454
2 changed files with 35 additions and 19 deletions

View File

@ -25,6 +25,7 @@ class GridField extends FormField {
* @var array
*/
public static $allowed_actions = array(
'index',
'gridFieldAlterAction'
);
@ -98,8 +99,10 @@ class GridField extends FormField {
$this->addExtraClass('ss-gridfield');
$this->requireDefaultCSS();
}
function index($request) {
return $this->gridFieldAlterAction(array(), $this->getForm(), $request);
}
/**
@ -356,6 +359,7 @@ class GridField extends FormField {
$this->getAttributes(),
array('value' => false, 'type' => false, 'name' => false)
);
$attrs['data-name'] = $this->Name();
$tableAttrs = array(
'id' => isset($this->id) ? $this->id : null,
'class' => "field CompositeField {$this->extraClass()}",
@ -370,6 +374,10 @@ class GridField extends FormField {
);
}
public function getAttributes() {
return array_merge(parent::getAttributes(), array('data-url' => $this->Link()));
}
/**
* Get the columns of this GridField, they are provided by attached GridField_ColumnProvider
*
@ -491,7 +499,7 @@ class GridField extends FormField {
}
}
}
/**
* This is the action that gets executed when a GridField_AlterAction gets clicked.
*
@ -499,25 +507,30 @@ class GridField extends FormField {
* @return string
*/
public function gridFieldAlterAction($data, $form, SS_HTTPRequest $request) {
$id = $data['StateID'];
$stateChange = Session::get($id);
$gridName = $stateChange['grid'];
$grid = $form->Fields()->dataFieldByName($gridName);
$state = $grid->getState(false);
if(isset($data['GridState'])) $state->setValue($data['GridState']);
$actionName = $stateChange['actionName'];
$args = isset($stateChange['args']) ? $stateChange['args'] : array();
$html = $grid->handleAction($actionName, $args, $data);
if($html) {
return $html;
$html = '';
$data = $request->requestVars();
$fieldData = @$data[$this->Name()];
// Update state from client
$state = $this->getState(false);
if(isset($fieldData['GridState'])) $state->setValue($fieldData['GridState']);
// Try to execute alter action
foreach($data as $k => $v) {
if(preg_match('/^action_gridFieldAlterAction\?StateID=(.*)/', $k, $matches)) {
$id = $matches[1];
$stateChange = Session::get($id);
$actionName = $stateChange['actionName'];
$args = isset($stateChange['args']) ? $stateChange['args'] : array();
$html = $this->handleAction($actionName, $args, $data);
// A field can optionally return its own HTML
if($html) return $html;
}
}
switch($request->getHeader('X-Get-Fragment')) {
case 'CurrentField':
return $grid->FieldHolder();
return $this->FieldHolder();
break;
case 'CurrentForm':
@ -565,6 +578,9 @@ class GridField extends FormField {
$this->request = $request;
$this->setModel($model);
$fieldData = $this->request->requestVar($this->Name());
if($fieldData && $fieldData['GridState']) $this->getState(false)->setValue($fieldData['GridState']);
foreach($this->components as $component) {
if(!($component instanceof GridField_URLHandler)) {

View File

@ -39,7 +39,7 @@ class GridState extends HiddenField {
if ($value) $this->setValue($value);
parent::__construct('GridState');
parent::__construct($grid->Name() . '[GridState]');
}
/**