FIX Improve publish performance for formfields (#538)

* FIX Improve publish performance for formfields

* FIX Travis builds broken with external code coverage
This commit is contained in:
Daniel Hensby 2017-01-24 20:35:50 +00:00 committed by Damian Mooyman
parent efcd85fcbe
commit 2f710d6518
3 changed files with 48 additions and 16 deletions

View File

@ -27,7 +27,9 @@ before_script:
script: script:
- vendor/bin/phpunit --coverage-clover coverage.clover userforms/tests - 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 - 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 - php ocular.phar code-coverage:upload --format=php-clover coverage.clover

View File

@ -136,19 +136,33 @@ class UserFormFieldEditorExtension extends DataExtension {
* @return void * @return void
*/ */
public function onAfterPublish($original) { public function onAfterPublish($original) {
// Remove fields on the live table which could have been orphaned. // store IDs of fields we've published
$live = Versioned::get_by_stage("EditableFormField", "Live") $seenIDs = array();
->filter('ParentID', $original->ID);
if($live) { foreach ($this->owner->Fields() as $field) {
foreach($live as $field) { // store any IDs of fields we publish so we don't unpublish them
$field->doDeleteFromStage('Live'); $seenIDs[] = $field->ID;
} $field->doPublish('Stage', 'Live');
} $field->destroy();
}
foreach($this->owner->Fields() as $field) { // fetch any orphaned live records
$field->doPublish('Stage', 'Live'); $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();
}
} }
/** /**

View File

@ -474,10 +474,26 @@ class EditableFormField extends DataObject {
public function doPublish($fromStage, $toStage, $createNewVersion = false) { public function doPublish($fromStage, $toStage, $createNewVersion = false) {
$this->publish($fromStage, $toStage, $createNewVersion); $this->publish($fromStage, $toStage, $createNewVersion);
$seenIDs = array();
// Don't forget to publish the related custom rules... // Don't forget to publish the related custom rules...
foreach ($this->DisplayRules() as $rule) { foreach ($this->DisplayRules() as $rule) {
$seenIDs[] = $rule->ID;
$rule->doPublish($fromStage, $toStage, $createNewVersion); $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);
}
} }
/** /**