A silverstripe search module that utilizes TNTSearch to index content.
composer require werkbot/werkbot-search
Add the following extensions to Page
Page::add_extension(SearchableExtension::class);
PageController::add_extension(SearchControllerExtension::class);You will need to run dev/build
The Page::class will need to have a function getIndexQuery defined. Here is an example for Page:
/**
* getIndexQuery
* This query is used when building the index
*
* @return string|boolean - FALSE if not set
*/
public function getIndexQuery()
{
$class = get_class($this);
$class = str_replace('\\', '\\\\', $class);
/*
Alternatively, just use the short class name of the current file
Example: "Page"
*/
$indexQueryDeclaringClassShortname = $this->owner->getIndexQueryDeclaringClassShortname();
return <<<SQL
SELECT
concat("{$indexQueryDeclaringClassShortname}_", SiteTree_Live.ID) AS ID,
SiteTree_Live.ClassName,
SiteTree_Live.Title,
SiteTree_Live.Content
FROM
Page
LEFT JOIN
SiteTree_Live
ON
SiteTree_Live.ID = Page.ID
WHERE
SiteTree_Live.ShowInSearch = '1'
AND
-- Keeps subclasses from re-indexing duplicates
SiteTree_Live.ClassName = '$class'
AND
SiteTree_Live.Content IS NOT NULL
SQL;
}This is a simple query that is used by the indexer to index your content.
This function can be customized however you like and also can be added to DataObjects.
Note that if the getIndexQuery method is defined in a DataExtension, the SearchableExtension must be added before the extension that adds the method. Otherwise the method will return the default: false.
SearchableDataObject::add_extension(SearchableExtension::class); // MUST BE APPLIED FIRST for getIndexQuery to return SQL Query string.
SearchableDataObject::add_extension(SearchableDataObjectExtension::class); // Defines getIndexQuery SQL Query string.By default, the templates used here use classes provided by external css libraries. We suggest installing both for the best experience:
- Werkbot Framewerk (CSS Libarary)
- Font Awesome 6 (Icon classes)