BUGFIX #6291 Remove rollback action from CMSMain allowed_actions and rely on form action_rollback instead which is safer

git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/branches/2.4@115440 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
Sean Harvey 2011-01-11 23:00:59 +00:00 committed by Sam Minnee
parent b81cae875a
commit 3e8cc481f0
3 changed files with 36 additions and 5 deletions

View File

@ -1948,10 +1948,22 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
function getCMSActions() { function getCMSActions() {
$actions = new FieldSet(); $actions = new FieldSet();
// "readonly"/viewing version that isn't the current version of the record
$stageOrLiveRecord = Versioned::get_one_by_stage($this->class, Versioned::current_stage(), sprintf('"SiteTree"."ID" = %d', $this->ID));
if($stageOrLiveRecord && $stageOrLiveRecord->Version != $this->Version) {
$actions->push(new FormAction('email', _t('CMSMain.EMAIL', 'Email')));
$actions->push(new FormAction('rollback', _t('CMSMain.ROLLBACK', 'Roll back to this version')));
// getCMSActions() can be extended with updateCMSActions() on a decorator
$this->extend('updateCMSActions', $actions);
return $actions;
}
if($this->isPublished() && $this->canPublish() && !$this->IsDeletedFromStage) { if($this->isPublished() && $this->canPublish() && !$this->IsDeletedFromStage) {
// "unpublish" // "unpublish"
$unpublish = FormAction::create('unpublish', _t('SiteTree.BUTTONUNPUBLISH', 'Unpublish'), 'delete'); $unpublish = FormAction::create('unpublish', _t('SiteTree.BUTTONUNPUBLISH', 'Unpublish'), 'delete');
$unpublish->describe(_t('SiteTree.BUTTONUNPUBLISHDESC', "Remove this page from the published site")); $unpublish->describe(_t('SiteTree.BUTTONUNPUBLISHDESC', 'Remove this page from the published site'));
$unpublish->addExtraClass('delete'); $unpublish->addExtraClass('delete');
$actions->push($unpublish); $actions->push($unpublish);
} }
@ -1960,7 +1972,7 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
if($this->isPublished() && $this->canEdit()) { if($this->isPublished() && $this->canEdit()) {
// "rollback" // "rollback"
$rollback = FormAction::create('rollback', _t('SiteTree.BUTTONCANCELDRAFT', 'Cancel draft changes'), 'delete'); $rollback = FormAction::create('rollback', _t('SiteTree.BUTTONCANCELDRAFT', 'Cancel draft changes'), 'delete');
$rollback->describe(_t('SiteTree.BUTTONCANCELDRAFTDESC', "Delete your draft and revert to the currently published page")); $rollback->describe(_t('SiteTree.BUTTONCANCELDRAFTDESC', 'Delete your draft and revert to the currently published page'));
$rollback->addExtraClass('delete'); $rollback->addExtraClass('delete');
$actions->push($rollback); $actions->push($rollback);
} }

View File

@ -153,6 +153,26 @@ class SiteTreeActionsTest extends FunctionalTest {
$this->assertContains('action_rollback',$actionsArr); $this->assertContains('action_rollback',$actionsArr);
$this->assertNotContains('action_revert',$actionsArr); $this->assertNotContains('action_revert',$actionsArr);
} }
function testActionsViewingOldVersion() {
$p = new Page();
$p->Content = 'test page first version';
$p->write();
$p->Content = 'new content';
$p->write();
// Looking at the old version, the ability to rollback to that version is available
$version = DB::query('SELECT "Version" FROM "SiteTree_versions" WHERE "Content" = \'test page first version\'')->value();
$old = Versioned::get_version('Page', $p->ID, $version);
$actions = $old->getCMSActions()->column('Name');
$this->assertNotContains('action_save', $actions);
$this->assertNotContains('action_publish', $actions);
$this->assertNotContains('action_unpublish', $actions);
$this->assertNotContains('action_delete', $actions);
$this->assertContains('action_email', $actions);
$this->assertContains('action_rollback', $actions);
}
} }
class SiteTreeActionsTest_Page extends Page implements TestOnly { class SiteTreeActionsTest_Page extends Page implements TestOnly {
@ -164,4 +184,3 @@ class SiteTreeActionsTest_Page extends Page implements TestOnly {
return Permission::checkMember($member, 'SiteTreeActionsTest_Page_CANDELETE'); return Permission::checkMember($member, 'SiteTreeActionsTest_Page_CANDELETE');
} }
} }
?>