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

Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
David Hübner 2017-05-24 16:22:09 +02:00
commit f3aaf178d4
26 changed files with 266 additions and 108 deletions

View File

@ -0,0 +1,24 @@
.hidden.menu {
display: none;
}
.masthead.segment {
min-height: 500px;
padding: 1em 0em;
}
.masthead .logo.item img {
margin-right: 1em;
}
.masthead .ui.menu .ui.button {
margin-left: 0.5em;
}
.masthead h1.ui.header {
margin-top: 1.5em;
margin-bottom: 0em;
font-size: 4em;
font-weight: normal;
}
.masthead h2 {
font-size: 1.7em;
font-weight: normal;
}

View File

@ -1,12 +1,11 @@
.default-theme { .default-theme {
.ui.main { .ui.main {
padding-top: 10px; padding-top: 50px;
margin-top: 40px;
min-height: calc(100% - 67px); min-height: calc(100% - 67px);
} }
.ui.masthead { .ui.head {
position: relative; position: relative;
.header { .header {
@ -105,8 +104,29 @@
font-weight: 700; font-weight: 700;
} }
.image {
width: 4em;
height: 4em;
}
padding: 0.5em 1em !important; padding: 0.5em 1em !important;
} }
.spacing.top {
margin-top: 1em;
}
.show.all {
font-size: 1.5em;
&:after {
content: ' »';
}
}
.ajax-load > .loader, .empty{
margin-top: 100px !important;
margin-bottom: 100px !important;
}
} }
@each $i in 5 10 15 20 25 30 40 50 60 { @each $i in 5 10 15 20 25 30 40 50 60 {

View File

@ -2,6 +2,7 @@
@import "mixins"; @import "mixins";
@import "main"; @import "main";
@import "homepage";
@import "modelviewer"; @import "modelviewer";
@import "part"; @import "part";

View File

@ -363,6 +363,16 @@ u9140p02c01: u9140p01c01
92243p02c01: 92243p01c01 92243p02c01: 92243p01c01
u9142p02c03: u9142p01c08
u9151p02c03: u9151p01c04
u9106p02c02: u9106p01c03
u595p02c04: u595p01c10
u9140p02c02: u9140p01c04
64022c01: 64022 64022c01: 64022
64022c02: 64022 64022c02: 64022
@ -381,4 +391,6 @@ u9209c01: u9209
2772c02: 2772c01 2772c02: 2772c01
2772c03: 2772c01 2772c03: 2772c01
81294: 3351a 81294: 3351a
61738: 54086

View File

@ -68,4 +68,18 @@ page:
filter: filter:
model: model:
search: Search Model search: Search Model
category: Category category: Category
homepage:
models:
title: %count% models
text:
browse: Browse models
sets:
title: %count% sets
text:
browse: Browse sets
view.all:
sets: View all matched sets
models: View all matched models

View File

@ -1,6 +1,7 @@
{% extends 'html.html.twig' %} {% extends 'html.html.twig' %}
{% import 'macros/elements.html.twig' as elements %} {% import 'macros/elements.html.twig' as elements %}
{% import 'macros/blocks.html.twig' as blocks %}
{% block body %} {% block body %}
<div class="ui fixed inverted menu"> <div class="ui fixed inverted menu">
@ -21,7 +22,7 @@
{% block page %} {% block page %}
<div class="ui main"> <div class="ui main">
<div class="ui container"> <div class="ui container">
<div class="ui masthead vertical segment"> <div class="ui head vertical segment">
<h1 class="ui header">{% block header %}{% endblock %}</h1> <h1 class="ui header">{% block header %}{% endblock %}</h1>
<div class="ui small breadcrumb"> <div class="ui small breadcrumb">
@ -73,7 +74,8 @@
fields: { fields: {
title: 'name', title: 'name',
description: 'id', description: 'id',
url: 'url' url: 'url',
image: 'img'
} }
}); });
</script> </script>

View File

