'handleAction' ); 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')); } }); $negotiator->setCallback('default', function () use (&$controller) { return $controller->renderWith($controller->getViewer('show')); }); return $negotiator; } /** * @param HTTPRequest $request * @return array */ public function show($request) { $form = $this->ShowVersionForm($request->param('VersionID')); $negotiator = $this->getResponseNegotiator(); $controller = $this; $negotiator->setCallback('CurrentForm', function () use (&$controller, &$form) { 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 $negotiator->respond($request); } /** * @param HTTPRequest $request * @return array */ public function compare($request) { $form = $this->CompareVersionsForm( $request->param('VersionID'), $request->param('OtherVersionID') ); $negotiator = $this->getResponseNegotiator(); $controller = $this; $negotiator->setCallback('CurrentForm', function () use (&$controller, &$form) { 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 $negotiator->respond($request); } public function getSilverStripeNavigator() { $record = $this->getRecord($this->currentPageID(), $this->getRequest()->param('VersionID')); if ($record) { $navigator = new SilverStripeNavigator($record); return $navigator->renderWith($this->getTemplatesWithSuffix('_SilverStripeNavigator')); } else { return false; } } /** * Returns the read only version of the edit form. Detaches all {@link FormAction} * instances attached since only action relates to revert. * * Permission checking is done at the {@link CMSMain::getEditForm()} level. * * @param int $id ID of the record to show * @param array $fields optional * @param int $versionID * @param int $compareID Compare mode * * @return Form */ public function getEditForm($id = null, $fields = null, $versionID = null, $compareID = null) { if (!$id) { $id = $this->currentPageID(); } $record = $this->getRecord($id, $versionID); $versionID = ($record) ? $record->Version : $versionID; $form = parent::getEditForm($record, ($record) ? $record->getCMSFields() : null); // Respect permission failures from parent implementation 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) )); $fields = $form->Fields(); $fields->removeByName("Status"); $fields->push(new HiddenField("ID")); $fields->push(new HiddenField("Version")); $fields = $fields->makeReadonly(); if ($compareID) { $link = Controller::join_links( $this->Link('show'), $id ); $view = _t('CMSPageHistoryController.VIEW', "view"); $message = _t( 'CMSPageHistoryController.COMPARINGVERSION', "Comparing versions {version1} and {version2}.", array( 'version1' => sprintf('%s (%s)', $versionID, Controller::join_links($link, $versionID), $view), 'version2' => sprintf('%s (%s)', $compareID, Controller::join_links($link, $compareID), $view) ) ); $revert->setReadonly(true); } else { if ($record->isLatestVersion()) { $message = _t('CMSPageHistoryController.VIEWINGLATEST', 'Currently viewing the latest version.'); } else { $message = _t( 'CMSPageHistoryController.VIEWINGVERSION', "Currently viewing version {version}.", array('version' => $versionID) ); } } $fields->fieldByName('Root.Main')->unshift( new LiteralField('CurrentlyViewingMessage', ArrayData::create(array( 'Content' => DBField::create_field('HTMLFragment', $message), 'Classes' => 'notice' ))->renderWith($this->getTemplatesWithSuffix('_notice'))) ); $form->setFields($fields->makeReadonly()); $form->loadDataFrom(array( "ID" => $id, "Version" => $versionID, )); if (($record && $record->isLatestVersion())) { $revert->setReadonly(true); } $form->removeExtraClass('cms-content'); return $form; } /** * Version select form. Main interface between selecting versions to view * and comparing multiple versions. * * Because we can reload the page directly to a compare view (history/compare/1/2/3) * this form has to adapt to those parameters as well. * * @return Form */ public function VersionsForm() { $id = $this->currentPageID(); $page = $this->getRecord($id); $versionsHtml = ''; $action = $this->getRequest()->param('Action'); $versionID = $this->getRequest()->param('VersionID'); $otherVersionID = $this->getRequest()->param('OtherVersionID'); $showUnpublishedChecked = 0; $compareModeChecked = ($action == "compare"); if ($page) { $versions = $page->allVersions(); $versionID = (!$versionID) ? $page->Version : $versionID; 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($this->getTemplatesWithSuffix('_versions')); } $fields = new FieldList( new CheckboxField( 'ShowUnpublished', _t('CMSPageHistoryController.SHOWUNPUBLISHED', 'Show unpublished versions'), $showUnpublishedChecked ), new CheckboxField( 'CompareMode', _t('CMSPageHistoryController.COMPAREMODE', 'Compare mode (select two)'), $compareModeChecked ), new LiteralField('VersionsHtml', $versionsHtml), $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