Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release/1.2.3/dev build search fix #33

Merged
merged 4 commits into from
Dec 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions _config/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
Name: Search Module dev/build
---
SilverStripe\ORM\DatabaseAdmin:
extensions:
- Werkbot\Search\DatabaseAdminExtension

15 changes: 15 additions & 0 deletions src/DatabaseAdminExtension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace Werkbot\Search;

use SilverStripe\Control\Controller;
use SilverStripe\ORM\DataExtension;

class DatabaseAdminExtension extends DataExtension
{
public function onAfterBuild()
{
(new SearchIndex())->run(Controller::curr()->getRequest());
}
}

67 changes: 43 additions & 24 deletions src/SearchControllerExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,20 @@

namespace Werkbot\Search;

use SilverStripe\ORM\ArrayList;
use SilverStripe\CMS\Search\SearchForm;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Core\ClassInfo;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TextField;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\Forms\TextField;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataExtension;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\PaginatedList;
use Werkbot\Search\TNTSearchHelper;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Forms\RequiredFields;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\CMS\Search\SearchForm;
use SilverStripe\ORM\FieldType\DBField;
use TeamTNT\TNTSearch\Exceptions\IndexNotFoundException;
use Werkbot\Search\TNTSearchHelper;

class SearchControllerExtension extends DataExtension
{
Expand Down Expand Up @@ -77,24 +77,11 @@ public function SiteSearchFormResults($searchdata, $form)

if (isset($searchdata['Search'])) {
try {
$tnt = TNTSearchHelper::Instance()->getTNTSearch();
$tnt->selectIndex('site.index');
$res = $tnt->search($searchdata['Search']);
$classlist = [];
$classes = ClassInfo::classesWithExtension(SearchableExtension::class);
foreach ($classes as $key => $value) {
$classlist[ClassInfo::shortName($value)] = $value;
}
foreach ($res["ids"] as $result) {
$parts = explode("_", $result);
if ($obj = $classlist[$parts[0]]::get()->byID($parts[1])) {
$Results->push($obj);
}
}
$Results = $this->getSearchResults($searchdata['Search']);
} catch (IndexNotFoundException $e) {
$validationResult = new ValidationResult();
$validationResult->addFieldError('Message', 'Search index not found');
$form->setSessionValidationResult($validationResult);
$validationResult = new ValidationResult();
$validationResult->addFieldError('Message', 'Search index not found');
$form->setSessionValidationResult($validationResult);
}

if ($this->owner->config()->get('save_search_queries')) {
Expand All @@ -119,4 +106,36 @@ public function SiteSearchFormResults($searchdata, $form)
);
return $this->owner->customise($data)->renderWith(array('SearchableResultsPage', 'Page'));
}

/**
* Get search results
*
* @param string $search
* @return ArrayList
**/
public function getSearchResults(string $search)
{
$results = ArrayList::create();

$tnt = TNTSearchHelper::Instance()->getTNTSearch();
$tnt->selectIndex('site.index');
$res = $tnt->search($search);

$classlist = [];
$classes = ClassInfo::classesWithExtension(SearchableExtension::class);
foreach ($classes as $key => $value) {
$classlist[ClassInfo::shortName($value)] = $value;
}

foreach ($res['ids'] as $result) {
$parts = explode("_", $result);
if ($obj = $classlist[$parts[0]]::get()->byID($parts[1])) {
$results->push($obj);
}
}

return $results;
}

}

29 changes: 5 additions & 24 deletions src/SearchableExtension.php
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
<?php
/**/

namespace Werkbot\Search;
/**/
use SilverStripe\ORM\DB;

use SilverStripe\Core\ClassInfo;
use SilverStripe\ORM\DataExtension;
use SilverStripe\Versioned\Versioned;
/**/

class SearchableExtension extends DataExtension
{
/*
Expand All @@ -15,7 +14,7 @@ class SearchableExtension extends DataExtension
*/
public $SearchableExtension_Title_ColumnName = "Title";
public $SearchableExtension_Summary_ColumnName = "Content";
/**/

private static $casting = [
"getSearchableTitle" => "Text",
"getSearchableSummary" => 'HTMLText',
Expand Down Expand Up @@ -223,23 +222,5 @@ public function onAfterDelete()
{
$this->owner->deleteIndex();
}
/**
* requireDefaultRecords
* Runs the index on a dev/build
**/
public function requireDefaultRecords()
{
parent::requireDefaultRecords();

if (!file_exists(dirname(__DIR__, 4).'/search')) {
mkdir(dirname(__DIR__, 4).'/search');
echo "Created search folder<br /><br />";
}
$indexer = TNTSearchHelper::Instance()->getTNTSearchIndex(true);
if ($query = $this->owner->getIndexQuery()) {
$indexer->query($query);
$indexer->run();
DB::alteration_message('Indexing...'.$this->owner->ClassName, 'created');
}
}
}

40 changes: 20 additions & 20 deletions src/Tasks/SearchIndex.php
Original file line number Diff line number Diff line change
@@ -1,34 +1,34 @@
<?php
/**/

namespace Werkbot\Search;
/**/
use SilverStripe\Dev\BuildTask;

use SilverStripe\Core\ClassInfo;
use SilverStripe\Dev\BuildTask;
use SilverStripe\ORM\DB;
use Werkbot\Search\TNTSearchHelper;
/**/

class SearchIndex extends BuildTask
{
/**/
protected $title = "Search Index";
protected $description = "";
protected $enabled = true;
/**/

public function run($request)
{
if (!file_exists(dirname(__DIR__, 5).'/search')) {
mkdir(dirname(__DIR__, 5).'/search');
echo "Created search folder<br /><br />";
}
$indexer = TNTSearchHelper::Instance()->getTNTSearchIndex(true);
$classes = ClassInfo::classesWithExtension(SearchableExtension::class);
foreach ($classes as $Title => $ClassName) {
$searchableClass = singleton($ClassName);
if ($query = $searchableClass->getIndexQuery()) {
echo "Indexing...$ClassName<br />";
$indexer->query($query);
$indexer->run();
echo "<br /><br />";
}
if (!file_exists(dirname(__DIR__, 5) . '/search')) {
mkdir(dirname(__DIR__, 5) . '/search');
echo "Created search folder<br /><br />";
}
$indexer = TNTSearchHelper::Instance()->getTNTSearchIndex(true);
$classes = ClassInfo::classesWithExtension(SearchableExtension::class);
foreach ($classes as $title => $className) {
$searchableClass = singleton($className);
if ($query = $searchableClass->getIndexQuery()) {
$indexer->query($query);
$indexer->run();
DB::alteration_message('Indexing...' . $className, 'created');
}
}
}
}

Loading