diff --git a/core/control/ContentController.php b/core/control/ContentController.php index 0c236376e..9618fb6db 100755 --- a/core/control/ContentController.php +++ b/core/control/ContentController.php @@ -293,6 +293,8 @@ class ContentController extends Controller { public function SilverStripeNavigator() { $member = Member::currentUser(); + $items = ''; + $message = ''; if(Director::isDev() || Permission::check('CMS_ACCESS_CMSMain') || Permission::check('VIEW_DRAFT_CONTENT')) { Requirements::css(SAPPHIRE_DIR . '/css/SilverStripeNavigator.css'); @@ -313,55 +315,44 @@ class ContentController extends Controller { })(jQuery); JS ); + - if($this->dataRecord){ - $thisPage = $this->dataRecord->Link(); - $cmsLink = 'admin/show/' . $this->dataRecord->ID; - $cmsLink = "". _t('ContentController.CMS', 'CMS') .""; - } else { - /** - * HGS: If this variable is missing a notice is raised. Subclasses of ContentController - * are required to implement RelativeLink anyway, so this should work even if the - * dataRecord isn't set. - */ - $thisPage = $this->Link(); - $cmsLink = ''; - } - - $archiveLink = ""; - - if($date = Versioned::current_archived_date()) { - $dateObj = Object::create('Datetime', $date, null); - // $dateObj->setVal($date); - - $archiveLink = "". _t('ContentController.ARCHIVEDSITE', 'Archived Site') .""; - $liveLink = "". _t('ContentController.PUBLISHEDSITE', 'Published Site') .""; - $stageLink = "". _t('ContentController.DRAFTSITE', 'Draft Site') .""; - $message = "
". _t('ContentController.ARCHIVEDSITEFROM', 'Archived site from') ."
" . $dateObj->Nice() . "
"; - - } else if(Versioned::current_stage() == 'Stage') { - $stageLink = "". _t('ContentController.DRAFTSITE', 'Draft Site') .""; - $liveLink = "". _t('ContentController.PUBLISHEDSITE', 'Published Site') .""; - $message = "
". _t('ContentController.DRAFTSITE', 'Draft Site') ."
"; - - } else { - $liveLink = "". _t('ContentController.PUBLISHEDSITE', 'Published Site') .""; - $stageLink = "". _t('ContentController.DRAFTSITE', 'Draft Site') .""; - $message = "
". _t('ContentController.PUBLISHEDSITE', 'Published Site') ."
"; + + if($this->dataRecord) { + $navItemClasses = ClassInfo::subclassesFor('SilverStripeNavigatorItem'); + array_shift($navItemClasses); + + // Sort menu items according to priority + $menuPriority = array(); + $i = 0; + foreach($navItemClasses as $navItemClass) { + if($navItemClass == 'SilverStripeNavigatorItem') continue; + + $i++; + $obj = new $navItemClass(); + // This funny litle formula ensures that the first item added with the same priority will be left-most. + $priority = Object::get_static($navItemClass, 'priority'); + $menuPriority[$priority * 100 - 1] = $obj; + } + ksort($menuPriority); + + foreach($menuPriority as $obj) { + + $text = $obj->getHTML($this->dataRecord); + if($text) $items .= $text; + if(!$message) $message = $obj->getMessage($this); + } } if($member) { $firstname = Convert::raw2xml($member->FirstName); - $surname = Convert::raw2xml($member->Surame); + $surname = Convert::raw2xml($member->Surname); $logInMessage = _t('ContentController.LOGGEDINAS', 'Logged in as') ." {$firstname} {$surname} - ". _t('ContentController.LOGOUT', 'Log out'). ""; } else { $logInMessage = _t('ContentController.NOTLOGGEDIN', 'Not logged in') ." - ". _t('ContentController.LOGIN', 'Login') .""; } $viewPageIn = _t('ContentController.VIEWPAGEIN', 'View Page in:'); - /** - * HGS: cmsLink is now only set if there is a dataRecord. You can't view the page in the - * CMS if there is no dataRecord - */ + return <<
@@ -371,11 +362,7 @@ JS
$viewPageIn
- $cmsLink - $stageLink -
- $liveLink - $archiveLink + $items
diff --git a/core/control/SilverStripeNavigatorItem.php b/core/control/SilverStripeNavigatorItem.php new file mode 100644 index 000000000..6b2821cb9 --- /dev/null +++ b/core/control/SilverStripeNavigatorItem.php @@ -0,0 +1,80 @@ +ID; + $cmsLink = "". _t('ContentController.CMS', 'CMS') .""; + + return $cmsLink; + } +} + +class SilverStripeNavigatorItem_StageLink extends SilverStripeNavigatorItem { + static $priority = 20; + + function getHTML($controller) { + if(Versioned::current_stage() == 'Stage') { + return "". _t('ContentController.DRAFTSITE', 'Draft Site') .""; + } else { + $thisPage = $controller->Link(); + return "". _t('ContentController.DRAFTSITE', 'Draft Site') .""; + } + } + + function getMessage($controller) { + if(Versioned::current_stage() == 'Stage') { + return "
". _t('ContentController.DRAFTSITE', 'Draft Site') ."
"; + } + } +} + +class SilverStripeNavigatorItem_LiveLink extends SilverStripeNavigatorItem { + static $priority = 30; + + function getHTML($controller) { + if(Versioned::current_stage() == 'Live') { + return "". _t('ContentController.PUBLISHEDSITE', 'Published Site') .""; + } else { + $thisPage = $controller->Link(); + return "". _t('ContentController.PUBLISHEDSITE', 'Published Site') .""; + } + } + + function getMessage($controller) { + if(Versioned::current_stage() == 'Live') { + return "
". _t('ContentController.PUBLISHEDSITE', 'Published Site') ."
"; + } + } +} + +class SilverStripeNavigatorItem_ArchiveLink extends SilverStripeNavigatorItem { + static $priority = 40; + + function getHTML($controller) { + if(Versioned::current_archived_date()) { + return "". _t('ContentController.ARCHIVEDSITE', 'Archived Site') .""; + } + } + + function getMessage($controller) { + if($date = Versioned::current_archived_date()) { + $dateObj = Object::create('Datetime', $date, null); + + return "
". _t('ContentController.ARCHIVEDSITEFROM', 'Archived site from') ."
" . $dateObj->Nice() . "
"; + } + } +} + +?>