BUG Fix duplication of forms with groups

Fixes #339
This commit is contained in:
Damian Mooyman 2015-09-18 11:56:49 +12:00
parent 4332512fd1
commit acede0d4ab
3 changed files with 57 additions and 0 deletions

View File

@ -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;

View File

@ -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() {

View File

@ -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