function testPublishedPagesMatchedByTitleInDefaultLanguage() { $sf = new SearchForm($this->mockController, 'SearchForm'); $publishedPage = $this->objFromFixture('SiteTree', 'publishedPage'); $publishedPage->publish('Stage', 'Live'); $translatedPublishedPage = $publishedPage->createTranslation('de_DE'); $translatedPublishedPage->Title = 'translatedPublishedPage'; $translatedPublishedPage->Content = 'German content'; $translatedPublishedPage->write(); $translatedPublishedPage->publish('Stage', 'Live'); $this->waitUntilIndexingFinished(); // Translatable::set_current_locale() 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_US'; $results = $sf->getResults(null, array('Search' => 'content', 'locale' => $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_DE'; $results = $sf->getResults(null, array('Search' => 'content', 'locale' => $lang)); $this->assertNotContains($publishedPage->ID, $results->column('ID'), 'Published pages in default language are not found when searching in another language'); $actual = $results->column('ID'); array_walk($actual, 'intval'); $this->assertContains((int) $translatedPublishedPage->ID, $actual, 'Published pages in another language are found when searching in this language'); }
function testDisabledShowInSearchFlagNotIncluded() { $sf = new SearchForm($this->mockController, 'SearchForm'); $page = $this->objFromFixture('SiteTree', 'dontShowInSearchPage'); $results = $sf->getResults(null, array('Search' => 'dontShowInSearchPage')); $this->assertNotContains($page->ID, $results->column('ID'), 'Page with "Show in Search" disabled doesnt show'); }
/** * Process and render search results. * * @param array $data The raw request data submitted by user * @param SearchForm $form The form instance that was submitted * @param SS_HTTPRequest $request Request generated for this action */ function modulesearchformresults($data, $form, $request) { $data = array('Results' => $form->getResults(), 'Query' => $form->getSearchQuery(), 'Title' => _t('SearchForm.SearchResults', 'Search Results')); //search tags //search authors if ($data["Results"]) { foreach ($data["Results"] as $key => $resultItem) { if (!$resultItem instanceof ModuleProduct) { $data["Results"]->remove($resultItem); } } } else { $data["Results"] = new ArrayList(); } $search = Convert::raw2sql($data["Query"]); if (strlen($search) > 2) { $additionalProducts = ModuleProduct::get()->filterAny(array("Code:PartialMatch" => $search, "MenuTitle:PartialMatch" => $search)); if ($additionalProducts) { foreach ($additionalProducts as $moduleProduct) { $data["Results"]->push($moduleProduct); } } $tags = EcommerceProductTag::get()->filterAny(array("Title:PartialMatch" => $search, "Synonyms:PartialMatch" => $search, "Explanation:PartialMatch" => $search)); if ($tags->count()) { foreach ($tags as $tag) { $rows = DB::query("SELECT ProductID FROM EcommerceProductTag_Products WHERE EcommerceProductTagID = " . $tag->ID); if ($rows) { foreach ($rows as $row) { $item = ModuleProduct::get()->byID($row["ProductID"]); if ($item) { $data["Results"]->push($item); } } } } } $authors = Member::get()->filterAny(array("ScreenName:PartialMatch" => $search, "FirstName:PartialMatch" => $search, "Surname:PartialMatch" => $search)); if ($authors->count()) { foreach ($authors as $author) { $rows = DB::query("SELECT \"ModuleProductID\" FROM \"ModuleProduct_Authors\" WHERE \"MemberID\" = " . $author->ID); if ($rows) { foreach ($rows as $row) { $item = ModuleProduct::get()->byID($row["ModuleProductID"]); if ($item) { $data["Results"]->push($item); } } } } } } if ($data["Results"] && $data["Results"] instanceof DataObjectSet) { $data["Results"]->removeDuplicates(); } if (Director::is_ajax()) { return Convert::array2json(array("ModuleProducts" => $data["Results"]->column("ID"))); } return $this->customise(array("Products" => $data["Results"])); }
function testSearchTitleAndContentWithSpecialCharacters() { $sf = new SearchForm($this->mockController, 'SearchForm'); $pageWithSpecialChars = $this->objFromFixture('SiteTree', 'pageWithSpecialChars'); $pageWithSpecialChars->publish('Stage', 'Live'); $results = $sf->getResults(null, array('Search' => 'Brötchen')); $this->assertContains($pageWithSpecialChars->ID, $results->column('ID'), 'Published pages with umlauts in title are found'); $results = $sf->getResults(null, array('Search' => 'Bäcker')); $this->assertContains($pageWithSpecialChars->ID, $results->column('ID'), 'Published pages with htmlencoded umlauts in content are found'); }
public function testSearchTitleAndContentWithSpecialCharacters() { if (!$this->checkFulltextSupport()) { return; } if (class_exists('PostgreSQLDatabase') && DB::get_conn() instanceof PostgreSQLDatabase) { $this->markTestSkipped("PostgreSQLDatabase doesn't support entity-encoded searches"); } $sf = new SearchForm($this->mockController, 'SearchForm'); $pageWithSpecialChars = $this->objFromFixture('SiteTree', 'pageWithSpecialChars'); $pageWithSpecialChars->publish('Stage', 'Live'); $results = $sf->getResults(null, array('Search' => 'Brötchen')); $this->assertContains($pageWithSpecialChars->ID, $results->column('ID'), 'Published pages with umlauts in title are found'); $results = $sf->getResults(null, array('Search' => 'Bäcker')); $this->assertContains($pageWithSpecialChars->ID, $results->column('ID'), 'Published pages with htmlencoded umlauts in content are found'); }
/** * Process and render search results. This has been hacked a bit to load * products into the list (if they exists). Will need to come up with a more * elegant solution to dealing with complex searches of objects though. * * @param array $data The raw request data submitted by user * @param SearchForm $form The form instance that was submitted * @param SS_HTTPRequest $request Request generated for this action */ public function results($data, $form, $request) { $results = $form->getResults(); // For the moment this will also need to be added to your // Page_Controller::results() method (until a more elegant solution can // be found if (class_exists("Product")) { $products = Product::get()->filterAny(array("Title:PartialMatch" => $data["Search"], "StockID" => $data["Search"], "Content:PartialMatch" => $data["Search"])); $results->merge($products); } $results = $results->sort("Title", "ASC"); $data = array('Results' => PaginatedList::create($results, $this->request), 'Query' => $form->getSearchQuery(), 'Title' => _t('SearchForm.SearchResults', 'Search Results')); return $this->owner->customise($data)->renderWith(array('Page_results', 'SearchResults', 'Page')); }
/** * Process and render search results. * * @param array $data The raw request data submitted by user * @param SearchForm $form The form instance that was submitted * @param SS_HTTPRequest $request Request generated for this action */ public function results($data, $form, $request) { $data = array('Results' => $form->getResults(), 'Query' => $form->getSearchQuery(), 'Title' => _t('SearchForm.SearchResults', 'Search Results')); return $this->owner->customise($data)->renderWith(array('Page_results', 'Page')); }
/** * Gets the results from the given query. * * Appends to the usual results the matches on the GtkdocSection * instances on the following order: * * 1. GtkdocSections with matches in 'Title' * 2. GtkdocSections with matches in 'MetaDescription' * 3. GtkdocSections with matches in 'Content' * * Eventual duplicates are dropped from the list. * * @param array $data The raw data submitted by user * @param SearchForm $form The form instance * @param SS_HTTPRequest $request Request for this action */ public function results($data, $form, $request) { $keywords = $data['Search']; // Populate the first matches in the usual way $matches = $form->getResults()->toArray(); // Get the list of GtkdocSection with matching title... $context = singleton('GtkdocSection')->getDefaultSearchContext(); $gtkdoc_matches = $context->getResults(array('Title' => $keywords))->toArray(); // ...and add to them the list of GtkdocSection with matching // description and matching content, skipping the duplicates... self::merge($gtkdoc_matches, $context->getResults(array('MetaDescription' => $keywords))->toArray()); self::merge($gtkdoc_matches, $context->getResults(array('Content' => $keywords))->toArray()); // Append the GtkdocSection matches to the original ones $matches = array_merge($matches, $gtkdoc_matches); $results = new PaginatedList(new ArrayList($matches)); $results->setPageLength(10); $results->setLimitItems(true); $results->setPageStart($request->getVar('start')); $data = array('Results' => $results, 'Query' => $form->getSearchQuery(), 'Title' => _t('SearchForm.SearchResults', 'Search Results')); return $this->owner->customise($data)->renderWith(array('Page_results', 'Page')); }
/** * Overrides the ContentControllerSearchExtension and adds snippets to results. * * @param array $data * @param SearchForm $form * @param SS_HTTPRequest $request * @return HTMLText */ function results($data, $form, $request) { $result = null; $results = $form->getResults(); $query = $form->getSearchQuery(); // Add context summaries based on the queries. foreach ($results as $result) { $contextualTitle = new Text(); $contextualTitle->setValue($result->MenuTitle ? $result->MenuTitle : $result->Title); $result->ContextualTitle = $contextualTitle->ContextSummary(300, $query); if (!$result->Content && $result->ClassName == 'File') { // Fake some content for the files. $result->ContextualContent = "A file named \"{$result->Name}\" ({$result->Size})."; } else { // /(.?)\[embed(.*?)\](.+?)\[\/\s*embed\s*\](.?)/gi $valueField = $result->obj('Content'); $valueField->setValue(ShortcodeParser::get_active()->parse($valueField->getValue())); $result->ContextualContent = $valueField->ContextSummary(300, $query); } } $rssLink = HTTP::setGetVar('rss', '1'); // Render the result. $context = array('Results' => $results, 'Query' => $query, 'Title' => _t('SearchForm.SearchResults', 'Search Results'), 'RSSLink' => $rssLink); // Choose the delivery method - rss or html. if (!$this->owner->request->getVar('rss')) { // Add RSS feed to normal search. RSSFeed::linkToFeed($rssLink, "Search results for query \"{$query}\"."); $result = $this->owner->customise($context)->renderWith(array('Page_results', 'Page')); } else { // De-paginate and reorder. Sort-by-relevancy doesn't make sense in RSS context. $fullList = $results->getList()->sort('LastEdited', 'DESC'); // Get some descriptive strings $siteName = SiteConfig::current_site_config()->Title; $siteTagline = SiteConfig::current_site_config()->Tagline; if ($siteName) { $title = "{$siteName} search results for query \"{$query}\"."; } else { $title = "Search results for query \"{$query}\"."; } // Generate the feed content. $rss = new RSSFeed($fullList, $this->owner->request->getURL(), $title, $siteTagline, "Title", "ContextualContent", null); $rss->setTemplate('Page_results_rss'); $result = $rss->outputToBrowser(); } return $result; }