Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
220 changed files
with
11,208 additions
and
42,359 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
<?php | ||
/** | ||
* More advanced search form | ||
* @package cms | ||
* @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('SearchByHeader',_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('SortByHeader',_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('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\" = '" . DB::getConn()->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); | ||
} | ||
|
||
} | ||
|
||
?> |
Oops, something went wrong.