diff --git a/forms/gridfield/GridFieldDetailForm.php b/forms/gridfield/GridFieldDetailForm.php index e10ad184b..53a564870 100755 --- a/forms/gridfield/GridFieldDetailForm.php +++ b/forms/gridfield/GridFieldDetailForm.php @@ -147,6 +147,20 @@ class GridFieldDetailForm implements GridField_URLHandler { return 'GridFieldItemRequest_ItemRequest'; } } + + /** + * @param function $cb Make changes on the edit form after constructing it. + */ + public function setItemEditFormCallback($cb) { + $this->itemEditFormCallback = $cb; + } + + /** + * @return function + */ + public function getItemEditFormCallback() { + return $this->itemEditFormCallback; + } } class GridFieldDetailForm_ItemRequest extends RequestHandler { @@ -296,6 +310,10 @@ class GridFieldDetailForm_ItemRequest extends RequestHandler { // e.g. page/edit/show/6/ vs. page/edit/EditForm/field/MyGridField/.... $form->Backlink = $toplevelController->Link(); } + + $cb = $this->component->getItemEditFormCallback(); + if($cb) $cb($form, $this); + return $form; } diff --git a/tests/forms/gridfield/GridFieldDetailFormTest.php b/tests/forms/gridfield/GridFieldDetailFormTest.php index 6f6b7e5c0..73dc4aea8 100644 --- a/tests/forms/gridfield/GridFieldDetailFormTest.php +++ b/tests/forms/gridfield/GridFieldDetailFormTest.php @@ -133,6 +133,25 @@ class GridFieldDetailFormTest extends FunctionalTest { $component->setItemRequestClass('GridFieldDetailFormTest_ItemRequest'); $this->assertEquals('GridFieldDetailFormTest_ItemRequest', $component->getItemRequestClass()); } + + function testItemEditFormCallback() { + $category = new GridFieldDetailFormTest_Category(); + $component = new GridFieldDetailForm(); + $component->setItemEditFormCallback(function($form, $component) { + $form->Fields()->push(new HiddenField('Callback')); + }); + // Note: A lot of scaffolding to execute the tested logic, + // due to the coupling of form creation with request handling (and its context) + $request = new GridFieldDetailForm_ItemRequest( + GridField::create('Categories', 'Categories'), + $component, + $category, + new Controller(), + 'Form' + ); + $form = $request->ItemEditForm(); + $this->assertNotNull($form->Fields()->fieldByName('Callback')); + } } class GridFieldDetailFormTest_Person extends DataObject implements TestOnly {