From 4b4b7cca9a6d13787d303707e16ee3a7a22e820b Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sun, 22 Feb 2009 21:30:41 +0000 Subject: [PATCH] BUGFIX Fixed finding a translated homepage without an explicit URLSegment (e.g. http://mysite.com/?lang=de) - see #3540 ENHANCEMENT Added Translatable::get_homepage_urlsegment_by_language() ENHANCEMENT Added RootURLController::get_default_homepage_urlsegment() git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@72054 467b73ca-7a2a-4603-9d3b-597d59a354a9 --- core/control/ModelAsController.php | 6 ++--- core/control/RootURLController.php | 33 ++++++++++++++++++++++----- core/model/Translatable.php | 25 +++++++++++++++++++++ tests/model/TranslatableTest.php | 36 +++++++++++++++++++++++++++++- tests/model/TranslatableTest.yml | 4 ++++ 5 files changed, 95 insertions(+), 9 deletions(-) diff --git a/core/control/ModelAsController.php b/core/control/ModelAsController.php index 925b48dcb..13428ef12 100644 --- a/core/control/ModelAsController.php +++ b/core/control/ModelAsController.php @@ -38,9 +38,9 @@ class ModelAsController extends Controller implements NestedController { $url = Controller::join_links( Director::baseURL(), $child->URLSegment, - $this->urlParams['Action'], - $this->urlParams['ID'], - $this->urlParams['OtherID'] + (isset($this->urlParams['Action'])) ? $this->urlParams['Action'] : null, + (isset($this->urlParams['ID'])) ? $this->urlParams['ID'] : null, + (isset($this->urlParams['OtherID'])) ? $this->urlParams['OtherID'] : null ); $response = new HTTPResponse(); diff --git a/core/control/RootURLController.php b/core/control/RootURLController.php index 60d4bad15..9ae06d7e4 100755 --- a/core/control/RootURLController.php +++ b/core/control/RootURLController.php @@ -6,8 +6,19 @@ * @subpackage control */ class RootURLController extends Controller { + + /** + * @var boolean $is_at_root + */ protected static $is_at_root = false; + /** + * @var string $default_homepage_urlsegment Defines which URLSegment value on a {@link SiteTree} object + * is regarded as the correct "homepage" if the requested URI doesn't contain + * an explicit segment. E.g. http://mysite.com should show http://mysite.com/home. + */ + protected static $default_homepage_urlsegment = 'home'; + public function init() { Director::set_site_mode('site'); parent::init(); @@ -20,7 +31,6 @@ class RootURLController extends Controller { $this->init(); $controller = new ModelAsController(); - $request = new HTTPRequest("GET", self::get_homepage_urlsegment().'/', $request->getVars(), $request->postVars()); $request->match('$URLSegment//$Action', true); @@ -32,9 +42,13 @@ class RootURLController extends Controller { /** * Return the URL segment for the current HTTP_HOST value + * + * @return string */ static function get_homepage_urlsegment() { - // Temporarily restricted to MySQL database while testing db abstraction + $urlSegment = ''; + + // @todo Temporarily restricted to MySQL database while testing db abstraction if(DB::getConn() instanceof MySQLDatabase) { $host = $_SERVER['HTTP_HOST']; $host = str_replace('www.','',$host); @@ -45,10 +59,12 @@ class RootURLController extends Controller { } if($homePageOBJ) { - return $homePageOBJ->URLSegment; - } else { - return 'home'; + $urlSegment = $homePageOBJ->URLSegment; + } elseif(Translatable::is_enabled()) { + $urlSegment = Translatable::get_homepage_urlsegment_by_language(Translatable::current_lang()); } + + return ($urlSegment) ? $urlSegment : self::get_default_homepage_urlsegment(); } /** @@ -59,6 +75,13 @@ class RootURLController extends Controller { if(!self::$is_at_root) return self::get_homepage_urlsegment() == $currentPage->URLSegment; else return false; } + + /** + * @return string + */ + static function get_default_homepage_urlsegment() { + return self::$default_homepage_urlsegment; + } } ?> \ No newline at end of file diff --git a/core/model/Translatable.php b/core/model/Translatable.php index f6ec1759e..0f75c8953 100755 --- a/core/model/Translatable.php +++ b/core/model/Translatable.php @@ -815,6 +815,31 @@ class Translatable extends DataObjectDecorator { } return $returnMap; } + + /** + * Gets a URLSegment value for a homepage in another language. + * The value is inferred by finding the homepage in default language + * (as identified by RootURLController::$default_homepage_urlsegment). + * Returns NULL if no translated page can be found. + * + * @param string $Lang + * @return string|boolean URLSegment (e.g. "home") + */ + static function get_homepage_urlsegment_by_language($lang) { + $origHomepageObj = Translatable::get_one_by_lang( + 'SiteTree', + Translatable::default_lang(), + sprintf('"URLSegment" = \'%s\'', RootUrlController::get_default_homepage_urlsegment()) + ); + if($origHomepageObj) { + $translatedHomepageObj = $origHomepageObj->getTranslation(Translatable::current_lang()); + if($translatedHomepageObj) { + return $translatedHomepageObj->URLSegment; + } + } + + return null; + } } diff --git a/tests/model/TranslatableTest.php b/tests/model/TranslatableTest.php index 6da481ff6..54d0167e2 100644 --- a/tests/model/TranslatableTest.php +++ b/tests/model/TranslatableTest.php @@ -41,7 +41,7 @@ class TranslatableTest extends FunctionalTest { parent::tearDown(); } - + function testGetOriginalPage() { $origPage = $this->objFromFixture('Page', 'testpage_en'); $translatedPage = $origPage->createTranslation('de'); @@ -478,6 +478,40 @@ class TranslatableTest extends FunctionalTest { // reset language Translatable::set_reading_lang('en'); } + + function testRootUrlDefaultsToTranslatedUrlSegment() { + $_originalHost = $_SERVER['HTTP_HOST']; + + $origPage = $this->objFromFixture('Page', 'homepage_en'); + $origPage->publish('Stage', 'Live'); + $translationDe = $origPage->createTranslation('de'); + $translationDe->URLSegment = 'heim'; + $translationDe->write(); + $translationDe->publish('Stage', 'Live'); + + // test with translatable enabled + $_SERVER['HTTP_HOST'] = '/?lang=de'; + Translatable::set_reading_lang('de'); + $this->assertEquals( + RootURLController::get_homepage_urlsegment(), + 'heim', + 'Homepage with different URLSegment in non-default language is found' + ); + + // test with translatable disabled + Translatable::disable(); + $_SERVER['HTTP_HOST'] = '/'; + $this->assertEquals( + RootURLController::get_homepage_urlsegment(), + 'home', + 'Homepage is showing in default language if ?lang GET variable is left out' + ); + Translatable::enable(); + + // setting back to default + Translatable::set_reading_lang('en'); + $_SERVER['HTTP_HOST'] = $_originalHost; + } } class TranslatableTest_DataObject extends DataObject implements TestOnly { diff --git a/tests/model/TranslatableTest.yml b/tests/model/TranslatableTest.yml index 16110d54e..ab5d72b5b 100644 --- a/tests/model/TranslatableTest.yml +++ b/tests/model/TranslatableTest.yml @@ -1,4 +1,8 @@ Page: + homepage_en: + Title: Home + URLSegment: home + Lang: en testpage_en: Title: Home MenuTitle: A Testpage