131 lines
4.4 KiB
PHP
131 lines
4.4 KiB
PHP
<?php
|
|
|
|
namespace Trinity\Bundle\SearchBundle\Controller;
|
|
|
|
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
|
|
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
|
|
use Trinity\Bundle\ContentManagerBundle\Controller\PageController;
|
|
use Trinity\Bundle\ContentManagerBundle\Exception\NavigationNotFoundException;
|
|
use Trinity\Bundle\ContentManagerBundle\Exception\PageNotFoundException;
|
|
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
|
|
|
|
use Trinity\Bundle\SearchBundle\Model\SearchObject;
|
|
|
|
use Trinity\Bundle\ContentManagerBundle\Model\PageQuery;
|
|
use Zend\Search\Lucene\Index\Term;
|
|
use Zend\Search\Lucene\Search\Query\Boolean as ZendBooleanQuery;
|
|
use Zend\Search\Lucene\Search\Query\Fuzzy as FuzzyQuery;
|
|
use Zend\Search\Lucene\Search\Query\MultiTerm;
|
|
use Zend\Search\Lucene\Search\QueryParser;
|
|
|
|
|
|
class SearchController extends PageController
|
|
{
|
|
|
|
/**
|
|
* @param $page
|
|
* @return \Symfony\Bundle\FrameworkBundle\Controller\Response
|
|
*/
|
|
public function indexAction($page)
|
|
{
|
|
$request = $this->getRequest();
|
|
$query = $request->query->get('search');
|
|
$words = filter_var(
|
|
$query,
|
|
FILTER_CALLBACK,
|
|
array(
|
|
'options' => array(
|
|
'Trinity\Component\Utils\VarFilter',
|
|
'sanitize_text'
|
|
)
|
|
)
|
|
);
|
|
|
|
$results = null;
|
|
|
|
if ($request->isMethod('GET')) {
|
|
|
|
try {
|
|
$index = $this->get('ivory_lucene_search')->getIndex($request->getLocale());
|
|
|
|
$parser = new QueryParser();
|
|
$user_query = $parser->parse($parser->escape($words))->rewrite($index);
|
|
|
|
$Query = new ZendBooleanQuery();
|
|
// get the query terms to process
|
|
$fields_term = array();
|
|
foreach ($user_query->getQueryTerms() as $term) {
|
|
if (in_array($term->field, array('pk', 'model', 'nav'))) {
|
|
continue;
|
|
}
|
|
$fields_term[$term->field][] = $term->text;
|
|
}
|
|
// build the query
|
|
// TODO: check for a invisible page used for its DataModelCollection
|
|
foreach ($fields_term as $field => $texts) {
|
|
$subQuery = new ZendBooleanQuery();
|
|
foreach ($texts as $text) {
|
|
$termQuery = new FuzzyQuery(new Term($text, $field));
|
|
$subQuery->addSubquery($termQuery, true);
|
|
}
|
|
$Query->addSubquery($subQuery, null);
|
|
}
|
|
|
|
} catch (\InvalidArgumentException $e) {
|
|
return $this->redirect($this->generateUrl('homepage'));
|
|
}
|
|
|
|
$results = $index->find($Query);
|
|
|
|
$resultsFilter = array();
|
|
|
|
foreach ($results as $r) {
|
|
switch ($r->model) {
|
|
|
|
case 'Page':
|
|
$expld = explode('_', $r->pk);
|
|
$id = intval(end($expld));
|
|
$queryObject = new PageQuery();
|
|
$tmp_obj = $queryObject->findOneById($id);
|
|
|
|
if (!$tmp_obj) {
|
|
continue;
|
|
}
|
|
|
|
if ($tmp_obj->isOrphan()) {
|
|
continue;
|
|
}
|
|
|
|
$title = $tmp_obj->getSeoTitle() ? $tmp_obj->getSeoTitle() : $tmp_obj->getBlock('title');
|
|
$description = $tmp_obj->getMetaDescription() ? $tmp_obj->getMetaDescription() : '';
|
|
$url = $this->container->get('routing.url.resolver')->resolve(
|
|
$tmp_obj->getNode(),
|
|
$tmp_obj->getNode()->getCleanedDefaultParams(),
|
|
$tmp_obj->getObject()
|
|
);
|
|
|
|
$obj = new SearchObject($title, $description, $url);
|
|
$resultsFilter[] = $obj;
|
|
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
$this->getPage()->setQuery($resultsFilter);
|
|
$this->getPage()->setPage($page);
|
|
}
|
|
|
|
return $this->render(
|
|
'TrinitySearchBundle:Search:index.html.twig',
|
|
array(
|
|
'query' => htmlentities($request->query->get('search'))
|
|
)
|
|
);
|
|
|
|
}
|
|
|
|
}
|