Search by

werkbot / werkbot-search

werkbot

Provides search functionality with TNTSearch

Package info

github.com/werkbot/silverstripe-module-search

Type:silverstripe-vendormodule

pkg:composer/werkbot/werkbot-search

Statistics

Installs: 2 300

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

4.0.1 2026-10-22 20:01 UTC

README

Latest Stable Version Total Downloads Latest Unstable Version License PHP Version Require

A silverstripe search module that utilizes TNTSearch to index content.

Installation

composer require werkbot/werkbot-search

Requirements

Setup

Add the following extensions to Page

Page::add_extension(SearchableExtension::class);
PageController::add_extension(SearchControllerExtension::class);

You will need to run dev/build

Define getIndexQuery on Page

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 * FROM (
      SELECT
        concat("{$indexQueryDeclaringClassShortname}_", SiteTree_Live.ID) AS ID,
        SiteTree_Live.ClassName,
        SiteTree_Live.Title,
        CONCAT_WS(
          ' ',
          SiteTree_Live.Title,
          SiteTree_Live.Content
        ) as 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'
    ) AS BASE
      WHERE
        Content != '';
  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.

Data Extensions

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.

External Libraries

By default, the templates used here use classes provided by external css libraries. We suggest installing both for the best experience:

Usage