diff --git a/code/model/SiteTree.php b/code/model/SiteTree.php index 73c16409..dc6029e6 100644 --- a/code/model/SiteTree.php +++ b/code/model/SiteTree.php @@ -1599,20 +1599,20 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid } } + $votes = array_filter( + (array)$this->extend('augmentValidURLSegment'), + function($v) {return !is_null($v);} + ); + if($votes) { + return min($votes); + } + $existingPage = DataObject::get_one( 'SiteTree', "\"URLSegment\" = '$this->URLSegment' $IDFilter $parentFilter" ); - if ($existingPage) { - return false; - } - - $votes = $this->extend('augmentValidURLSegment'); - if($votes) { - return min($votes); - } - return true; + return !($existingPage); } /** diff --git a/tests/model/SiteTreeTest.php b/tests/model/SiteTreeTest.php index b8ebc8d1..a1722bc4 100644 --- a/tests/model/SiteTreeTest.php +++ b/tests/model/SiteTreeTest.php @@ -4,8 +4,9 @@ * @subpackage tests */ class SiteTreeTest extends SapphireTest { - protected static $fixture_file = 'SiteTreeTest.yml'; + protected static $fixture_file = 'SiteTreeTest.yml'; + protected $illegalExtensions = array( 'SiteTree' => array('SiteTreeSubsites') ); @@ -700,6 +701,18 @@ class SiteTreeTest extends SapphireTest { $this->assertTrue($sitetree->validURLSegment(), 'Valid URLSegment values are allowed'); } + public function testURLSegmentPrioritizesExtensionVotes() { + $sitetree = new SiteTree(); + $sitetree->URLSegment = 'unique-segment'; + $this->assertTrue($sitetree->validURLSegment()); + + SiteTree::add_extension('SiteTreeTest_Extension'); + $sitetree = new SiteTree(); + $sitetree->URLSegment = 'unique-segment'; + $this->assertFalse($sitetree->validURLSegment()); + SiteTree::remove_extension('SiteTreeTest_Extension'); + } + public function testURLSegmentMultiByte() { $origAllow = Config::inst()->get('URLSegmentFilter', 'default_allow_multibyte'); Config::inst()->update('URLSegmentFilter', 'default_allow_multibyte', true); @@ -991,3 +1004,11 @@ class SiteTreeTest_StageStatusInherit extends SiteTree implements TestOnly { return $flags; } } + +class SiteTreeTest_Extension extends DataExtension implements TestOnly { + + public function augmentValidURLSegment() { + return false; + } + +}