deblan.tv/vendor/trinity/src/Trinity/Bundle/SearchBundle/Controller/SearchController.php
2015-03-02 21:57:49 +01:00

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'))
)
);
}
}