_t('AdvancedSearchForm.RELEVANCE', 'Relevance'), 'LastUpdated' => _t('AdvancedSearchForm.LASTUPDATED', 'Last Updated'), 'PageTitle' => _t('AdvancedSearchForm.PAGETITLE', 'Page Title'), ), 'Relevance' ) ), $chooseDate = new CompositeField( new HeaderField('LastUpdatedHeader',_t('AdvancedSearchForm.LASTUPDATEDHEADER', 'LAST UPDATED')), new DateField("From", _t('AdvancedSearchForm.FROM', 'From')), new DateField("To", _t('AdvancedSearchForm.TO', 'To')) ) ); $searchBy->ID = "AdvancedSearchForm_SearchBy"; $searchOnly->ID = "AdvancedSearchForm_SearchOnly"; $sortBy->ID = "AdvancedSearchForm_SortBy"; $chooseDate->ID = "AdvancedSearchForm_ChooseDate"; } if(!$actions) { $actions = new FieldSet( new FormAction("results", _t('AdvancedSearchForm.GO', 'Go')) ); } parent::__construct($controller, $name, $fields, $actions); } public function forTemplate(){ return $this->renderWith(array("AdvancedSearchForm","Form")); } /* Return dataObjectSet of the results, using the form data. */ public function getResults($numPerPage = 10) { $data = $this->getData(); if($data['+']) $keywords .= " +" . ereg_replace(" +", " +", trim($data['+'])); if($data['quote']) $keywords .= ' "' . $data['quote'] . '"'; if($data['any']) $keywords .= ' ' . $data['any']; if($data['-']) $keywords .= " -" . ereg_replace(" +", " -", trim($data['-'])); $keywords = trim($keywords); // This means that they want to just find pages where there's *no* match if($keywords[0] == '-') { $keywords = $data['-']; $invertedMatch = true; } // Limit search to various sections if($_REQUEST['OnlyShow']) { $pageList = array(); // Find the associated pages foreach($_REQUEST['OnlyShow'] as $section => $checked) { $items = explode(",", $section); foreach($items as $item) { $page = DataObject::get_one('SiteTree', "\"URLSegment\" = '" . Convert::raw2sql($item) . "'"); $pageList[] = $page->ID; if(!$page) user_error("Can't find a page called '$item'", E_USER_WARNING); $page->loadDescendantIDListInto($pageList); } } $contentFilter = "\"ID\" IN (" . implode(",", $pageList) . ")"; // Find the files associated with those pages $fileList = DB::query("SELECT \"FileID\" FROM \"Page_ImageTracking\" WHERE \"PageID\" IN (" . implode(",", $pageList) . ")")->column(); if($fileList) $fileFilter = "\"ID\" IN (" . implode(",", $fileList) . ")"; else $fileFilter = " 1 = 2 "; } if($data['From']) { $filter .= ($filter?" AND":"") . " \"LastEdited\" >= '$data[From]'"; } if($data['To']) { $filter .= ($filter?" AND":"") . " \"LastEdited\" <= '$data[To]'"; } if($filter) { $contentFilter .= ($contentFilter?" AND":"") . $filter; $fileFilter .= ($fileFilter?" AND":"") . $filter; } if($data['sortby']) { $sorts = array( 'LastUpdated' => '"LastEdited" DESC', 'PageTitle' => '"Title" ASC', 'Relevance' => '"Relevance" DESC', ); $sortBy = $sorts[$data['sortby']] ? $sorts[$data['sortby']] : $sorts['Relevance']; } $keywords = $this->addStarsToKeywords($keywords); return $this->searchEngine($keywords, $numPerPage, $sortBy, $contentFilter, true, $fileFilter, $invertedMatch); } function getSearchQuery() { $data = $_REQUEST; if($data['+']) $keywords .= " +" . ereg_replace(" +", " +", trim($data['+'])); if($data['quote']) $keywords .= ' "' . $data['quote'] . '"'; if($data['any']) $keywords .= ' ' . $data['any']; if($data['-']) $keywords .= " -" . ereg_replace(" +", " -", trim($data['-'])); return trim($keywords); } } ?>