mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
MINOR Added FulltextSearchable::get_searchable_classes() in order to introspect currently searchable classes, added FulltextSearchableTest, added documentation
git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/branches/2.4@111789 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
parent
25aa5d3c8a
commit
feefb11dae
@ -28,7 +28,7 @@ class ContentControllerSearchExtension extends Extension {
|
||||
new FormAction('results', _t('SearchForm.GO', 'Go'))
|
||||
);
|
||||
$form = new SearchForm($this->owner, 'SearchForm', $fields, $actions);
|
||||
$form->classesToSearch(FulltextSearchable::$searchableClasses);
|
||||
$form->classesToSearch(FulltextSearchable::get_searchable_classes());
|
||||
return $form;
|
||||
}
|
||||
|
||||
|
@ -1,16 +1,41 @@
|
||||
<?php
|
||||
/**
|
||||
* Provides a simple search engine for your site based on the MySQL FULLTEXT index
|
||||
* Provides a simple search engine for your site based on the MySQL FULLTEXT index.
|
||||
* Adds the {@link FulltextSearchable} extension to data classes,
|
||||
* as well as the {@link ContentControllerSearchExtension} to {@link ContentController}.
|
||||
* (this means you can use $SearchForm in your template without changing your own implementation).
|
||||
*
|
||||
* @see http://doc.silverstripe.org/tutorial:4-site-search
|
||||
*
|
||||
* @package sapphire
|
||||
* @subpackage search
|
||||
*/
|
||||
class FulltextSearchable extends DataObjectDecorator {
|
||||
|
||||
/**
|
||||
* @var String Comma-separated list of database column names
|
||||
* that can be searched on. Used for generation of the database index defintions.
|
||||
*/
|
||||
protected $searchFields;
|
||||
static $searchableClasses;
|
||||
|
||||
/**
|
||||
* @var Array List of class names
|
||||
*/
|
||||
protected static $searchable_classes;
|
||||
|
||||
/**
|
||||
* Enable the default configuration of MySQL full-text searching on the given data classes.
|
||||
* It can be used to limit the searched classes, but not to add your own classes.
|
||||
* For this purpose, please use {@link Object::add_extension()} directly:
|
||||
* <code>
|
||||
* Object::add_extension('MyObject', "FulltextSearchable('MySearchableField,'MyOtherField')");
|
||||
* </code>
|
||||
*
|
||||
* Caution: This is a wrapper method that should only be used in _config.php,
|
||||
* and only be called once in your code.
|
||||
*
|
||||
* @param Array $searchableClasses The extension will be applied to all DataObject subclasses
|
||||
* listed here. Default: {@link SiteTree} and {@link File}.
|
||||
*/
|
||||
static function enable($searchableClasses = array('SiteTree', 'File')) {
|
||||
$defaultColumns = array(
|
||||
@ -26,14 +51,19 @@ class FulltextSearchable extends DataObjectDecorator {
|
||||
throw new Exception("FulltextSearchable::enable() I don't know the default search columns for class '$class'");
|
||||
}
|
||||
}
|
||||
self::$searchableClasses = $searchableClasses;
|
||||
self::$searchable_classes = $searchableClasses;
|
||||
|
||||
Object::add_extension("ContentController", "ContentControllerSearchExtension");
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Array|String $searchFields Comma-separated list (or array) of database column names
|
||||
* that can be searched on. Used for generation of the database index defintions.
|
||||
*/
|
||||
function __construct($searchFields) {
|
||||
if(is_array($searchFields)) $this->searchFields = implode(',', $searchFields);
|
||||
else $this->searchFields = $searchFields;
|
||||
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
@ -52,4 +82,14 @@ class FulltextSearchable extends DataObjectDecorator {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows all classes that had the {@link FulltextSearchable} extension applied through {@link enable()}.
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
function get_searchable_classes() {
|
||||
return self::$searchable_classes;
|
||||
}
|
||||
|
||||
}
|
44
tests/search/FulltextSearchableTest.php
Normal file
44
tests/search/FulltextSearchableTest.php
Normal file
@ -0,0 +1,44 @@
|
||||
<?php
|
||||
/**
|
||||
* @package sapphire
|
||||
* @subpackage tests
|
||||
*/
|
||||
|
||||
class FulltextSearchableTest extends SapphireTest {
|
||||
|
||||
function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$this->orig['File_searchable'] = Object::has_extension('File', 'FulltextSearchable');
|
||||
$this->orig['SiteTree_searchable'] = Object::has_extension('SiteTree', 'FulltextSearchable');
|
||||
|
||||
// TODO This shouldn't need all arguments included
|
||||
Object::remove_extension('File', 'FulltextSearchable(\'Filename,Title,Content\')');
|
||||
Object::remove_extension('SiteTree', 'FulltextSearchable(\'Title,MenuTitle,Content,MetaTitle,MetaDescription,MetaKeywords\')');
|
||||
}
|
||||
|
||||
function tearDown() {
|
||||
// TODO This shouldn't need all arguments included
|
||||
if($this->orig['File_searchable']) Object::add_extension('File', 'FulltextSearchable(\'Filename,Title,Content\')');
|
||||
if($this->orig['SiteTree_searchable']) Object::add_extension('SiteTree', 'FulltextSearchable(\'Title,MenuTitle,Content,MetaTitle,MetaDescription,MetaKeywords\')');
|
||||
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
function testEnable() {
|
||||
FulltextSearchable::enable();
|
||||
$this->assertTrue(Object::has_extension('SiteTree', 'FulltextSearchable'));
|
||||
$this->assertTrue(Object::has_extension('File', 'FulltextSearchable'));
|
||||
}
|
||||
|
||||
function testEnableWithCustomClasses() {
|
||||
FulltextSearchable::enable(array('SiteTree'));
|
||||
$this->assertTrue(Object::has_extension('SiteTree', 'FulltextSearchable'));
|
||||
|
||||
// TODO This shouldn't need all arguments included
|
||||
Object::remove_extension('File', 'FulltextSearchable(\'Filename,Title,Content\')');
|
||||
|
||||
$this->assertFalse(Object::has_extension('File', 'FulltextSearchable'));
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user