<?php
namespace AppBundle\Controller;
use LuceneSearchBundle\Helper\HighlighterHelper;
use LuceneSearchBundle\Controller\ListController;
use Pimcore\Twig\Extension\Templating\Placeholder;
use Symfony\Contracts\Translation\TranslatorInterface;
class SearchController extends ListController {
public function getResultsAction(TranslatorInterface $translator, Placeholder $placeholder)
{
$highlighterHelper = new HighlighterHelper();
$requestQuery = $this->requestStack->getMasterRequest()->query;
try {
$query = new \Zend_Search_Lucene_Search_Query_Boolean();
$field = $requestQuery->get('field');
if (!empty($field)) {
\Zend_Search_Lucene::setDefaultSearchField($field);
}
$searchResults = [];
$validHits = [];
if (!empty($this->query)) {
if ($this->fuzzySearchResults) {
$this->query = str_replace(' ', '~ ', $this->query);
$this->query .= '~';
\Zend_Search_Lucene_Search_Query_Fuzzy::setDefaultPrefixLength(3);
}
$userQuery = \Zend_Search_Lucene_Search_QueryParser::parse($this->query, 'utf-8');
$query->addSubquery($userQuery, true);
$this->addAdditionalSubQueries($query);
$validHits = $this->getValidHits($this->frontendIndex->find($query));
$start = $this->perPage * ($this->currentPage - 1);
$end = $start + ($this->perPage - 1);
if ($end > count($validHits) - 1) {
$end = count($validHits) - 1;
}
for ($i = $start; $i <= $end; $i++) {
/** @var \Zend_Search_Lucene_Search_QueryHit $hit */
$hit = $validHits[$i];
/** @var \Zend_Search_Lucene_Document $doc */
$doc = $hit->getDocument();
$availableFieldNames = $doc->getFieldNames();
$url = in_array('url', $availableFieldNames) ? $doc->getField('url')->value : null;
$title = in_array('title', $availableFieldNames) ? $doc->getField('title')->value : null;
$content = in_array('content', $availableFieldNames) ? $doc->getField('content')->value : null;
$searchResult['boost'] = $doc->boost;
$uppercaseSearch = ucfirst($this->query);
$searchResult['title'] = str_replace([$this->query, $uppercaseSearch], ["<span class=\"highlight\">$this->query</span>", "<span class=\"highlight\">$uppercaseSearch</span>"], $title);
$searchResult['url'] = $url;
$searchResult['summary'] = $highlighterHelper->getSummaryForUrl($content, $this->untouchedQuery);
if (in_array('h1', $availableFieldNames)) {
$searchResult['h1'] = $doc->getField('h1')->value;
}
if (in_array('description', $availableFieldNames)) {
$searchResult['description'] = $highlighterHelper->getSummaryForUrl($doc->getField('description')->value,
$this->untouchedQuery);
}
if (in_array('imageTags', $availableFieldNames)) {
$searchResult['imageTags'] = $doc->getField('imageTags')->value;
}
$searchResult['categories'] = [];
if (in_array('categories', $availableFieldNames)) {
$categories = $doc->getField('categories')->value;
if (!empty($categories)) {
$searchResult['categories'] = $this->mapCategories($categories);
}
}
$searchResults[] = $searchResult;
unset($searchResult);
}
}
$suggestions = false;
if ($this->searchSuggestion && count($searchResults) === 0) {
$suggestions = $this->getFuzzySuggestions();
}
$currentPageResultStart = $this->perPage * ($this->currentPage - 1);
$currentPageResultEnd = $currentPageResultStart + $this->perPage;
if ($currentPageResultEnd > count($validHits)) {
$currentPageResultEnd = count($validHits);
}
$pages = 0;
if (count($validHits) > 0) {
$pages = ceil(count($validHits) / $this->perPage);
}
$viewParams = [
'searchCurrentPage' => $this->currentPage,
'searchAllPages' => $pages,
'searchCategory' => $this->queryCategories,
'searchAvailableCategories' => $this->categories,
'searchSuggestions' => $suggestions,
'searchLanguage' => $this->searchLanguage,
'searchCountry' => $this->searchCountry,
'searchPerPage' => $this->perPage,
'searchTotalHits' => count($validHits),
'searchQuery' => $this->untouchedQuery,
'searchHasResults' => count($searchResults) > 0,
'searchResults' => $searchResults,
'searchCurrentPageResultStart' => $currentPageResultStart + 1,
'searchCurrentPageResultEnd' => $currentPageResultEnd
];
if ($this->document && $viewParams['searchQuery']) {
$translatedPageName = "fulltext-seach.header.search-result";
if ($translator->trans($translatedPageName) ) {
$translatedPageName = $translator->trans($translatedPageName);
}
$placeholder('addBreadcrumb')->append([
'parentId' => $this->document->getId(),
'id' => 'search-results',
'label' => $translatedPageName,
'titel' => $translatedPageName
]);
}
} catch (\Exception $e) {
$viewParams = [
'error' => true,
'errorMessage' => $e->getMessage() . ' (' . $e->getFile() . ' Line: ' . $e->getLine() . ')',
];
}
return $this->renderTemplate("@App/ObjectViews/search-results.html.twig", $viewParams);
}
}