@ -1,16 +1,51 @@
{% extends 'base.html.twig' %} {% extends 'base.html.twig' %}
{% block page %} {% block body %}
<div class="ui main"> <!-- Page Contents -->
<div class="ui grid massive message vertical"> <div class="pusher">
<div class="ui inverted vertical masthead center aligned segment">
<div class="ui container"> <div class="ui container">
<div class="row"> <div class="ui large secondary inverted pointing menu">
<div class="h1 ui huge header"> {{ knp_menu_render('mainMenu') }}
Hello, world!
<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>
<div class="ui text container">
<h1 class="ui inverted header">
PrintABrick
</h1>
<h2>{{ 'page.home.title.text' | trans }}</h2>
</div>
</div>
<div class="ui vertical stripe quote segment">
<div class="ui equal width stackable internally celled grid">
<div class="center aligned row">
<div class="column">
<h3>{{ 'homepage.models.title' | trans({'%count%' : models})}}</h3>
<p>{{ 'homepage.models.text' | trans }}</p>
<a class="ui button big primary" href="{{ path('model_index') }}">{{ 'homepage.models.browse' | trans }}</a>
</div>
<div class="column">
<h3>{{ 'homepage.sets.title' | trans({'%count%' : sets}) }}</h3>
<p>{{ 'homepage.sets.text' | trans }}</p>
<a class="ui button big primary" href="{{ path('set_index') }}">{{ 'homepage.sets.browse' | trans }}</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -14,7 +14,6 @@
{% endblock %} {% endblock %}
{% block javascripts %} {% block javascripts %}
<script type="text/javascript" src="{{ asset('resources/js/three.js') }}"></script> <script type="text/javascript" src="{{ asset('resources/js/three.js') }}"></script>
<script type="text/javascript" src="{{ asset('resources/js/OrbitControls.js') }}"></script> <script type="text/javascript" src="{{ asset('resources/js/OrbitControls.js') }}"></script>

View File

@ -5,6 +5,7 @@
{% else %} {% else %}
{% set placeholder = asset("resources/images/transparent_min.png") %} {% set placeholder = asset("resources/images/transparent_min.png") %}
{% endif %} {% endif %}
<img src="{{ placeholder }}" data-src="{{ asset(color~'/'~number~'.png') | imagine_filter(filter)}}"> <img src="{{ placeholder }}" data-src="{{ asset(color~'/'~number~'.png') | imagine_filter(filter)}}">
</div> </div>
{% endmacro %} {% endmacro %}
@ -63,13 +64,13 @@
{% import _self as blocks %} {% import _self as blocks %}
{{ blocks.setImage(set.id,'set_min') }} {{ blocks.setImage(set.id,'set_min') }}
<div class="content"> <div class="content">
<h3 class="header truncate"> <h3 title="{{ set.name }}" class="header truncate">
{{ set.name }} {{ set.name }}
</h3> </h3>
<div class="meta"> <div class="meta">
<span class="left floated">{{ set.id }}</span> <span class="left floated">{{ set.id }}</span>
<br> <br>
<span class="left floated truncate"><small>{{ set.theme.fullName }}</small></span> <span title="{{ set.theme.fullName }}" class="left floated truncate"><small>{{ set.theme.fullName }}</small></span>
</div> </div>
<div class="description"> <div class="description">
<small> <small>
@ -83,7 +84,9 @@
{% endmacro %} {% endmacro %}
{% macro empty(message) %} {% macro empty(message) %}
<p class="ui center aligned icon header"><i class="circular frown icon"></i>{{ message }}</p> <div class="ui center aligned icon header empty">
<p><i class="circular frown icon"></i>{{ message }}</p>
</div>
{% endmacro %} {% endmacro %}
{% macro ccal2_license(title,author) %} {% macro ccal2_license(title,author) %}

View File

