diff --git a/README.md b/README.md index 36fb3d0..25c8049 100644 --- a/README.md +++ b/README.md @@ -33,10 +33,10 @@ The navigator is auto-injected into your template, and no code changes are neede If your website uses caching, make sure BetterNavigator's output is excluded. -## Disabling the navigator +## Custom navigator display logic -You can disable the navigator using your own custom logic by defining a `showBetterNavigator(): bool` -method in any controller with the extension applied. +You can customise the navigator display logic using your own custom logic by defining a `showBetterNavigator(): bool` +method in any controller with the extension applied. By default the navigator will only show on controllers that have a `dataRecord` property that is an instance of `SilverStripe\CMS\Model\SiteTree`. ```php public function showBetterNavigator() @@ -101,6 +101,15 @@ public function BetterNavigatorEditLink() (This example uses [sunnysideup/cms_edit_link_field](https://github.com/sunnysideup/silverstripe-cms_edit_link_field) to automatically find an edit link for a specified DataObject, but you can return any URL.) +## Overriding the permissions required for the cms edit link + +By default users are required to have at least the `CMS_ACCESS_CMSMain` permission in order to see the edit link in better navigator, you can override this by setting the `better_navigator_edit_permission` configuration option on your controller to another permission code or an array of permission codes, e.g.: + +```yml +My\Namespace\EventController: + better_navigator_edit_permission: "CUSTOM_PERMISSION_CODE" + better_navigator_edit_permission_mode: "any" #Optional, but can be either "any" or "all" (defaults to "all") + ## Bonus: better debugging tools This module provide quick access to Silverstripe's built in [URL Variable Tools](http://doc.silverstripe.org/framework/en/reference/urlvariabletools) but reading their output isn't much fun. You can peek under Silverstripe's hood much more conveniently using lekoala's [Silverstripe DebugBar](https://github.com/lekoala/silverstripe-debugbar) diff --git a/src/Extension/BetterNavigatorExtension.php b/src/Extension/BetterNavigatorExtension.php index d066a9a..2fa53a6 100644 --- a/src/Extension/BetterNavigatorExtension.php +++ b/src/Extension/BetterNavigatorExtension.php @@ -17,15 +17,11 @@ 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 bool|null - */ - private $shouldDisplay = null; + private static $better_navigator_edit_permission = 'CMS_ACCESS_CMSMain'; + private static $better_navigator_edit_permission_mode = 'any'; /** * @param $request @@ -70,7 +66,7 @@ class BetterNavigatorExtension extends DataExtension */ public function showBetterNavigator() { - return true; + return $this->isAPage(); } /** @@ -111,10 +107,10 @@ class BetterNavigatorExtension extends DataExtension } } } - + // Only show edit link if user has CMS access $editLink = null; - if($isDev || Permission::check('CMS_ACCESS_CMSMain')) { + if($isDev || Permission::check($this->owner->config()->better_navigator_edit_permission, $this->owner->config()->better_navigator_edit_permission_mode)) { // Check for edit link override, e.g. for a DataObject if(method_exists($this->owner, 'BetterNavigatorEditLink')) { $editLink = $this->owner->BetterNavigatorEditLink(); @@ -127,7 +123,7 @@ class BetterNavigatorExtension extends DataExtension } // Is the logged in member nominated as a developer? - $member = Member::currentUser(); + $member = Security::getCurrentUser(); $devs = Config::inst()->get('BetterNavigator', 'developers'); $identifierField = Member::config()->unique_identifier_field; $isDeveloper = $member && is_array($devs) ? in_array($member->{$identifierField}, $devs) : false; @@ -165,20 +161,23 @@ class BetterNavigatorExtension extends DataExtension */ private function shouldDisplay() { - if ($this->shouldDisplay !== null) { - return $this->shouldDisplay; + if ($this->owner->getField('_betterNavigatorShouldDisplay') !== null) { + return $this->owner->getField('_betterNavigatorShouldDisplay'); } // Make sure this is a page - if (!$this->isAPage() || !$this->owner->showBetterNavigator()) { - return $this->shouldDisplay = false; + if (!$this->owner->showBetterNavigator()) { + $this->owner->setField('_betterNavigatorShouldDisplay', false); + return 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); + $result = ($isDev || $canViewDraft); + $this->owner->setField('_betterNavigatorShouldDisplay', $result); + return $result; } /**