diff --git a/code/controllers/CMSMain.php b/code/controllers/CMSMain.php index 9f307bd9..60aa957a 100644 --- a/code/controllers/CMSMain.php +++ b/code/controllers/CMSMain.php @@ -15,6 +15,10 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr private static $url_rule = '/$Action/$ID/$OtherID'; + private static $url_handlers = array( + 'EditForm/$ID' => 'EditForm', + ); + // Maintain a lower priority than other administration sections // so that Director does not think they are actions of CMSMain private static $url_priority = 39; @@ -66,6 +70,13 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr */ private static $enabled_legacy_actions = array(); + /** + * The page id for this request + * + * @var int|null + */ + protected $pageID = null; + public function init() { // set reading lang if(SiteTree::has_extension('Translatable') && !$this->getRequest()->isAjax()) { @@ -592,6 +603,29 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr } } + /** + * Ensuring we set the current page id from the $ID url parameter. + * + * @param SS_HTTPRequest $request + * + * @return Form + */ + public function EditForm($request = null) { + // set page ID from request + if ($request) { + // validate id is present + $id = $request->param('ID'); + + if (!isset($id)) { + return $this->httpError(400); + } + + $this->setCurrentPageID($id); + } + + return $this->getEditForm(); + } + /** * @param int $id * @param FieldList $fields @@ -690,6 +724,13 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr $form->setFields($readonlyFields); } + // update form action to include $pageID + $form->setFormAction(Controller::join_links( + $this->Link(), + $form->getName(), + $id + )); + $this->extend('updateEditForm', $form); return $form; } else if($id) { @@ -866,8 +907,25 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr return $listview; } + /** + * Set the page id into $pageID rather than into {@link Session}. + * + * @param string|int $id + * + * @return void + */ + public function setCurrentPageID($id) { + $id = (int)$id; + $this->pageID = $id; + } + + /** + * Get the page id from this request + * + * @return int + */ public function currentPageID() { - $id = parent::currentPageID(); + $id = $this->pageID; $this->extend('updateCurrentPageID', $id); diff --git a/code/controllers/CMSPageHistoryController.php b/code/controllers/CMSPageHistoryController.php index 852690ad..b3fe8152 100644 --- a/code/controllers/CMSPageHistoryController.php +++ b/code/controllers/CMSPageHistoryController.php @@ -12,56 +12,81 @@ class CMSPageHistoryController extends CMSMain { private static $menu_title = 'History'; private static $required_permission_codes = 'CMS_ACCESS_CMSMain'; private static $session_namespace = 'CMSMain'; - + private static $allowed_actions = array( + 'EditForm', 'VersionsForm', 'CompareVersionsForm', 'show', 'compare' ); - + private static $url_handlers = array( - '$Action/$ID/$VersionID/$OtherVersionID' => 'handleAction' + 'EditForm/$ID/$VersionID' => 'EditForm', + '$Action/$ID/$VersionID/$OtherVersionID' => 'handleAction', ); + /** + * Current version ID for this request. Can be 0 for latest version + * + * @var int + */ + protected $versionID = null; + public function getResponseNegotiator() { $negotiator = parent::getResponseNegotiator(); $controller = $this; $negotiator->setCallback('CurrentForm', function() use(&$controller) { - $form = $controller->ShowVersionForm($controller->getRequest()->param('VersionID')); - if($form) return $form->forTemplate(); - else return $controller->renderWith($controller->getTemplatesWithSuffix('_Content')); + $form = $controller->getEditForm(); + if ($form) { + return $form->forTemplate(); + } else { + return $controller->renderWith($controller->getTemplatesWithSuffix('_Content')); + } }); $negotiator->setCallback('default', function() use(&$controller) { return $controller->renderWith($controller->getViewer('show')); }); return $negotiator; } - + /** * @param SS_HTTPRequest $request - * @return array + * @return SS_HTTPResponse */ public function show($request) { - $form = $this->ShowVersionForm($request->param('VersionID')); - + // Record id and version for this request + $id = $request->param('ID'); + $this->setCurrentPageID($id); + $versionID = $request->param('VersionID'); + $this->setVersionID($versionID); + + $form = $this->getEditForm(); + $negotiator = $this->getResponseNegotiator(); $controller = $this; $negotiator->setCallback('CurrentForm', function() use(&$controller, &$form) { - return $form ? $form->forTemplate() : $controller->renderWith($controller->getTemplatesWithSuffix('_Content')); + return $form + ? $form->forTemplate() + : $controller->renderWith($controller->getTemplatesWithSuffix('_Content')); }); $negotiator->setCallback('default', function() use(&$controller, &$form) { - return $controller->customise(array('EditForm' => $form))->renderWith($controller->getViewer('show')); + return $controller + ->customise(array('EditForm' => $form)) + ->renderWith($controller->getViewer('show')); }); return $negotiator->respond($request); } - + /** * @param SS_HTTPRequest $request - * @return array + * @return SS_HTTPResponse */ public function compare($request) { + $id = $request->param('ID'); + $this->setCurrentPageID($id); + $form = $this->CompareVersionsForm( $request->param('VersionID'), $request->param('OtherVersionID') @@ -70,10 +95,14 @@ class CMSPageHistoryController extends CMSMain { $negotiator = $this->getResponseNegotiator(); $controller = $this; $negotiator->setCallback('CurrentForm', function() use(&$controller, &$form) { - return $form ? $form->forTemplate() : $controller->renderWith($controller->getTemplatesWithSuffix('_Content')); + return $form + ? $form->forTemplate() + : $controller->renderWith($controller->getTemplatesWithSuffix('_Content')); }); $negotiator->setCallback('default', function() use(&$controller, &$form) { - return $controller->customise(array('EditForm' => $form))->renderWith($controller->getViewer('show')); + return $controller + ->customise(array('EditForm' => $form)) + ->renderWith($controller->getViewer('show')); }); return $negotiator->respond($request); @@ -88,7 +117,24 @@ class CMSPageHistoryController extends CMSMain { return false; } } - + + /** + * @param SS_HTTPRequest $request + * @return Form + */ + public function EditForm($request = null) { + if ($request) { + // Validate VersionID is present + $versionID = $request->param('VersionID'); + if (!isset($versionID)) { + $this->httpError(400); + return null; + } + $this->setVersionID($versionID); + } + return parent::EditForm($request); + } + /** * Returns the read only version of the edit form. Detaches all {@link FormAction} * instances attached since only action relates to revert. @@ -103,29 +149,48 @@ class CMSPageHistoryController extends CMSMain { * @return Form */ public function getEditForm($id = null, $fields = null, $versionID = null, $compareID = null) { - if(!$id) $id = $this->currentPageID(); - + if (!$id) { + $id = $this->currentPageID(); + } + if (!$versionID) { + $versionID = $this->getVersionID(); + } + $record = $this->getRecord($id, $versionID); - $versionID = ($record) ? $record->Version : $versionID; - - $form = parent::getEditForm($record, ($record) ? $record->getCMSFields() : null); + if (!$record) { + return $this->EmptyForm(); + } + + // Refresh version ID + $versionID = $record->Version; + $this->setVersionID($versionID); + + // Get edit form + $form = parent::getEditForm($record, $record->getCMSFields()); // Respect permission failures from parent implementation - if(!($form instanceof Form)) return $form; + if (!($form instanceof Form)) { + return $form; + } // TODO: move to the SilverStripeNavigator structure so the new preview can pick it up. //$nav = new SilverStripeNavigatorItem_ArchiveLink($record); - $form->setActions(new FieldList( - $revert = FormAction::create('doRollback', _t('CMSPageHistoryController.REVERTTOTHISVERSION', 'Revert to this version'))->setUseButtonTag(true) - )); - + $actions = new FieldList( + $revert = FormAction::create( + 'doRollback', + _t('CMSPageHistoryController.REVERTTOTHISVERSION', 'Revert to this version') + )->setUseButtonTag(true) + ); + $actions->setForm($form); + $form->setActions($actions); + $fields = $form->Fields(); $fields->removeByName("Status"); $fields->push(new HiddenField("ID")); $fields->push(new HiddenField("Version")); - - $fields = $fields->makeReadonly(); - + + $fields = $fields->makeReadonly(); + if($compareID) { $link = Controller::join_links( $this->Link('show'), @@ -133,7 +198,7 @@ class CMSPageHistoryController extends CMSMain { ); $view = _t('CMSPageHistoryController.VIEW',"view"); - + $message = _t( 'CMSPageHistoryController.COMPARINGVERSION', "Comparing versions {version1} and {version2}.", @@ -142,7 +207,7 @@ class CMSPageHistoryController extends CMSMain { 'version2' => sprintf('%s (%s)', $compareID, Controller::join_links($link, $compareID), $view) ) ); - + $revert->setReadonly(true); } else { if($record->isLatestVersion()) { @@ -155,7 +220,7 @@ class CMSPageHistoryController extends CMSMain { ); } } - + $fields->addFieldToTab('Root.Main', new LiteralField('CurrentlyViewingMessage', $this->customise(array( 'Content' => $message, @@ -169,17 +234,24 @@ class CMSPageHistoryController extends CMSMain { "ID" => $id, "Version" => $versionID, )); - - if(($record && $record->isLatestVersion())) { + + if ($record->isLatestVersion()) { $revert->setReadonly(true); } - + $form->removeExtraClass('cms-content'); + $form->setFormAction(Controller::join_links( + $this->Link(), + $form->getName(), + $id, + $versionID + )); + return $form; } - - + + /** * Version select form. Main interface between selecting versions to view * and comparing multiple versions. @@ -197,7 +269,7 @@ class CMSPageHistoryController extends CMSMain { $action = $this->getRequest()->param('Action'); $versionID = $this->getRequest()->param('VersionID'); $otherVersionID = $this->getRequest()->param('OtherVersionID'); - + $showUnpublishedChecked = 0; $compareModeChecked = ($action == "compare"); @@ -208,19 +280,19 @@ class CMSPageHistoryController extends CMSMain { if($versions) { foreach($versions as $k => $version) { $active = false; - + if($version->Version == $versionID || $version->Version == $otherVersionID) { $active = true; - + if(!$version->WasPublished) $showUnpublishedChecked = 1; } $version->Active = ($active); } } - + $vd = new ViewableData(); - + $versionsHtml = $vd->customise(array( 'Versions' => $versions ))->renderWith('CMSPageHistoryController_versions'); @@ -241,37 +313,25 @@ class CMSPageHistoryController extends CMSMain { $hiddenID = new HiddenField('ID', false, "") ); - $actions = new FieldList( - new FormAction( - 'doCompare', _t('CMSPageHistoryController.COMPAREVERSIONS','Compare Versions') - ), - new FormAction( - 'doShowVersion', _t('CMSPageHistoryController.SHOWVERSION','Show Version') - ) - ); - - // Use