@ -75,7 +75,7 @@
<div class="ui vertical segment"> <div class="ui vertical segment">
<div class="ui tab active" data-tab="subparts"> <div class="ui tab active" data-tab="subparts">
<div class="ui eight column grid"> <div class="ui eight column grid parts">
{% for subpart in subparts %} {% for subpart in subparts %}
{{ blocks.model(subpart['model'], subpart['quantity']) }} {{ blocks.model(subpart['model'], subpart['quantity']) }}
{% endfor %} {% endfor %}
@ -83,7 +83,7 @@
</div> </div>
<div class="ui tab" data-tab="related"> <div class="ui tab" data-tab="related">
<div class="ui eight column grid"> <div class="ui eight column grid parts">
{% for subpart in related %} {% for subpart in related %}
<div class="column"> <div class="column">
{{ blocks.model(subpart) }} {{ blocks.model(subpart) }}
@ -93,7 +93,7 @@
</div> </div>
<div class="ui tab" data-tab="parents"> <div class="ui tab" data-tab="parents">
<div class="ui eight column grid"> <div class="ui eight column grid parts">
{% for subpart in model.parents %} {% for subpart in model.parents %}
<div class="column"> <div class="column">
{{ blocks.model(subpart.parent) }} {{ blocks.model(subpart.parent) }}

View File

