diff --git a/src/Forms/GridField/GridField.php b/src/Forms/GridField/GridField.php index dc9ddec8da0..531a57f52a8 100644 --- a/src/Forms/GridField/GridField.php +++ b/src/Forms/GridField/GridField.php @@ -156,8 +156,6 @@ public function __construct($name, $title = null, SS_List $dataList = null, Grid $this->setConfig($config); - $this->state = new GridState($this); - $this->addExtraClass('grid-field'); } @@ -407,6 +405,11 @@ public function getManipulatedList() */ public function getState($getData = true) { + // Initialise state on first call. This ensures it's evaluated after components have been added + if (!$this->state) { + $this->initState(); + } + if ($getData) { return $this->state->getData(); } @@ -414,6 +417,19 @@ public function getState($getData = true) return $this->state; } + private function initState() + { + $this->state = new GridState($this); + + $data = $this->state->getData(); + + foreach ($this->getComponents() as $item) { + if ($item instanceof GridField_StateProvider) { + $item->initDefaultState($data); + } + } + } + /** * Returns the whole gridfield rendered with all the attached components. * diff --git a/src/Forms/GridField/GridFieldPaginator.php b/src/Forms/GridField/GridFieldPaginator.php index ee852d8f2cf..a752329b21c 100755 --- a/src/Forms/GridField/GridFieldPaginator.php +++ b/src/Forms/GridField/GridFieldPaginator.php @@ -140,14 +140,15 @@ public function handleAction(GridField $gridField, $actionName, $arguments, $dat */ protected function getGridPagerState(GridField $gridField) { - $state = $gridField->State->GridFieldPaginator; + return $gridField->State->GridFieldPaginator; + } - $state->initDefaults([ + public function initDefaultSate(GridState_Data $data) + { + $data->GridFieldPaginator->initDefaults([ 'currentPage' => 1, 'itemsPerPage' => $this->getItemsPerPage() ]); - - return $state; } /** diff --git a/src/Forms/GridField/GridFieldSortableHeader.php b/src/Forms/GridField/GridFieldSortableHeader.php index ae316a2e92d..972e1c2adef 100644 --- a/src/Forms/GridField/GridFieldSortableHeader.php +++ b/src/Forms/GridField/GridFieldSortableHeader.php @@ -18,7 +18,7 @@ * * @see GridField */ -class GridFieldSortableHeader implements GridField_HTMLProvider, GridField_DataManipulator, GridField_ActionProvider +class GridFieldSortableHeader implements GridField_HTMLProvider, GridField_DataManipulator, GridField_ActionProvider, GridField_StateProvider { /** @@ -281,9 +281,11 @@ public function getManipulatedData(GridField $gridField, SS_List $dataList) */ private function getState(GridField $gridField): GridState_Data { - $state = $gridField->State->GridFieldSortableHeader; - $state->initDefaults(['SortColumn' => null, 'SortDirection' => 'asc']); + return $gridField->State->GridFieldSortableHeader; + } - return $state; + public function initDefaultState(GridState_Data $data): void + { + $data->initDefaults(['SortColumn' => null, 'SortDirection' => 'asc']); } } diff --git a/src/Forms/GridField/GridField_StateProvider.php b/src/Forms/GridField/GridField_StateProvider.php new file mode 100644 index 00000000000..74cf03bf15d --- /dev/null +++ b/src/Forms/GridField/GridField_StateProvider.php @@ -0,0 +1,21 @@ +initDefaults() to do this. + * + * @param $data The top-level sate object + */ + public function initDefaultState(GridState_Data $data): void; +}