use a template that iterates results properly

This commit is contained in:
Andrew Aitken-Fincham 2018-06-07 14:13:07 +01:00
parent 7b78a841b0
commit 875b37ea63
5 changed files with 80 additions and 16 deletions

View File

@ -46,7 +46,11 @@ SilverStripe\FullTextSearch\Search\Updaters\SearchUpdater:
## Basic usage
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)
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 alternative [`SearchForm`](/src/Solr/Forms/SearchForm.php).
Ensure that you _don't_ have `SilverStripe\ORM\Search\FulltextSearchable::enable()` set in `_config.php`, as the `SearchForm` action provided by that class will conflict.
You can override the default template with a new one at `templates/Layout/Page_results_solr.ss`.
Otherwise, basic usage is a four step process:

View File

@ -105,8 +105,8 @@ class SearchUpdater
'command' => $command,
'fields' => array()
);
} // Otherwise update the class label if it's more specific than the currently recorded one
elseif (is_subclass_of($class, $writes[$key]['class'])) {
// Otherwise update the class label if it's more specific than the currently recorded one
} elseif (is_subclass_of($class, $writes[$key]['class'])) {
$writes[$key]['class'] = $class;
}

View File

@ -55,6 +55,6 @@ class ContentControllerExtension extends Extension
'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']);
return $this->owner->customise($data)->renderWith(['Page_results_solr', 'Page_results', 'Page']);
}
}

View File

@ -10,8 +10,8 @@ use SilverStripe\Forms\TextField;
use SilverStripe\FullTextSearch\Search\FullTextSearch;
use SilverStripe\FullTextSearch\Search\Queries\SearchQuery;
use SilverStripe\FullTextSearch\Solr\SolrIndex;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\DataObject;
use SilverStripe\View\ArrayData;
class SearchForm extends Form
{
@ -55,7 +55,7 @@ class SearchForm extends Form
* Return dataObjectSet of the results using current request to get info from form.
* Simplest implementation loops over all Solr indexes
*
* @return ArrayList
* @return ArrayData
*/
public function getResults()
{
@ -65,24 +65,28 @@ class SearchForm extends Form
$searchTerms = $request->requestVar('Search');
$query = SearchQuery::create()->addSearchTerm($searchTerms);
$indexes = FullTextSearch::get_indexes(SolrIndex::class);
$results = ArrayList::create();
$params = [
'spellcheck' => 'true',
'spellcheck.collate' => 'true',
];
// Get the first index
$indexClasses = FullTextSearch::get_indexes(SolrIndex::class);
$indexClass = reset($indexClasses);
/** @var SolrIndex $index */
foreach ($indexes as $index) {
$results->merge($index->search($query)->Matches);
}
$index = $indexClass::singleton();
$results = $index->search($query, -1, -1, $params);
// filter by permission
if ($results) {
/** @var DataObject $result */
foreach ($results as $result) {
if (!$result->canView()) {
$results->remove($result);
foreach ($results->Matches as $match) {
/** @var DataObject $match */
if (!$match->canView()) {
$results->Matches->remove($match);
}
}
}
return $results;
}

View File

@ -0,0 +1,56 @@
<div id="Content" class="searchResults">
<h1>$Title</h1>
<% if $Query %>
<p class="searchQuery">You searched for &quot;{$Query}&quot;</p>
<% end_if %>
<% if $Results.Suggestion %>
<p class="spellCheck">Did you mean <a href="{$Link}SearchForm?Search=$Results.SuggestionQueryString">$Results.SuggestionNice</a>?</p>
<% end_if %>
<% if $Results.Matches %>
<ul id="SearchResults">
<% loop $Results.Matches %>
<li>
<h4>
<a href="$Link">
<% if $MenuTitle %>
$MenuTitle
<% else %>
$Title
<% end_if %>
</a>
</h4>
<p><% if $Abstract %>$Abstract.XML<% else %>$Content.ContextSummary<% end_if %></p>
<a class="readMoreLink" href="$Link" title="Read more about &quot;{$Title}&quot;">Read more about &quot;{$Title}&quot;...</a>
</li>
<% end_loop %>
</ul>
<% else %>
<p>Sorry, your search query did not return any results.</p>
<% end_if %>
<% if $Results.Matches.MoreThanOnePage %>
<div id="PageNumbers">
<div class="pagination">
<% if $Results.Matches.NotFirstPage %>
<a class="prev" href="$Results.Matches.PrevLink" title="View the previous page">&larr;</a>
<% end_if %>
<span>
<% loop $Results.Matches.Pages %>
<% if $CurrentBool %>
$PageNum
<% else %>
<a href="$Link" title="View page number $PageNum" class="go-to-page">$PageNum</a>
<% end_if %>
<% end_loop %>
</span>
<% if $Results.Matches.NotLastPage %>
<a class="next" href="$Results.Matches.NextLink" title="View the next page">&rarr;</a>
<% end_if %>
</div>
<p>Page $Results.Matches.CurrentPage of $Results.Matches.TotalPages</p>
</div>
<% end_if %>
</div>