@ -11,31 +11,29 @@
<div class="row"> <div class="row">
<div class="column four wide"> <div class="column four wide">
<h3>{{ 'model.filter.title' | trans }}</h3> <h3>{{ 'model.filter.title' | trans }}</h3>
{#<form method="get" action="" class="ui form">#}
{{ form_start(form) }} {{ form_start(form) }}
{{ form_row(form.query) }}
{{ form_rest(form) }} {{ form_row(form.category) }}
<div class="field"> <div class="field">
<input class="ui fluid submit button" type="submit" value="Filter"/> <input class="ui fluid submit button" type="submit" value="Filter"/>
</div> </div>
{{ form_end(form) }} {{ form_end(form) }}
{#</form>#}
</div> </div>
<div class="column twelve wide"> <div class="column twelve wide">
<div class="ui header vertical noborder"> <div class="ui header vertical noborder">
<div class="ui text menu right floated"> <div class="ui text menu right floated">
<div class="header item">Sort By</div> <div class="header item">Sort By</div>
{{ knp_pagination_sortable(models, 'Number', 'm.id', {'class':'item'}) }} {{ knp_pagination_sortable(models, 'Number', 'm.id') }}
{{ knp_pagination_sortable(models, 'Name', ['m.name'], {'class':'item'}) }} {{ knp_pagination_sortable(models, 'Name', 'm.name') }}
</div> </div>
<div class="found-count ui text menu"> <div class="found-count ui text menu">
<div class="header item">Showing</div> <div class="header item">Showing</div>
<span class="item">{{ models.getTotalItemCount }}</span> <span class="item">{{ models.getTotalItemCount }}</span>
</div> </div>
</div> </div>
<div class="ui segment vertical noborder"> <div class="ui segment vertical noborder">
<div class="ui six column doubling grid"> <div class="ui six column doubling grid parts">
{% for model in models %} {% for model in models %}
{{ blocks.model(model) }} {{ blocks.model(model) }}
{% else %} {% else %}

View File

@ -0,0 +1,12 @@
{% if options['class'] == 'asc' %}
{% set icon = '<i class="icon sort content ascending"></i>' %}
{% set class = 'item active' %}
{% elseif options['class'] == 'desc' %}
{% set icon = '<i class="icon sort content descending"></i>' %}
{% set class = 'item active' %}
{% else %}
{% set icon = null %}
{% set class = 'item' %}
{% endif %}
<a class="{{ class }}" {% for attr, value in options %} {{ attr }}="{{ value }}"{% endfor %}>{{ icon|raw }} {{ title }}</a>

View File

@ -7,26 +7,27 @@
{% block header %}{{ 'page.search' | trans({'%query%':query}) }}{% endblock %} {% block header %}{{ 'page.search' | trans({'%query%':query}) }}{% endblock %}
{% block content %} {% block content %}
<div class="ui vertical segment noborder"> <div class="ui vertical segment noborder">
<h3 class="ui dividing header">Sets</h3> <h2 class="ui dividing header">Sets</h2>
<div class="ui eight column doubling grid sets"> <div class="ui eight column doubling grid sets">
{% for set in sets %} {% for set in sets %}
{{ blocks.set(set) }} {{ blocks.set(set) }}
{% endfor %} {% endfor %}
</div> </div>
<a href="{{ path('set_index',{'s[query]':query}) }}">Show more</a> <div class="spacing top">
<a class="show all" href="{{ path('set_index',{'s[query]':query}) }}">{{ 'view.all.sets' | trans }}</a>
</div>
</div> </div>
<div class="ui vertical segment noborder"> <div class="ui vertical segment noborder">
<h3 class="ui dividing header">Models</h3> <h2 class="ui dividing header">Models</h2>
<div class="ui eight column doubling grid parts"> <div class="ui eight column doubling grid parts">
{% for model in models %} {% for model in models %}
{{ blocks.model(model) }} {{ blocks.model(model) }}
{% endfor %} {% endfor %}
</div> </div>
<a href="{{ path('model_index',{'m[query]':query}) }}">Show more</a> <div class="spacing top">
<a class="show all" href="{{ path('model_index',{'m[query]':query}) }}">{{ 'view.all.models' | trans }}</a>
</div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -9,9 +9,9 @@
{% block content %} {% block content %}
<div class="ui stackable grid"> <div class="ui stackable grid">
<div class="column nine wide"> <div class="column nine wide">
<div class="ui bordered fluid image"> <a class="ui bordered fluid image" href="{{ asset(set.id~'.jpg')|imagine_filter('set_large') }}" data-lightbox="setImages">
{{ blocks.setImage(set.id,'set_large') }} {{ blocks.setImage(set.id,'set_large') }}
</div> </a>
</div> </div>
<div class="column seven wide"> <div class="column seven wide">
<div class="item-info ui"> <div class="item-info ui">

View File

@ -8,49 +8,52 @@
{% block content %} {% block content %}
<div class="ui container divided stackable grid"> <div class="ui container divided stackable grid">
<div class="row"> <div class="row">
<div class="column four wide"> <div class="column four wide">
<h3>{{ 'set.filter.title' | trans }}</h3> <h3>{{ 'set.filter.title' | trans }}</h3>
{{ form_start(form) }} {{ form_start(form) }}
{{ form_row(form.query) }} {{ form_row(form.query) }}
{{ form_row(form.theme) }} {{ form_row(form.theme) }}
{{ form_row(form.year) }} {{ form_row(form.year) }}
{{ form_row(form.partCount) }} {{ form_row(form.partCount) }}
{{ form_rest(form) }} {{ form_rest(form) }}
<div class="field"> <div class="field">
<input class="ui fluid submit button" type="submit" value="Filter"/> <input class="ui fluid submit button" type="submit" value="Filter"/>
</div>
{{ form_end(form) }}
</div>
<div class="column twelve wide">
<div class="ui header vertical noborder">
<div class="ui text menu right floated">
<div class="header item">Sort By</div>
{{ knp_pagination_sortable(sets, 'Number', 's.id', {'class':'item'}) }}
{{ knp_pagination_sortable(sets, 'Year', 's.year', {'class':'item'}) }}
{{ knp_pagination_sortable(sets, 'Name', ['s.name'], {'class':'item'}) }}
{{ knp_pagination_sortable(sets, 'Parts', ['s.partCount'], {'class':'item'}) }}
</div>
<div class="found-count ui text menu">
<div class="header item">Showing</div>
<span class="item">{{ sets.getTotalItemCount }}</span>
</div> </div>
{{ form_end(form) }}
</div> </div>
<div class="column twelve wide">
<div class="ui header vertical noborder">
<div class="ui text menu right floated">
<div class="header item">Sort By</div>
<div class="ui segment vertical noborder"> {{ knp_pagination_sortable(sets, 'Number', ['s.id']) }}
<div class="ui four column doubling grid sets"> {{ knp_pagination_sortable(sets, 'Year', ['s.year']) }}
{% for set in sets %} {{ knp_pagination_sortable(sets, 'Name', ['s.name']) }}
{{ blocks.set(set) }} {{ knp_pagination_sortable(sets, 'Parts', ['s.partCount']) }}
{% else %} </div>
{{ blocks.empty('empty.sets') }}
{% endfor %} <div class="found-count ui text menu">
<div class="header item">Showing</div>
<span class="item">{{ sets.getTotalItemCount }}</span>
</div>
</div>
<div class="ui segment vertical noborder">
<div class="ui four column doubling grid sets">
{% for set in sets %}
{{ blocks.set(set) }}
{% else %}
{{ blocks.empty('empty.sets') }}
{% endfor %}
</div>
</div>
<div class="ui segment vertical noborder">
{{ knp_pagination_render(sets) }}
</div> </div>
</div>
<div class="ui segment vertical noborder">
{{ knp_pagination_render(sets) }}
</div> </div>
</div> </div>
</div> </div>

View File

@ -99,15 +99,15 @@ knp_menu:
default_renderer: twig default_renderer: twig
knp_paginator: knp_paginator:
page_range: 10 # default page range used in pagination control page_range: 5 # default page range used in pagination control
default_options: default_options:
page_name: page # page query parameter name page_name: page # page query parameter name
sort_field_name: sort # sort field query parameter name sort_field_name: sort # sort field query parameter name
sort_direction_name: direction # sort direction query parameter name sort_direction_name: dir # sort direction query parameter name
distinct: true # ensure distinct results, useful when ORM queries are using GROUP BY statements distinct: true # ensure distinct results, useful when ORM queries are using GROUP BY statements
template: template:
pagination: :pagination:knp_pagination.html.twig pagination: :pagination:knp_pagination.html.twig
sortable: KnpPaginatorBundle:Pagination:sortable_link.html.twig # sort link template sortable: :pagination:sortable_link.html.twig
oneup_flysystem: oneup_flysystem:
adapters: adapters:

View File

@ -10,27 +10,31 @@ fos_elastica:
custom_analyzer: custom_analyzer:
type: custom type: custom
tokenizer: nGram tokenizer: nGram
filter: [lowercase, snowball] filter: [lowercase,stopwords]
tokenizer: tokenizer:
nGram: nGram:
type: nGram type: nGram
min_gram: 3 min_gram: 3
max_gram: 10 max_gram: 20
filter: filter:
snowball: snowball:
type: snowball type: snowball
language: English language: English
stopwords:
type: stop
stopwords: [_english_]
ignore_case : true
types: types:
set: set:
mappings: mappings:
id: { analyzer: custom_analyzer, search_analyzer: "standard" } id: ~
name: { analyzer: custom_analyzer, search_analyzer: "standard" } name: { analyzer: custom_analyzer, search_analyzer: "standard" }
year: { type: integer } year: { type: integer }
partCount: { type: integer } partCount: { type: integer }
theme: theme:
type: "object" type: "object"
properties: properties:
id: { analyzer: custom_analyzer, search_analyzer: "standard" } id: ~
name: { analyzer: custom_analyzer, search_analyzer: "standard" } name: { analyzer: custom_analyzer, search_analyzer: "standard" }
persistence: persistence:
driver: orm driver: orm
@ -40,16 +44,16 @@ fos_elastica:
repository: AppBundle\Repository\Search\SetRepository repository: AppBundle\Repository\Search\SetRepository
model: model:
mappings: mappings:
id: { analyzer: custom_analyzer, search_analyzer: "standard" } id: ~
name: { analyzer: custom_analyzer, search_analyzer: "standard" } name: { analyzer: custom_analyzer, search_analyzer: "standard" }
aliases: aliases:
type: "object" type: "object"
properties: properties:
id: { analyzer: custom_analyzer, search_analyzer: "standard" } id: ~
category: category:
type: "object" type: "object"
properties: properties:
id: { analyzer: custom_analyzer, search_analyzer: "standard" } id: ~
name: { analyzer: custom_analyzer, search_analyzer: "standard" } name: { analyzer: custom_analyzer, search_analyzer: "standard" }
keywords: keywords:
type: "object" type: "object"

View File

@ -10,7 +10,8 @@ liip_imagine:
cache: ~ cache: ~
default_image: "/resources/images/noimage_min.png" default_image: "/resources/images/noimage_min.png"
filters: filters:
thumbnail: { size: [200, 200], mode: inset, allow_upscale: true } upscale: { min: [230, 230] }
thumbnail: { size: [230, 230], mode: inset, allow_upscale: true }
background: { size: [250, 250], position: center, color: '#FFFFFF' } background: { size: [250, 250], position: center, color: '#FFFFFF' }
set_large: set_large:
data_loader: set_image_loader data_loader: set_image_loader
@ -18,6 +19,7 @@ liip_imagine:
quality: 90 quality: 90
default_image: "/resources/images/noimage_large.png" default_image: "/resources/images/noimage_large.png"
filters: filters:
upscale: { min: [840, 580] }
thumbnail: { size: [840, 580], mode: inset, allow_upscale: true } thumbnail: { size: [840, 580], mode: inset, allow_upscale: true }
background: { size: [900, 600], position: center, color: '#FFFFFF' } background: { size: [900, 600], position: center, color: '#FFFFFF' }
part_min: part_min:
@ -26,8 +28,8 @@ liip_imagine:
cache: ~ cache: ~
default_image: "/resources/images/noimage_min.png" default_image: "/resources/images/noimage_min.png"
filters: filters:
upscale: {min: [200, 200]} upscale: { min: [230, 230] }
thumbnail: { size: [200, 200], mode: inset, allow_upscale: true } thumbnail: { size: [230, 230], mode: inset, allow_upscale: true }
background: { size: [250, 250], position: center, color: '#FFFFFF' } background: { size: [250, 250], position: center, color: '#FFFFFF' }
part_large: part_large:
data_loader: part_image_loader data_loader: part_image_loader
@ -35,5 +37,6 @@ liip_imagine:
quality: 90 quality: 90
default_image: "/resources/images/noimage_large.png" default_image: "/resources/images/noimage_large.png"
filters: filters:
thumbnail: { size: [840, 580], mode: inset, allow_upscale: true } upscale: { min: [600, 400] }
background: { size: [900, 600], position: center, color: '#FFFFFF' } thumbnail: { size: [600, 400], mode: inset, allow_upscale: true }
background: { size: [900, 600], position: center, color: '#FFFFFF' }

View File

@ -2,6 +2,8 @@
namespace AppBundle\Controller; namespace AppBundle\Controller;
use AppBundle\Repository\LDraw\ModelRepository;
use AppBundle\Repository\Rebrickable\SetRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
@ -13,7 +15,14 @@ class DefaultController extends Controller
*/ */
public function indexAction(Request $request) public function indexAction(Request $request)
{ {
/** @var ModelRepository $modelRepository */
$modelRepository = $this->get('repository.ldraw.model');
/** @var SetRepository $setRepository */
$setRepository = $this->get('repository.rebrickable.set');
return $this->render('default/index.html.twig', [ return $this->render('default/index.html.twig', [
'models' => $modelRepository->count(),
'sets' => $setRepository->count(),
]); ]);
} }
} }

