ENHANCEMENT: Made the tree search form more extensible.

- Use DataQuery for generating the search query.
- For custom field matching, use searchcontext rather than a LIKE query.
- Added an extension hook for updating the search form.
This commit is contained in:
Andrew Short 2012-06-11 18:36:41 +10:00 committed by Will Rossiter
parent 97d678b258
commit 21bcc01878
2 changed files with 30 additions and 22 deletions

View File

@ -303,6 +303,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
->unsetValidator(); ->unsetValidator();
$form->loadDataFrom($this->request->getVars()); $form->loadDataFrom($this->request->getVars());
$this->extend('updateSearchForm', $form);
return $form; return $form;
} }

View File

@ -173,46 +173,53 @@ class CMSSiteTreeFilter_Search extends CMSSiteTreeFilter {
* *
* @return Array * @return Array
*/ */
function pagesIncluded() { public function pagesIncluded() {
$sng = singleton('SiteTree');
$ids = array(); $ids = array();
$q = new SQLQuery();
$q->setSelect(array('"ID"','"ParentID"')) $query = new DataQuery('SiteTree');
->setFrom('"SiteTree"'); $query->setQueriedColumns(array('ID', 'ParentID'));
$where = array();
foreach($this->params as $name => $val) {
$SQL_params = Convert::raw2sql($this->params); $SQL_val = Convert::raw2sql($val);
foreach($SQL_params as $name => $val) {
switch($name) { switch($name) {
// Match against URLSegment, Title, MenuTitle & Content
case 'Term': case 'Term':
if($val) $where[] = "\"URLSegment\" LIKE '%$val%' OR \"Title\" LIKE '%$val%' OR \"MenuTitle\" LIKE '%$val%' OR \"Content\" LIKE '%$val%'"; $query->whereAny(array(
"\"URLSegment\" LIKE '%$SQL_val%'",
"\"Title\" LIKE '%$SQL_val%'",
"\"MenuTitle\" LIKE '%$SQL_val%'",
"\"Content\" LIKE '%$SQL_val%'"
));
break; break;
// Match against date
case 'LastEditedFrom': case 'LastEditedFrom':
if($val) $where[] = "\"LastEdited\" >= '$val'"; $query->where("\"LastEdited\" >= '$SQL_val'");
break; break;
case 'LastEditedTo': case 'LastEditedTo':
if($val) $where[] = "\"LastEdited\" <= '$val'"; $query->where("\"LastEdited\" <= '$SQL_val'");
break; break;
// Match against exact ClassName
case 'ClassName': case 'ClassName':
if($val && $val != 'All') { if($val && $val != 'All') {
$where[] = "\"ClassName\" = '$val'"; $query->where("\"ClassName\" = '$SQL_val'");
} }
break; break;
default: default:
// Partial string match against a variety of fields if(!empty($val) && $sng->hasDatabaseField($name)) {
if(!empty($val) && singleton("SiteTree")->hasDatabaseField($name)) { $filter = $sng->dbObject($name)->defaultSearchFilter();
$where[] = "\"$name\" LIKE '%$val%'"; $filter->setValue($val);
$filter->apply($query);
} }
} }
} }
$q->setWhere(empty($where) ? '' : '(' . implode(') AND (',$where) . ')');
foreach($q->execute() as $row) { foreach($query->execute() as $row) {
$ids[] = array('ID'=>$row['ID'],'ParentID'=>$row['ParentID']); $ids[] = array('ID' => $row['ID'], 'ParentID' => $row['ParentID']);
} }
return $ids; return $ids;
} }
} }