From b632c8ff881445834c71b5114af51d048cb9789f Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Tue, 25 May 2010 03:18:25 +0000 Subject: [PATCH] BUGFIX: Fix #5097, Translatable uses augmentValidURLSegment to check that URLSegment is valid (from r99850) git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@105539 467b73ca-7a2a-4603-9d3b-597d59a354a9 --- core/model/Translatable.php | 41 ++++++++++++++++++++++++++++++++ tests/model/TranslatableTest.php | 2 ++ 2 files changed, 43 insertions(+) diff --git a/core/model/Translatable.php b/core/model/Translatable.php index abc4c8cb5..49a4baf58 100755 --- a/core/model/Translatable.php +++ b/core/model/Translatable.php @@ -1159,6 +1159,14 @@ class Translatable extends DataObjectDecorator implements PermissionProvider { $newTranslation->ID = 0; $newTranslation->Locale = $locale; + + $originalPage = $this->getTranslation(self::default_locale()); + if ($originalPage) { + $urlSegment = $originalPage->URLSegment; + } else { + $urlSegment = $newTranslation->URLSegment; + } + $newTranslation->URLSegment = $urlSegment . '-' . i18n::convert_rfc1766($locale); // hacky way to set an existing translation group in onAfterWrite() $translationGroupID = $this->getTranslationGroup(); $newTranslation->_TranslationGroupID = $translationGroupID ? $translationGroupID : $this->owner->ID; @@ -1460,6 +1468,39 @@ class Translatable extends DataObjectDecorator implements PermissionProvider { function cacheKeyComponent() { return 'locale-'.self::get_current_locale(); } + + /** + * Extends the SiteTree::validURLSegment() method, to do checks appropriate + * to Translatable + * + * @return bool + */ + public function augmentValidURLSegment() { + if (self::locale_filter_enabled()) { + self::disable_locale_filter(); + $reEnableFilter = true; + } + $IDFilter = ($this->owner->ID) ? "AND \"SiteTree\".\"ID\" <> {$this->owner->ID}" : null; + $parentFilter = null; + + if(SiteTree::nested_urls()) { + if($this->owner->ParentID) { + $parentFilter = " AND \"SiteTree\".\"ParentID\" = {$this->owner->ParentID}"; + } else { + $parentFilter = ' AND "SiteTree"."ParentID" = 0'; + } + } + + $existingPage = DataObject::get_one( + 'SiteTree', + "\"URLSegment\" = '{$this->owner->URLSegment}' $IDFilter $parentFilter", + false // disable get_one cache, as this otherwise may pick up results from when locale_filter was on + ); + if ($reEnableFilter) { + self::enable_locale_filter(); + } + return !$existingPage; + } } diff --git a/tests/model/TranslatableTest.php b/tests/model/TranslatableTest.php index ae7b505cb..1ab8b5fd6 100755 --- a/tests/model/TranslatableTest.php +++ b/tests/model/TranslatableTest.php @@ -173,6 +173,8 @@ class TranslatableTest extends FunctionalTest { function testTranslationCantHaveSameURLSegmentAcrossLanguages() { $origPage = $this->objFromFixture('Page', 'testpage_en'); $translatedPage = $origPage->createTranslation('de_DE'); + $this->assertEquals($translatedPage->URLSegment, 'testpage-de-DE'); + $translatedPage->URLSegment = 'testpage'; $translatedPage->write();