From cf55be3f7b7a91a72500d5ab6c636b83637a2d4b Mon Sep 17 00:00:00 2001 From: Aaron Carlino Date: Thu, 11 Jul 2019 15:08:05 +1200 Subject: [PATCH] Update composer constraint, remove pre-rendering, breaking changes for major release --- composer.json | 2 +- src/Extension/BetterNavigatorExtension.php | 179 ++++++++++--------- templates/BetterNavigator/BetterNavigator.ss | 3 - 3 files changed, 93 insertions(+), 91 deletions(-) diff --git a/composer.json b/composer.json index a08fca3..9c99572 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ } ], "require": { - "silverstripe/framework": ">= 4.2" + "silverstripe/framework": "^4.2" }, "extra": { "installer-name": "betternavigator", diff --git a/src/Extension/BetterNavigatorExtension.php b/src/Extension/BetterNavigatorExtension.php index 4ba69f2..d798d94 100644 --- a/src/Extension/BetterNavigatorExtension.php +++ b/src/Extension/BetterNavigatorExtension.php @@ -16,102 +16,25 @@ use SilverStripe\Security\Security; use SilverStripe\Versioned\Versioned; use SilverStripe\View\ArrayData; use SilverStripe\ORM\FieldType\DBHTMLText; +use SilverStripe\View\Requirements; class BetterNavigatorExtension extends DataExtension { /** - * @var string + * @var bool|null */ - private $navigatorHTML; + private $shouldDisplay = null; /** - * Noop, pseudo backward compatability only - * @return DBHTMLText - */ - public function BetterNavigator() - { - return DBField::create_field('HTMLText', ''); - } - - /** - * Provides a front-end utility menu with administrative functions and developer tools - * Relies on SilverStripeNavigator - * - * @return DBHTMLText|false - */ - protected function generateNavigator() - { - // Make sure this is a page - if (!$this->isAPage() || !$this->owner->showBetterNavigator()) { - return false; - } - - // Only show navigator to appropriate users - $isDev = Director::isDev(); - $canViewDraft = (Permission::check('VIEW_DRAFT_CONTENT') || Permission::check('CMS_ACCESS_CMSMain')); - if ($isDev || $canViewDraft) { - // Get SilverStripeNavigator links & stage info (CMS/Stage/Live/Archive) - $nav = []; - $viewing = ''; - $navigator = SilverStripeNavigator::create($this->owner->dataRecord); - $items = $navigator->getItems(); - foreach ($items as $item) { - $name = $item->getName(); - $active = $item->isActive(); - $nav[$name] = [ - 'Link' => $item->getLink(), - 'Active' => $active - ]; - if ($active) { - if ($name == 'LiveLink') $viewing = 'Live'; - if ($name == 'StageLink') $viewing = 'Draft'; - if ($name == 'ArchiveLink') $viewing = 'Archived'; - } - } - // Only show edit link if user has permission to edit this page - $editLink = array_key_exists('CMSLink', $nav) - && ($isDev || $this->owner->dataRecord->canEdit() && Permission::check('CMS_ACCESS_CMSMain')) - ? $nav['CMSLink']['Link'] : false; - - // Is the logged in member nominated as a developer? - $member = Member::currentUser(); - $devs = Config::inst()->get('BetterNavigator', 'developers'); - $identifierField = Member::config()->unique_identifier_field; - $isDeveloper = $member && is_array($devs) ? in_array($member->{$identifierField}, $devs) : false; - - // Add other data for template - $backURL = '?BackURL=' . urlencode($this->owner->Link()); - $bNData = array_merge($nav, [ - 'Member' => $member, - 'Stage' => Versioned::get_stage(), - 'Viewing' => $viewing, // What we're viewing doesn't necessarily align with the active Stage - 'LoginLink' => Controller::join_links(Director::absoluteBaseURL(), Security::config()->login_url, $backURL), - 'LogoutLink' => Controller::join_links(Director::absoluteBaseURL() . Security::config()->logout_url, $backURL), - 'LogoutForm' => LogoutForm::create($this->owner)->setName('BetterNavigatorLogoutForm'), - 'EditLink' => $editLink, - 'Mode' => Director::get_environment_type(), - 'IsDeveloper' => $isDeveloper - ]); - - // Merge with page data, send to template and render - $navigator = new ArrayData($bNData); - - return $navigator->renderWith('BetterNavigator\\BetterNavigator'); - } - - return false; - } - - /** - * Prerender HTML to ensure that <% require %> gets loaded + * Load requirements in before final render. When the next extension point is called, it's too late. * @return void */ public function beforeCallActionHandler(): void { - $navigator = $this->generateNavigator(); - if ($navigator) { - $this->navigatorHTML = $navigator->getValue(); + if ($this->shouldDisplay()) { + Requirements::javascript('jonom/silverstripe-betternavigator: javascript/betternavigator.js'); + Requirements::css('jonom/silverstripe-betternavigator: css/betternavigator.css'); } } @@ -123,16 +46,17 @@ class BetterNavigatorExtension extends DataExtension */ public function afterCallActionHandler($request, $action, $result): DBHTMLText { - if (!$this->navigatorHTML) { + if (!$this->shouldDisplay()) { return $result; } $html = $result->getValue(); + $navigatorHTML = $this->generateNavigator()->getValue(); // Inject the NavigatorHTML before the closing tag $html = preg_replace( '/(<\/body[^>]*>)/i', - $this->navigatorHTML . '\\1', + $navigatorHTML . '\\1', $html ); $result->setValue($html); @@ -149,10 +73,91 @@ class BetterNavigatorExtension extends DataExtension return true; } + /** + * Provides a front-end utility menu with administrative functions and developer tools + * Relies on SilverStripeNavigator + * + * @return DBHTMLText + */ + private function generateNavigator(): DBHTMLText + { + // Get SilverStripeNavigator links & stage info (CMS/Stage/Live/Archive) + $nav = []; + $viewing = ''; + $navigator = SilverStripeNavigator::create($this->owner->dataRecord); + $isDev = Director::isDev(); + + $items = $navigator->getItems(); + foreach ($items as $item) { + $name = $item->getName(); + $active = $item->isActive(); + $nav[$name] = [ + 'Link' => $item->getLink(), + 'Active' => $active + ]; + if ($active) { + if ($name == 'LiveLink') $viewing = 'Live'; + if ($name == 'StageLink') $viewing = 'Draft'; + if ($name == 'ArchiveLink') $viewing = 'Archived'; + } + } + // Only show edit link if user has permission to edit this page + $editLink = array_key_exists('CMSLink', $nav) + && ($isDev || $this->owner->dataRecord->canEdit() && Permission::check('CMS_ACCESS_CMSMain')) + ? $nav['CMSLink']['Link'] : false; + + // Is the logged in member nominated as a developer? + $member = Member::currentUser(); + $devs = Config::inst()->get('BetterNavigator', 'developers'); + $identifierField = Member::config()->unique_identifier_field; + $isDeveloper = $member && is_array($devs) ? in_array($member->{$identifierField}, $devs) : false; + + // Add other data for template + $backURL = '?BackURL=' . urlencode($this->owner->Link()); + $bNData = array_merge($nav, [ + 'Member' => $member, + 'Stage' => Versioned::get_stage(), + 'Viewing' => $viewing, // What we're viewing doesn't necessarily align with the active Stage + 'LoginLink' => Controller::join_links(Director::absoluteBaseURL(), Security::config()->login_url, $backURL), + 'LogoutLink' => Controller::join_links(Director::absoluteBaseURL() . Security::config()->logout_url, $backURL), + 'LogoutForm' => LogoutForm::create($this->owner)->setName('BetterNavigatorLogoutForm'), + 'EditLink' => $editLink, + 'Mode' => Director::get_environment_type(), + 'IsDeveloper' => $isDeveloper + ]); + + // Merge with page data, send to template and render + $navigator = new ArrayData($bNData); + + return $this->owner->customise($navigator)->renderWith('BetterNavigator\\BetterNavigator'); + } + + /** + * Internally compute and cache weather the navigator should display + * @return bool + */ + private function shouldDisplay(): bool + { + if ($this->shouldDisplay !== null) { + return $this->shouldDisplay; + } + + // Make sure this is a page + if (!$this->isAPage() || !$this->owner->showBetterNavigator()) { + return $this->shouldDisplay = false; + } + + // Only show navigator to appropriate users + $isDev = Director::isDev(); + $canViewDraft = (Permission::check('VIEW_DRAFT_CONTENT') || Permission::check('CMS_ACCESS_CMSMain')); + + return $this->shouldDisplay = ($isDev || $canViewDraft); + } + /** * @return boolean */ - protected function isAPage() + private function isAPage(): bool { return $this->owner && $this->owner->dataRecord diff --git a/templates/BetterNavigator/BetterNavigator.ss b/templates/BetterNavigator/BetterNavigator.ss index 8fe5122..97baf63 100644 --- a/templates/BetterNavigator/BetterNavigator.ss +++ b/templates/BetterNavigator/BetterNavigator.ss @@ -1,6 +1,3 @@ -<% require javascript("jonom/silverstripe-betternavigator: javascript/betternavigator.js") %> -<% require css("jonom/silverstripe-betternavigator: css/betternavigator.css") %> -