PHPackages                             creativecodelabs/silverstripe-searchable-dataobjects-innodb - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Search &amp; Filtering](/categories/search)
4. /
5. creativecodelabs/silverstripe-searchable-dataobjects-innodb

ActiveSilverstripe-module[Search &amp; Filtering](/categories/search)

creativecodelabs/silverstripe-searchable-dataobjects-innodb
===========================================================

This module adds DataObjects to frontend search

1.0(8y ago)08GPL-3.0PHP

Since Feb 13Pushed 8y agoCompare

[ Source](https://github.com/CreativeCodeLabs/silverstripe-searchable-dataobjects-innodb)[ Packagist](https://packagist.org/packages/creativecodelabs/silverstripe-searchable-dataobjects-innodb)[ RSS](/packages/creativecodelabs-silverstripe-searchable-dataobjects-innodb/feed)WikiDiscussions master Synced today

READMEChangelog (1)Dependencies (3)Versions (2)Used By (0)

Searchable DataObjects
======================

[](#searchable-dataobjects)

Searchable DataObjects is a module that permit to include DataObjects into frontend search.

Introduction
------------

[](#introduction)

Pages are not always the better way to implement things. For example site news can grow rapidly and the first side effect would be a big and difficult to manage SiteTree. DataObjects help maintaining things clean and straight, but unfortunately they are not included in frontend search. This module let you insert DataObject in search.

Requirements
------------

[](#requirements)

- SilverStripe 3.2.\*
- zirak/htmlpurifier

### Installation

[](#installation)

Install the module through [composer](http://getcomposer.org):

```
composer require zirak/searchable-dataobjects
composer update

```

Make the DataObject (or Pages) implement Searchable interface (you need to implement Link(), getSearchFilter(), getTitleFields(), getContentFields()):

*Note: `getSearchFilterByCallback()` is an optional filter. If you don't plan on calculating any value to determine a returned `true` or `false` value it is suggested you don't add this function to your `DataObject` or `Page` type.*

```
class DoNews extends DataObject implements Searchable {

    private static $db = array(
        'Title' => 'Varchar',
        'Subtitle' => 'Varchar',
        'News' => 'HTMLText',
        'Date' => 'Date',
    );
    private static $has_one = array(
        'Page' => 'PghNews'
    );

    /**
     * Link to this DO
     * @return string
     */
    public function Link() {
        return $this->Page()->Link() . 'read/' . $this->ID;
    }

    /**
     * Filter array
     * eg. array('Disabled' => 0);
     * @return array
     */
    public static function getSearchFilter() {
        return array();
    }

    /**
     * FilterAny array (optional)
     * eg. array('Disabled' => 0, 'Override' => 1);
     * @return array
     */
    public static function getSearchFilterAny() {
        return array();
    }

    /**
     * FilterByCallback function (optional)
     * eg. function($object){
     *  return ($object->StartDate > date('Y-m-d') || $object->isStillRecurring());
     * };
     * @return array
     */
    public static function getSearchFilterByCallback() {
        return function($object){ return true; };
    }

    /**
     * Fields that compose the Title
     * eg. array('Title', 'Subtitle');
     * @return array
     */
    public function getTitleFields() {
        return array('Title');
    }

    /**
     * Fields that compose the Content
     * eg. array('Teaser', 'Content');
     * @return array
     */
    public function getContentFields() {
        return array('Subtitle', 'Content');
    }
}
```

Here you are a sample page holder, needed to implement the Link() function into the DataObject:

```
class PghNews extends Page {

    private static $has_many = array(
        'News' => 'DoNews'
    );

    public function getCMSFields() {
        $fields = parent::getCMSFields();

        /* News */
        $gridFieldConfig = GridFieldConfig_RelationEditor::create(100);
        // Remove unlink
        $gridFieldConfig->removeComponentsByType('GridFieldDeleteAction');
        // Add delete
        $gridFieldConfig->addComponents(new GridFieldDeleteAction());
        // Remove autocompleter
        $gridFieldConfig->removeComponentsByType('GridFieldAddExistingAutocompleter');
        $field = new GridField('Faq', 'Faq', $this->News(), $gridFieldConfig);
        $fields->addFieldToTab('Root.News', $field);

        return $fields;
    }
}

class PghNews_Controller extends Page_Controller {

    private static $allowed_actions = array(
        'read'
    );

    public function read(SS_HTTPRequest $request) {
        $arguments = $request->allParams();
        $id = $arguments['ID'];

        // Identifico la faq dall'ID
        $Object = DataObject::get_by_id('DoNews', $id);

        if ($Object) {
            //Popolo l'array con il DataObject da visualizzare
            $Data = array($Object->class => $Object);
            $this->data()->Title = $Object->Title;

            $retVal = $this->Customise($Data);
            return $retVal;
        } else {
            //Not found
            return $this->httpError(404, 'Not found');
        }
    }
}
```

Extend Page and the desired DataObjects through the following yaml:

```
Page:
  extensions:
    - SearchableDataObject
DoNews:
  extensions:
    - SearchableDataObject
```

Run a `dev/build` and then populate the search table running PopulateSearch task:

```
sake dev/build "flush=all"
sake dev/tasks/PopulateSearch

```

Enjoy the news into the search results :)

### Modifying

[](#modifying)

#### Set the number of search results per page

[](#set-the-number-of-search-results-per-page)

Setting the `CustomSearch.items_per_page` config setting you can define, how many search results per page are shown. Default is 10

By default the search result is shown at the same page, so if you're searching e.g. on the */about-us/*, the results are shown on */about-us/SearchForm/?s=foo*. If you don't like that, you can define any Page or Controller class in the `CustomSearch.search_controller` setting. If you set this setting to `this`, the current page will be used. Defaults to `SearchPage`and falls back to the current page if no SearchPage is found.

```
CustomSearch:
  items_per_page: 15
  search_controller: SearchPage #page type to show the search
```

### TODO

[](#todo)

- Add other search method in configuration

### Suggested modules

[](#suggested-modules)

- Linkable DataObjects:

###  Health Score

27

—

LowBetter than 47% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity4

Limited adoption so far

Community13

Small or concentrated contributor base

Maturity63

Established project with proven stability

 Bus Factor1

Top contributor holds 52.1% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

3058d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/31959594?v=4)[creativecodelabs](/maintainers/creativecodelabs)[@CreativeCodeLabs](https://github.com/CreativeCodeLabs)

---

Top Contributors

[![g4b0](https://avatars.githubusercontent.com/u/2427390?v=4)](https://github.com/g4b0 "g4b0 (37 commits)")[![rotassator](https://avatars.githubusercontent.com/u/7939537?v=4)](https://github.com/rotassator "rotassator (19 commits)")[![wernerkrauss](https://avatars.githubusercontent.com/u/1043925?v=4)](https://github.com/wernerkrauss "wernerkrauss (5 commits)")[![ntsim](https://avatars.githubusercontent.com/u/9917868?v=4)](https://github.com/ntsim "ntsim (3 commits)")[![nblum](https://avatars.githubusercontent.com/u/7358767?v=4)](https://github.com/nblum "nblum (2 commits)")[![muskie9](https://avatars.githubusercontent.com/u/870751?v=4)](https://github.com/muskie9 "muskie9 (2 commits)")[![jchenevey](https://avatars.githubusercontent.com/u/8449994?v=4)](https://github.com/jchenevey "jchenevey (2 commits)")[![yusuf](https://avatars.githubusercontent.com/u/90121?v=4)](https://github.com/yusuf "yusuf (1 commits)")

---

Tags

searchsilverstripedataobject

### Embed Badge

![Health badge](/badges/creativecodelabs-silverstripe-searchable-dataobjects-innodb/health.svg)

```
[![Health](https://phpackages.com/badges/creativecodelabs-silverstripe-searchable-dataobjects-innodb/health.svg)](https://phpackages.com/packages/creativecodelabs-silverstripe-searchable-dataobjects-innodb)
```

###  Alternatives

[g4b0/searchable-dataobjects

This module adds DataObjects to frontend search

254.9k](/packages/g4b0-searchable-dataobjects)[silverstripe/solr

Solr integration for SilverStripe. Note that this is NOT related to the silverstripe/fulltext package.

1914.0k](/packages/silverstripe-solr)[heyday/silverstripe-elastica

Provides Elastic Search integration for SilverStripe DataObjects using Elastica

1137.9k2](/packages/heyday-silverstripe-elastica)[silverstripe-terraformers/gridfield-rich-filter-header

Rich filter header component for GridField

1326.1k1](/packages/silverstripe-terraformers-gridfield-rich-filter-header)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
