diff --git a/code/extensions/UserFormFieldEditorExtension.php b/code/extensions/UserFormFieldEditorExtension.php index f314abe..0fd1e55 100644 --- a/code/extensions/UserFormFieldEditorExtension.php +++ b/code/extensions/UserFormFieldEditorExtension.php @@ -170,6 +170,9 @@ class UserFormFieldEditorExtension extends DataExtension { * @return DataObject */ public function onAfterDuplicate($newPage) { + // List of EditableFieldGroups, where the + // key of the array is the ID of the old end group + $fieldGroups = array(); foreach($this->owner->Fields() as $field) { $newField = $field->duplicate(false); $newField->ParentID = $newPage->ID; @@ -177,6 +180,18 @@ class UserFormFieldEditorExtension extends DataExtension { $newField->Version = 0; $newField->write(); + // If we encounter a group start, record it for later use + if($field instanceof EditableFieldGroup) { + $fieldGroups[$field->EndID] = $newField; + } + + // If we encounter an end group, link it back to the group start + if($field instanceof EditableFieldGroupEnd && isset($fieldGroups[$field->ID])) { + $groupStart = $fieldGroups[$field->ID]; + $groupStart->EndID = $newField->ID; + $groupStart->write(); + } + foreach ($field->DisplayRules() as $customRule) { $newRule = $customRule->duplicate(false); $newRule->ParentID = $newField->ID; diff --git a/tests/UserDefinedFormTest.php b/tests/UserDefinedFormTest.php index b2e2ed4..c418563 100644 --- a/tests/UserDefinedFormTest.php +++ b/tests/UserDefinedFormTest.php @@ -275,6 +275,29 @@ class UserDefinedFormTest extends FunctionalTest { // can't compare object since the dates/ids change $this->assertEquals($form->Fields()->First()->Title, $duplicate->Fields()->First()->Title); + + // Test duplicate with group + $form2 = $this->objFromFixture('UserDefinedForm', 'page-with-group'); + $form2Validator = new UserFormValidator(); + $form2Validator->setForm(new Form(new Controller(), 'Form', new FieldList(), new FieldList())); + $this->assertTrue($form2Validator->php($form2->toMap())); + + // Check field groups exist + $form2GroupStart = $form2->Fields()->filter('ClassName', 'EditableFieldGroup')->first(); + $form2GroupEnd = $form2->Fields()->filter('ClassName', 'EditableFieldGroupEnd')->first(); + $this->assertEquals($form2GroupEnd->ID, $form2GroupStart->EndID); + + // Duplicate this + $form3 = $form2->duplicate(); + $form3Validator = new UserFormValidator(); + $form3Validator->setForm(new Form(new Controller(), 'Form', new FieldList(), new FieldList())); + $this->assertTrue($form3Validator->php($form3->toMap())); + + // Check field groups exist + $form3GroupStart = $form3->Fields()->filter('ClassName', 'EditableFieldGroup')->first(); + $form3GroupEnd = $form3->Fields()->filter('ClassName', 'EditableFieldGroupEnd')->first(); + $this->assertEquals($form3GroupEnd->ID, $form3GroupStart->EndID); + $this->assertNotEquals($form2GroupEnd->ID, $form3GroupStart->EndID); } function testFormOptions() { diff --git a/tests/UserDefinedFormTest.yml b/tests/UserDefinedFormTest.yml index d4efbe1..a69385b 100644 --- a/tests/UserDefinedFormTest.yml +++ b/tests/UserDefinedFormTest.yml @@ -13,6 +13,8 @@ EditableFormStep: Title: 'Step 2' form6step3: Title: 'Step 2' + form7step1: + Title: 'Step 1' EditableOption: option-1: @@ -96,6 +98,9 @@ EditableTextField: field-2: Name: Field2 + some-field: + Name: SomeField + EditableDropdown: basic-dropdown: Name: basic-dropdown @@ -137,6 +142,15 @@ EditableRadioField: Name: radio-option Title: Radio Option Options: =>EditableOption.option-5, =>EditableOption.option-6 + +EditableFieldGroupEnd: + group1end: + Name: group1end + +EditableFieldGroup: + group1start: + Name: group1start + End: =>EditableFieldGroupEnd.group1end UserDefinedForm_EmailRecipientCondition: # filtered recipient 1 @@ -208,6 +222,11 @@ UserDefinedForm: Title: User Defined Form Fields: =>EditableFormStep.form1step1,=>EditableTextField.basic-text EmailRecipients: =>UserDefinedForm_EmailRecipient.recipient-1, =>UserDefinedForm_EmailRecipient.no-html, =>UserDefinedForm_EmailRecipient.no-data + + page-with-group: + Content: 'Page with group' + Title: 'page with group' + Fields: =>EditableFormStep.form7step1, =>EditableFieldGroup.group1start, =>EditableTextField.some-field, =>EditableFieldGroupEnd.group1end form-with-reset-and-custom-action: Title: Form with Reset Action