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