Skip to content

Commit

Permalink
Added Search Terms for Searchable Pages (#42)
Browse files Browse the repository at this point in the history
* Added Search Terms for all searchable objects
* SiteTree objects will have search settings added to their Settings tab
* DataObjects will have  search settings added to their main tab
  • Loading branch information
aletail committed May 31, 2024
1 parent e87f934 commit 90cf0ed
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 0 deletions.
21 changes: 21 additions & 0 deletions src/SearchTerm.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace Werkbot\Search;

use SilverStripe\ORM\DataObject;

class SearchTerm extends DataObject
{
private static $singular_name = 'Search Term';
private static $plural_name = 'Search Terms';
private static $table_name = 'SearchTerm';

private static $db = [
'SearchTermText' => 'Text',
'SortOrder' => 'Int',
];

private static $has_one = [
'SearchTermOf' => DataObject::class,
];
}
94 changes: 94 additions & 0 deletions src/SearchableExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,35 @@

namespace Werkbot\Search;

use SilverStripe\Forms\Tab;
use SilverStripe\Forms\TabSet;
use SilverStripe\Core\ClassInfo;
use SilverStripe\ORM\DataObject;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TextField;
use SilverStripe\Forms\FieldGroup;
use SilverStripe\ORM\DataExtension;
use SilverStripe\Forms\CheckboxField;
use SilverStripe\Versioned\Versioned;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig;
use SilverStripe\Forms\GridField\GridFieldButtonRow;
use SilverStripe\Forms\GridField\GridFieldDeleteAction;
use SilverStripe\Forms\GridField\GridFieldToolbarHeader;
use Symbiote\GridFieldExtensions\GridFieldOrderableRows;
use Symbiote\GridFieldExtensions\GridFieldEditableColumns;
use Symbiote\GridFieldExtensions\GridFieldAddNewInlineButton;

class SearchableExtension extends DataExtension
{
private static $has_many = [
'SearchTerms' => SearchTerm::class . '.SearchTermOf',
];

private static $owns = [
'SearchTerms',
];

/*
Column names for the "Title" and "Content" search fields
Override these to set them to a different column name
Expand All @@ -19,6 +42,73 @@ class SearchableExtension extends DataExtension
"getSearchableTitle" => "Text",
"getSearchableSummary" => 'HTMLText',
];
/**
* updateCMSFields
* Adds the SearchTerms GridField to the CMS tab
* This should only be applied to Data objects
*
* @param FieldList $fields
* @return void
**/
public function updateCMSFields(FieldList $fields)
{
if (DataObject::getSchema()->baseDataClass($this->owner->ClassName) != "SilverStripe\CMS\Model\SiteTree") {
$this->addSearchSettingFields($fields);
}
parent::updateCMSFields($fields);
}
/**
* updateSettingsFields
* Adds the SearchTerms GridField to the settings tab
* This should only be applied to SiteTree objects
*
* @param FieldList $fields
* @return void
**/
public function updateSettingsFields(FieldList $fields)
{
if (DataObject::getSchema()->baseDataClass($this->owner->ClassName) == "SilverStripe\CMS\Model\SiteTree") {
$this->addSearchSettingFields($fields);
}
}

public function addSearchSettingFields(FieldList &$fields)
{
$fields->addFieldToTab('Root', new TabSet('Search', new Tab('Main')));

if ($this->owner->hasField("ShowInSearch")) {
$fields->removeByName('ShowInSearch');
$ShowInSearch = CheckboxField::create("ShowInSearch", $this->owner->fieldLabel('ShowInSearch'));
$ShowInSearchGroup = FieldGroup::create(
'Settings',
$ShowInSearch
);
$fields->addFieldToTab('Root.Search.Main', $ShowInSearchGroup);
}

$SearchTermsGridField = GridField::create(
'SearchTerms',
'Enter Search Terms',
$this->owner->SearchTerms(),
GridFieldConfig::create()
->addComponent(GridFieldButtonRow::create('before'))
->addComponent(GridFieldToolbarHeader::create())
->addComponent(GridFieldEditableColumns::create())
->addComponent(GridFieldDeleteAction::create())
->addComponent(GridFieldAddNewInlineButton::create())
->addComponent(new GridFieldOrderableRows('SortOrder'))
);

$SearchTermsGridField->getConfig()->getComponentByType(GridFieldEditableColumns::class)->setDisplayFields(array(
'SearchTermText' => function ($record, $column, $grid) {
return TextField::create($column)
->setAttribute('placeholder', 'Enter search term');
}
));

$fields->addFieldToTab('Root.Search.Main', $SearchTermsGridField);
}

/**
* getIndexQuery
* This query is used when building the index
Expand All @@ -36,6 +126,10 @@ class SearchableExtension extends DataExtension
SiteTree
ON
SiteTree.ID = Page.ID
LEFT JOIN
SearchTerm
ON
SearchTerm.SearchTermOfID = Page.ID AND SearchTerm.SearchTermOfClass = SiteTree.ClassName
WHERE
SiteTree.ShowInSearch = '1'";
**/
Expand Down

0 comments on commit 90cf0ed

Please sign in to comment.