1
0
mirror of https://github.com/ToxicCrack/PrintABrick.git synced 2025-05-20 06:00:08 -07:00

Add search action

This commit is contained in:
David Hübner 2017-04-24 11:20:03 +02:00
parent 7e31eee729
commit 2942d1395e
4 changed files with 134 additions and 26 deletions

View File

@ -4,7 +4,19 @@
{% block body %}
<div class="ui fixed inverted menu">
{{ knp_menu_render('mainMenu') }}
<div class="ui container">
{{ knp_menu_render('mainMenu') }}
<div class="right menu">
<div class="ui search item category right aligned">
<div class="ui icon input transparent inverted">
<input class="prompt" type="text" placeholder="Search..." >
<i class="search icon"></i>
</div>
<div class="results transition"></div>
</div>
</div>
</div>
</div>
{% block page %}
<div class="ui main">
@ -45,4 +57,24 @@
</div>
{% endblock %}
</div>
{% endblock %}
{% block javascripts %}
{{ parent() }}
<script type="text/javascript">
$('.ui.search')
.search({
type: 'category',
apiSettings: {
action: 'search',
url: '{{ path('search_autocomplete')}}?query={query}',
},
minCharacters : 3,
fields: {
title: 'title',
url: 'url'
}
});
</script>
{% endblock %}

View File

@ -1,25 +0,0 @@
{% extends 'base.html.twig' %}
{% block content %}
<div class="ui seven column grid">
<div class="row">
{% for part in parts %}
<div class="column">
<div class="ui fluid bordered image">
<a href="{{ path('reb_part_detail', {number: part.number}) }}">
<div class="image load">
<img src="{{ part.number|partImage(-1)| imagine_filter('rebrickable_part_min') }}" data-src="{{ part.number|partImage(-1)| imagine_filter('rebrickable_part_min') }}" class="transition visible">
</div>
<div class="ui bottom attached label {{ part.model == null ? 'black' : 'red'}}">{{ part.number }}</div>
</a>
</div>
</div>
{% endfor %}
</div>
</div>
<p>{{ parts.getTotalItemCount }}</p>
{{ knp_pagination_render(parts) }}
{% endblock %}

View File

@ -0,0 +1,20 @@
{% extends 'base.html.twig' %}
{% block title %}{% endblock %}
{% block header %}{% endblock %}
{% block content %}
<div class="ui seven column grid">
<div class="row">
{% for set in sets %}
<div class="column">
<a href="{{ url('set_detail', {'number': set.number}) }}">
<img class="ui bordered image medium" src="{{ set.number|setImage|imagine_filter('rebrickable_set_min') }}">
<p>{{ set.number }} - {{ set.name }}</p>
</a>
</div>
{% endfor %}
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,81 @@
<?php
namespace AppBundle\Controller;
use AppBundle\Entity\LDraw\Model;
use AppBundle\Entity\Rebrickable\Set;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
/**
* Search controller.
*
* @Route("search")
*/
class SearchController extends Controller
{
/**
* @Route("/", name="search_result")
*/
public function searchAction(Request $request)
{
$query = trim(strip_tags($request->get('query')));
$modelsResult = $this->get('repository.ldraw.model')->findByQuery($query);
$setsResult = $this->get('repository.rebrickable.set')->findByQuery($query);
return $this->render('search/index.html.twig', [
'sets' => $setsResult,
'models' => $modelsResult,
]);
}
/**
* @Route("/autocomplete", name="search_autocomplete")
*/
public function autocompleteAction(Request $request)
{
$query = trim(strip_tags($request->get('query')));
$modelsResult = $this->get('repository.ldraw.model')->findByQuery($query,7);
$models = [];
/** @var Model $model */
foreach ($modelsResult as $model) {
$models[] = [
'title' => $model->getNumber().' '.$model->getName(),
'url' => $this->generateUrl('model_detail',['number' => $model->getNumber()]),
];
}
$setsResult = $this->get('repository.rebrickable.set')->findByQuery($query,7);
$sets = [];
/** @var Set $set */
foreach ($setsResult as $set) {
$sets[] = [
'title' => $set->getNumber().' '.$set->getName(),
'url' => $this->generateUrl('set_detail',['number' => $set->getNumber()]),
];
}
$response = new JsonResponse();
$response->setData([
'results' => [
'category' => [
'name' => 'Sets',
'results' => $sets,
],
'category1' => [
'name' => 'Models',
'results' => $models,
]
]
]);
return $response;
}
}