From 4c4926d2b9018d20de2fb020e1d7990ab115beee Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Mon, 19 Jan 2009 02:18:41 +0000 Subject: [PATCH] FEATURE Enabled specifying a language through a hidden field in SearchForm which limits the search to pages in this language (incl. unit tests) git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@70327 467b73ca-7a2a-4603-9d3b-597d59a354a9 --- search/SearchForm.php | 14 ++++ tests/search/TranslatableSearchFormTest.php | 88 +++++++++++++++++++++ tests/search/TranslatableSearchFormTest.yml | 7 ++ 3 files changed, 109 insertions(+) create mode 100644 tests/search/TranslatableSearchFormTest.php create mode 100644 tests/search/TranslatableSearchFormTest.yml diff --git a/search/SearchForm.php b/search/SearchForm.php index 319894be6..39655647e 100755 --- a/search/SearchForm.php +++ b/search/SearchForm.php @@ -2,6 +2,11 @@ /** * Standard basic search form which conducts a fulltext search on all {@link SiteTree} * objects. + * + * If multilingual content is enabled through the {@link Translatable} extension, + * only pages the currently set language on the holder for this searchform are found. + * The language is set through a hidden field in the form, which is prepoluated + * with {@link Translatable::current_lang()} when then form is constructed. * * @see Use ModelController and SearchContext for a more generic search implementation based around DataObject * @package sapphire @@ -44,6 +49,10 @@ class SearchForm extends Form { )); } + if(Translatable::is_enabled()) { + $fields->push(new HiddenField('lang', 'lang', Translatable::current_lang())); + } + if(!$actions) { $actions = new FieldSet( new FormAction("getResults", _t('SearchForm.GO', 'Go')) @@ -75,6 +84,11 @@ class SearchForm extends Form { public function getResults($pageLength = null, $data = null){ // legacy usage: $data was defaulting to $_REQUEST, parameter not passed in doc.silverstripe.com tutorials if(!isset($data)) $data = $_REQUEST; + + // set language (if present) + if(Translatable::is_enabled() && isset($data['lang'])) { + Translatable::set_reading_lang($data['lang']); + } $keywords = $data['Search']; diff --git a/tests/search/TranslatableSearchFormTest.php b/tests/search/TranslatableSearchFormTest.php new file mode 100644 index 000000000..4132f6b45 --- /dev/null +++ b/tests/search/TranslatableSearchFormTest.php @@ -0,0 +1,88 @@ +origTranslatableSettings['enabled'] = Translatable::is_enabled(); + $this->origTranslatableSettings['default_lang'] = Translatable::default_lang(); + Translatable::enable(); + Translatable::set_default_lang("en"); + + // needs to recreate the database schema with language properties + self::kill_temp_db(); + // refresh the decorated statics - different fields in $db with Translatable enabled + singleton('SiteTree')->loadExtraStatics(); + singleton('TranslatableTest_DataObject')->loadExtraStatics(); + $dbname = self::create_temp_db(); + DB::set_alternative_database_name($dbname); + + parent::setUp(); + + $holderPage = $this->objFromFixture('SiteTree', 'searchformholder'); + $this->mockController = new ContentController($holderPage); + } + + function tearDown() { + if(!$this->origTranslatableSettings['enabled']) Translatable::disable(); + + Translatable::set_default_lang($this->origTranslatableSettings['default_lang']); + + self::kill_temp_db(); + self::create_temp_db(); + + parent::tearDown(); + } + + function testPublishedPagesMatchedByTitleInDefaultLanguage() { + $sf = new SearchForm($this->mockController, 'SearchForm'); + + $publishedPage = $this->objFromFixture('SiteTree', 'publishedPage'); + $publishedPage->publish('Stage', 'Live'); + $translatedPublishedPage = $publishedPage->createTranslation('de'); + $translatedPublishedPage->Title = 'translatedPublishedPage'; + $translatedPublishedPage->Content = 'German content'; + $translatedPublishedPage->write(); + $translatedPublishedPage->publish('Stage', 'Live'); + + // Translatable::set_reading_lang() can't be used because the context + // from the holder is not present here - we set the language explicitly + // through a pseudo GET variable in getResults() + + $lang = 'en'; + $results = $sf->getResults(null, array('Search'=>'content', 'lang'=>$lang)); + $this->assertContains( + $publishedPage->ID, + $results->column('ID'), + 'Published pages are found by searchform in default language' + ); + $this->assertNotContains( + $translatedPublishedPage->ID, + $results->column('ID'), + 'Published pages in another language are not found when searching in default language' + ); + + $lang = 'de'; + $results = $sf->getResults(null, array('Search'=>'content', 'lang'=>$lang)); + $this->assertNotContains( + $publishedPage->ID, + $results->column('ID'), + 'Published pages in default language are not found when searching in another language' + ); + $this->assertContains( + (string)$translatedPublishedPage->ID, + $results->column('ID'), + 'Published pages in another language are found when searching in this language' + ); + } + +} +?> \ No newline at end of file diff --git a/tests/search/TranslatableSearchFormTest.yml b/tests/search/TranslatableSearchFormTest.yml new file mode 100644 index 000000000..22a7c56f9 --- /dev/null +++ b/tests/search/TranslatableSearchFormTest.yml @@ -0,0 +1,7 @@ +SiteTree: + searchformholder: + URLSegment: searchformholder + Title: searchformholder + publishedPage: + Title: publishedPage + Content: English content \ No newline at end of file