diff --git a/.travis.yml b/.travis.yml index 6367e79..4f1409f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,9 @@ before_script: script: - vendor/bin/phpunit --coverage-clover coverage.clover userforms/tests + +after_script: + - mv coverage.clover ~/build/$TRAVIS_REPO_SLUG/ + - cd ~/build/$TRAVIS_REPO_SLUG - wget https://scrutinizer-ci.com/ocular.phar - - git remote rm origin - - git remote add origin git@github.com:silverstripe/silverstripe-userforms.git - php ocular.phar code-coverage:upload --format=php-clover coverage.clover diff --git a/code/extensions/UserFormFieldEditorExtension.php b/code/extensions/UserFormFieldEditorExtension.php index 248a68a..4645058 100644 --- a/code/extensions/UserFormFieldEditorExtension.php +++ b/code/extensions/UserFormFieldEditorExtension.php @@ -142,18 +142,32 @@ class UserFormFieldEditorExtension extends DataExtension */ public function onAfterPublish($original) { - // Remove fields on the live table which could have been orphaned. - $live = Versioned::get_by_stage("EditableFormField", "Live") - ->filter('ParentID', $original->ID); - - if ($live) { - foreach ($live as $field) { - $field->doDeleteFromStage('Live'); - } - } + // store IDs of fields we've published + $seenIDs = array(); foreach ($this->owner->Fields() as $field) { + // store any IDs of fields we publish so we don't unpublish them + $seenIDs[] = $field->ID; $field->doPublish('Stage', 'Live'); + $field->destroy(); + } + + // fetch any orphaned live records + $live = Versioned::get_by_stage("EditableFormField", "Live") + ->filter(array( + 'ParentID' => $original->ID, + )); + + if (!empty($seenIDs)) { + $live = $live->exclude(array( + 'ID' => $seenIDs, + )); + } + + // delete orphaned records + foreach ($live as $field) { + $field->doDeleteFromStage('Live'); + $field->destroy(); } } diff --git a/code/model/editableformfields/EditableFormField.php b/code/model/editableformfields/EditableFormField.php index c1574f1..c241bc3 100755 --- a/code/model/editableformfields/EditableFormField.php +++ b/code/model/editableformfields/EditableFormField.php @@ -83,14 +83,14 @@ class EditableFormField extends DataObject "CustomSettings" => "Text", // @deprecated from 2.0 "Migrated" => "Boolean", // set to true when migrated - "ExtraClass" => "Text", // from CustomSettings - "RightTitle" => "Varchar(255)", // from CustomSettings - "ShowOnLoad" => "Boolean(1)", // from CustomSettings - ); - - private static $defaults = array( - 'ShowOnLoad' => true, - ); + "ExtraClass" => "Text", // from CustomSettings + "RightTitle" => "Varchar(255)", // from CustomSettings + "ShowOnLoad" => "Boolean(1)", // from CustomSettings + ); + + private static $defaults = array( + 'ShowOnLoad' => true, + ); /** @@ -380,8 +380,8 @@ class EditableFormField extends DataObject if ($parent && $parent->exists()) { return $parent->canEdit($member) && !$this->isReadonly(); } elseif (!$this->exists() && Controller::has_curr()) { - // This is for GridFieldOrderableRows support as it checks edit permissions on - // singleton of the class. Allows editing of User Defined Form pages by + // This is for GridFieldOrderableRows support as it checks edit permissions on + // singleton of the class. Allows editing of User Defined Form pages by // 'Content Authors' and those with permission to edit the UDF page. (ie. CanEditType/EditorGroups) // This is to restore User Forms 2.x backwards compatibility. $controller = Controller::curr(); @@ -487,11 +487,27 @@ class EditableFormField extends DataObject { $this->publish($fromStage, $toStage, $createNewVersion); - // Don't forget to publish the related custom rules... - foreach ($this->DisplayRules() as $rule) { - $rule->doPublish($fromStage, $toStage, $createNewVersion); + $seenIDs = array(); + + // Don't forget to publish the related custom rules... + foreach ($this->DisplayRules() as $rule) { + $seenIDs[] = $rule->ID; + $rule->doPublish($fromStage, $toStage, $createNewVersion); + $rule->destroy(); + } + + // remove any orphans from the "fromStage" + $rules = Versioned::get_by_stage('EditableCustomRule', $toStage) + ->filter('ParentID', $this->ID); + + if (!empty($seenIDs)) { + $rules = $rules->exclude('ID', $seenIDs); } - } + + foreach ($rules as $rule) { + $rule->deleteFromStage($toStage); + } + } /** * Delete this field from a given stage diff --git a/code/model/editableformfields/EditableFormHeading.php b/code/model/editableformfields/EditableFormHeading.php index d1658d3..7a06d8b 100755 --- a/code/model/editableformfields/EditableFormHeading.php +++ b/code/model/editableformfields/EditableFormHeading.php @@ -59,7 +59,8 @@ class EditableFormHeading extends EditableFormField public function getFormField() { - $labelField = new HeaderField($this->Name, $this->EscapedTitle, $this->Level); + $labelField = HeaderField::create($this->EscapedTitle) + ->setHeadingLevel($this->Level); $labelField->addExtraClass('FormHeading'); $labelField->setAttribute('data-id', $this->Name); $this->doUpdateFormField($labelField);