From 7b78a841b015e1baa5f86404c0d88e81256dbf77 Mon Sep 17 00:00:00 2001 From: Andrew Aitken-Fincham Date: Mon, 4 Jun 2018 15:47:10 +0100 Subject: [PATCH] add default solr contentcontroller extension piggy-back on default searchform --- _config/config.yml | 3 + docs/en/index.md | 4 +- .../Control/ContentControllerExtension.php | 60 ++++++++++++ src/Solr/Forms/SearchForm.php | 98 +++++++++++++++++++ 4 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 src/Solr/Control/ContentControllerExtension.php create mode 100644 src/Solr/Forms/SearchForm.php diff --git a/_config/config.yml b/_config/config.yml index 50ea2b3..11eea88 100644 --- a/_config/config.yml +++ b/_config/config.yml @@ -4,3 +4,6 @@ Name: fulltextsearchconfig SilverStripe\ORM\DataObject: extensions: - SilverStripe\FullTextSearch\Search\Extensions\SearchUpdater_ObjectHandler +SilverStripe\CMS\Controllers\ContentController: + extensions: + - SilverStripe\FullTextSearch\Solr\Control\ContentControllerExtension diff --git a/docs/en/index.md b/docs/en/index.md index fab1dfb..2ffe35e 100644 --- a/docs/en/index.md +++ b/docs/en/index.md @@ -46,7 +46,9 @@ SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater: ## Basic usage -Basic usage is a four step process: +If you have the [CMS module](https://github.com/silverstripe/silverstripe-cms) installed, you will be able to simply add `$SearchForm` to your template to add a Solr search form. Default configuration is added via the [`ContentControllerExtension`](/src/Solr/Control/ContentControllerExtension.php) and replacement [`SearchForm`](/src/Solr/Forms/SearchForm.php) + +Otherwise, basic usage is a four step process: 1). Define an index in SilverStripe (Note: The specific connector index instance - that's what defines which engine gets used) diff --git a/src/Solr/Control/ContentControllerExtension.php b/src/Solr/Control/ContentControllerExtension.php new file mode 100644 index 0000000..f65f8d1 --- /dev/null +++ b/src/Solr/Control/ContentControllerExtension.php @@ -0,0 +1,60 @@ +owner->getRequest(); + + if ($currentRequest && $currentRequest->getVar('Search')) { + $searchText = $currentRequest->getVar('Search'); + } + + $fields = FieldList::create( + TextField::create('Search', false, $searchText) + ); + $actions = FieldList::create( + FormAction::create('results', _t('SilverStripe\\CMS\\Search\\SearchForm.GO', 'Go')) + ); + return SearchForm::create($this->owner, 'SearchForm', $fields, $actions); + } + + /** + * Process and render search results. + * + * @param array $data The raw request data submitted by user + * @param SearchForm $form The form instance that was submitted + * @param HTTPRequest $request Request generated for this action + */ + public function results($data, $form, $request) + { + $data = [ + 'Results' => $form->getResults(), + 'Query' => DBField::create_field('Text', $form->getSearchQuery()), + 'Title' => _t('SilverStripe\\CMS\\Search\\SearchForm.SearchResults', 'Search Results') + ]; + return $this->owner->customise($data)->renderWith(['Page_results', 'Page']); + } +} diff --git a/src/Solr/Forms/SearchForm.php b/src/Solr/Forms/SearchForm.php new file mode 100644 index 0000000..9b37abd --- /dev/null +++ b/src/Solr/Forms/SearchForm.php @@ -0,0 +1,98 @@ + 'Text' + ); + + /** + * @param RequestHandler $controller + * @param string $name The name of the form (used in URL addressing) + * @param FieldList $fields Optional, defaults to a single field named "Search". Search logic needs to be customized + * if fields are added to the form. + * @param FieldList $actions Optional, defaults to a single field named "Go". + */ + public function __construct( + RequestHandler $controller = null, + $name = 'SearchForm', + FieldList $fields = null, + FieldList $actions = null + ) { + if (!$fields) { + $fields = FieldList::create( + TextField::create('Search', _t(__CLASS__.'.SEARCH', 'Search')) + ); + } + + if (!$actions) { + $actions = FieldList::create( + FormAction::create("results", _t(__CLASS__.'.GO', 'Go')) + ); + } + + parent::__construct($controller, $name, $fields, $actions); + + $this->setFormMethod('get'); + + $this->disableSecurityToken(); + } + + /** + * Return dataObjectSet of the results using current request to get info from form. + * Simplest implementation loops over all Solr indexes + * + * @return ArrayList + */ + public function getResults() + { + // Get request data from request handler + $request = $this->getRequestHandler()->getRequest(); + + $searchTerms = $request->requestVar('Search'); + $query = SearchQuery::create()->addSearchTerm($searchTerms); + + $indexes = FullTextSearch::get_indexes(SolrIndex::class); + $results = ArrayList::create(); + + /** @var SolrIndex $index */ + foreach ($indexes as $index) { + $results->merge($index->search($query)->Matches); + } + + // filter by permission + if ($results) { + /** @var DataObject $result */ + foreach ($results as $result) { + if (!$result->canView()) { + $results->remove($result); + } + } + } + + return $results; + } + + /** + * Get the search query for display in a "You searched for ..." sentence. + * + * @return string + */ + public function getSearchQuery() + { + return $this->getRequestHandler()->getRequest()->requestVar('Search'); + } +}