View File

@ -5,6 +5,7 @@ namespace AppBundle\Controller;
use AppBundle\Entity\LDraw\Model; use AppBundle\Entity\LDraw\Model;
use AppBundle\Form\Search\ModelSearchType; use AppBundle\Form\Search\ModelSearchType;
use AppBundle\Model\ModelSearch; use AppBundle\Model\ModelSearch;
use Knp\Component\Pager\Paginator;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller;
@ -32,15 +33,9 @@ class ModelController extends Controller
$form->handleRequest($request); $form->handleRequest($request);
$elasticaManager = $this->get('fos_elastica.manager'); $elasticaManager = $this->get('fos_elastica.manager');
$results = $elasticaManager->getRepository(Model::class)->search($modelSearch); $results = $elasticaManager->getRepository(Model::class)->search($modelSearch,5000);
$paginator = $this->get('knp_paginator');
$sets = $paginator->paginate(
$results,
$request->query->getInt('page', 1)/*page number*/,
$request->query->getInt('limit', 30)/*limit per page*/
);
/** @var Paginator $paginator */
$paginator = $this->get('knp_paginator'); $paginator = $this->get('knp_paginator');
$models = $paginator->paginate( $models = $paginator->paginate(
$results, $results,

View File

@ -8,6 +8,8 @@ use AppBundle\Repository\Search\ModelRepository;
use AppBundle\Repository\Search\SetRepository; use AppBundle\Repository\Search\SetRepository;
use FOS\ElasticaBundle\HybridResult; use FOS\ElasticaBundle\HybridResult;
use FOS\ElasticaBundle\Repository; use FOS\ElasticaBundle\Repository;
use Liip\ImagineBundle\Imagine\Cache\CacheManager;
use Liip\ImagineBundle\Imagine\Cache\Resolver\CacheResolver;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\JsonResponse;
@ -53,6 +55,9 @@ class SearchController extends Controller
{ {
$query = trim(strip_tags($request->get('query'))); $query = trim(strip_tags($request->get('query')));
/** @var CacheManager $liip */
$liip = $this->get('liip_imagine.cache.manager');
/** var FOS\ElasticaBundle\Manager\RepositoryManager */ /** var FOS\ElasticaBundle\Manager\RepositoryManager */
$repositoryManager = $this->get('fos_elastica.manager'); $repositoryManager = $this->get('fos_elastica.manager');
@ -75,6 +80,7 @@ class SearchController extends Controller
'id' => $id, 'id' => $id,
'name' => $name, 'name' => $name,
'url' => $this->generateUrl('model_detail', ['id' => $model->getTransformed()->getId()]), 'url' => $this->generateUrl('model_detail', ['id' => $model->getTransformed()->getId()]),
'img' => $liip->getBrowserPath('-1/'.$model->getTransformed()->getId().'.png','part_min'),
]; ];
} }
@ -83,11 +89,12 @@ class SearchController extends Controller
foreach ($setsResult as $set) { foreach ($setsResult as $set) {
$id = isset($set->getResult()->getHighlights()['id']) ? $set->getResult()->getHighlights()['id'][0] : $set->getTransformed()->getId(); $id = isset($set->getResult()->getHighlights()['id']) ? $set->getResult()->getHighlights()['id'][0] : $set->getTransformed()->getId();
$name = isset($set->getResult()->getHighlights()['name']) ? $set->getResult()->getHighlights()['name'][0] : $set->getTransformed()->getName(); $name = isset($set->getResult()->getHighlights()['name']) ? $set->getResult()->getHighlights()['name'][0] : $set->getTransformed()->getName();
$sets[] = [ $sets[] = [
'id' => $id, 'id' => $id,
'name' => $name, 'name' => $name,
'url' => $this->generateUrl('set_detail', ['id' => $set->getTransformed()->getId()]), 'url' => $this->generateUrl('set_detail', ['id' => $set->getTransformed()->getId()]),
'img' => $liip->getBrowserPath($set->getTransformed()->getId().'.jpg','set_min'),
]; ];
} }

