silverstripe-framework/search/AdvancedSearchForm.php
Matt Peel 7d13ba7fb8 Reverted geoffm's accidental commit to /open
git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@50107 467b73ca-7a2a-4603-9d3b-597d59a354a9
2008-02-25 02:10:37 +00:00

144 lines
4.6 KiB
PHP
Executable File

<?php
/**
* @package sapphire
* @subpackage search
*/
/**
* More advanced search form
* @package sapphire
* @subpackage search
*/
class AdvancedSearchForm extends SearchForm {
/**
* the constructor of a Simple/basic SearchForm
*/
function __construct($controller, $name, $fields = null, $actions = null) {
if(!$fields) {
$fields = new FieldSet(
$searchBy = new CompositeField(
new HeaderField(_t('AdvancedSearchForm.SEARCHBY', 'SEARCH BY')),
new TextField("+", _t('AdvancedSearchForm.ALLWORDS', 'All Words')),
new TextField("quote", _t('AdvancedSearchForm.EXACT', 'Exact Phrase')),
new TextField("any", _t('AdvancedSearchForm.ATLEAST', 'At Least One Of the Words')),
new TextField("-", _t('AdvancedSearchForm.WITHOUT', 'Without the Words'))
),
$sortBy = new CompositeField(
new HeaderField(_t('AdvancedSearchForm.SORTBY', 'SORT RESULTS BY')),
new OptionsetField("sortby", "",
array(
'Relevance' => _t('AdvancedSearchForm.RELEVANCE', 'Relevance'),
'LastUpdated' => _t('AdvancedSearchForm.LASTUPDATED', 'Last Updated'),
'PageTitle' => _t('AdvancedSearchForm.PAGETITLE', 'Page Title'),
),
'Relevance'
)
),
$chooseDate = new CompositeField(
new HeaderField(_t('AdvancedSearchForm.LASTUPDATEDHEADER', 'LAST UPDATED')),
new CompositeDateField("From", _t('AdvancedSearchForm.FROM', 'From')),
new CompositeDateField("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 = '" . addslashes($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);
}
}
?>