diff --git a/.travis.yml b/.travis.yml index 633ef98..3a695d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,8 +23,9 @@ before_script: script: - vendor/bin/phpunit --coverage-clover coverage.clover userforms/tests + +after_success: + - mv coverage.clover ~/build/$TRAVIS_REPO_SLUG/ + - cd ~/build/$TRAVIS_REPO_SLUG - wget https://scrutinizer-ci.com/ocular.phar - - cd ./userforms - - 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