From 07bf8fe3ec7cd6bda845002b1dc304b27892e04a Mon Sep 17 00:00:00 2001 From: UndefinedOffset Date: Tue, 5 Feb 2019 15:56:22 -0400 Subject: [PATCH] Changed Fluent model rules to be added before the silverstripe/cms model rule rather than before all rules --- src/Extension/FluentDirectorExtension.php | 27 +++++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/Extension/FluentDirectorExtension.php b/src/Extension/FluentDirectorExtension.php index f5b2e5a9..262b99f2 100644 --- a/src/Extension/FluentDirectorExtension.php +++ b/src/Extension/FluentDirectorExtension.php @@ -68,14 +68,10 @@ class FluentDirectorExtension extends Extension public function updateRules(&$rules) { $originalRules = $rules; - $rules = $this->getExplicitRoutes($originalRules); + $fluentRules = $this->getExplicitRoutes($rules); - // Merge all other routes (maintain priority) - foreach ($originalRules as $key => $route) { - if (!isset($rules[$key])) { - $rules[$key] = $route; - } - } + // Insert Fluent Rules before the default '$URLSegment//$Action/$ID/$OtherID' + $rules = $this->insertRuleBefore($rules, '$URLSegment//$Action/$ID/$OtherID', $fluentRules); $request = Injector::inst()->get(HTTPRequest::class); if (!$request) { @@ -159,4 +155,21 @@ protected function getRuleController($existingRule, $localeObj) $this->owner->extend('updateLocalePageController', $controller, $localeObj); return $controller; } + + /** + * Inserts the given rule(s) before another rule + * @param array $rules Array of rules to insert before + * @param string $key Rule to insert the new rules before + * @param array $rule New Rules to insert + * @return array Resulting array of rules + */ + protected function insertRuleBefore(array $rules, $key, array $rule) + { + $i = array_search($key, array_keys($rules)); + if ($i !== false) { + return array_slice($rules, 0, $i, true) + $rule + array_slice($rules, $i, null, true); + } + + return $rules; + } }