BUGFIX: Search didn't respect searchableClasses passed to FulltextSearchable::enable() (from r111464)

git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@112905 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
Sam Minnee 2010-10-19 03:54:51 +00:00
parent 0d19b45155
commit dd1c02cd90
4 changed files with 42 additions and 16 deletions

View File

@ -1,38 +1,40 @@
<?php
/**
* Extension to provide a search interface when applied to ContentController
*
*
* @package sapphire
* @subpackage search
*/
class ContentControllerSearchExtension extends Extension {
class ContentControllerSearchExtension extends Extension {
static $allowed_actions = array(
'SearchForm',
'results',
);
/**
* Site search form
*/
function SearchForm() {
$searchText = _t('SearchForm.SEARCH', 'Search');
if($this->owner->request) {
$searchText = $this->owner->request->getVar('Search');
}
$fields = new FieldSet(
new TextField('Search', false, $searchText)
);
$actions = new FieldSet(
new FormAction('results', _t('SearchForm.GO', 'Go'))
);
return new SearchForm($this->owner, 'SearchForm', $fields, $actions);
$form = new SearchForm($this->owner, 'SearchForm', $fields, $actions);
$form->classesToSearch(FulltextSearchable::$searchableClasses);
return $form;
}
/**
* 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

View File

@ -1,13 +1,14 @@
<?php
/**
* Provides a simple search engine for your site based on the MySQL FULLTEXT index
*
*
* @package sapphire
* @subpackage search
*/
class FulltextSearchable extends DataObjectDecorator {
protected $searchFields;
static $searchableClasses;
/**
* Enable the default configuration of MySQL full-text searching on the given data classes.
*/
@ -16,7 +17,7 @@ class FulltextSearchable extends DataObjectDecorator {
'SiteTree' => 'Title,MenuTitle,Content,MetaTitle,MetaDescription,MetaKeywords',
'File' => 'Filename,Title,Content'
);
if(!is_array($searchableClasses)) $searchableClasses = array($searchableClasses);
foreach($searchableClasses as $class) {
if(isset($defaultColumns[$class])) {
@ -25,25 +26,26 @@ class FulltextSearchable extends DataObjectDecorator {
throw new Exception("FulltextSearchable::enable() I don't know the default search columns for class '$class'");
}
}
self::$searchableClasses = $searchableClasses;
Object::add_extension("ContentController", "ContentControllerSearchExtension");
}
function __construct($searchFields) {
if(is_array($searchFields)) $this->searchFields = implode(',', $searchFields);
else $this->searchFields = $searchFields;
parent::__construct();
}
function extraStatics($class = null, $extension = null) {
if($extension && preg_match('/\([\'"](.*)[\'"]\)/', $extension, $matches)) {
$searchFields = $matches[1];
return array(
'indexes' => array(
"SearchFields" => Array(
'type'=>'fulltext',
'name'=>'SearchFields',
'type'=>'fulltext',
'name'=>'SearchFields',
'value'=> $searchFields
),
)

View File

@ -78,6 +78,15 @@ class SearchForm extends Form {
$legalClasses = array_intersect($classes, array('SiteTree', 'File'));
$this->classesToSearch = $legalClasses;
}
/**
* Get the classes to search
*
* @return array
*/
function getClassesToSearch() {
return $this->classesToSearch;
}
/**
* Return dataObjectSet of the results using $_REQUEST to get info from form.

View File

@ -0,0 +1,13 @@
<?php
class ContentControllerSearchExtensionTest extends SapphireTest {
function testCustomSearchFormClassesToTest() {
FulltextSearchable::enable('File');
$page = new Page();
$controller = new ContentController($page);
$form = $controller->SearchForm();
$this->assertEquals(array('File'), $form->getClassesToSearch());
}
}