View File

@ -32,7 +32,7 @@ class Builder
'route' => 'homepage', 'route' => 'homepage',
]); ]);
$menu->addChild('homepage', [ $menu->addChild('Home', [
'route' => 'homepage', 'route' => 'homepage',
]); ]);

View File

@ -106,6 +106,13 @@ class ModelRepository extends BaseRepository
return $queryBuilder->getQuery()->getResult(); return $queryBuilder->getQuery()->getResult();
} }
public function count() {
$queryBuilder = $this->createQueryBuilder('model');
$queryBuilder->select('count(model)');
return $queryBuilder->getQuery()->getSingleScalarResult();
}
/** /**
* Create new Model entity with $number or retrieve one. * Create new Model entity with $number or retrieve one.
* *

View File

@ -73,6 +73,13 @@ class SetRepository extends BaseRepository
return $queryBuilder->getQuery()->getSingleScalarResult(); return $queryBuilder->getQuery()->getSingleScalarResult();
} }
public function count() {
$queryBuilder = $this->createQueryBuilder('s');
$queryBuilder->select('count(s)');
return $queryBuilder->getQuery()->getSingleScalarResult();
}
public function getMaxYear() public function getMaxYear()
{ {
$queryBuilder = $this->createQueryBuilder('s') $queryBuilder = $this->createQueryBuilder('s')

View File

@ -13,23 +13,25 @@ class ModelRepository extends Repository
* @return \Elastica\Query * @return \Elastica\Query
*/ */
public function getSearchQuery(ModelSearch $modelSearch) { public function getSearchQuery(ModelSearch $modelSearch) {
$boolQuery = new \Elastica\Query\BoolQuery(); $boolQuery = new Query\BoolQuery();
if ($searchQuery = $modelSearch->getQuery()) { if ($searchQuery = $modelSearch->getQuery()) {
$query = new \Elastica\Query\MultiMatch(); $query = new Query\MultiMatch();
$query->setFields(['name', 'id', 'aliases.id', 'keywords.name']); $query->setFields(['name', 'id', 'aliases.id', 'keywords.name']);
$query->setQuery($searchQuery); $query->setQuery($searchQuery);
$query->setFuzziness(0.7); $query->setFuzziness(0.7);
$query->setMinimumShouldMatch('80%'); $query->setMinimumShouldMatch('80%');
$query->setOperator('and');
} else { } else {
$query = new \Elastica\Query\MatchAll(); $query = new Query\MatchAll();
} }
$boolQuery->addMust($query); $boolQuery->addMust($query);
if ($modelSearch->getCategory()) { if ($modelSearch->getCategory()) {
$categoryQuery = new \Elastica\Query\Match(); $categoryQuery = new Query\Match();
$categoryQuery->setField('category.id', $modelSearch->getCategory()->getId()); $categoryQuery->setField('category.id', $modelSearch->getCategory()->getId());
$boolQuery->addFilter($categoryQuery); $boolQuery->addFilter($categoryQuery);
} }
@ -37,13 +39,13 @@ class ModelRepository extends Repository
return new Query($boolQuery); return new Query($boolQuery);
} }
public function search(ModelSearch $modelSearch) public function search(ModelSearch $modelSearch, $limit = 500)
{ {
$query = $this->getSearchQuery($modelSearch); $query = $this->getSearchQuery($modelSearch);
return $this->find($query, 500); return $this->find($query, $limit);
} }
public function findHighlighted($query, $limit = null) { public function findHighlighted($query, $limit = 500) {
$modelSearch = new ModelSearch(); $modelSearch = new ModelSearch();
$modelSearch->setQuery($query); $modelSearch->setQuery($query);

View File

@ -27,9 +27,9 @@ class SetRepository extends Repository
$query->setQuery($searchQuery); $query->setQuery($searchQuery);
$query->setFuzziness(0.7); $query->setFuzziness(0.7);
$query->setMinimumShouldMatch('80%'); $query->setMinimumShouldMatch('80%');
$query->setOperator('and');
$boolQuery->addMust($query); $boolQuery->addMust($query);
} else { } else {
$query = new \Elastica\Query\MatchAll(); $query = new \Elastica\Query\MatchAll();
$boolQuery->addMust($query); $boolQuery->addMust($query);
@ -69,7 +69,7 @@ class SetRepository extends Repository
return $this->find($query, $limit); return $this->find($query, $limit);
} }
public function findHighlighted($query, $limit = null) { public function findHighlighted($query, $limit = 500) {
$setSearch = new SetSearch(); $setSearch = new SetSearch();
$setSearch->setQuery($query); $setSearch->setQuery($query);