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:
commit
f3aaf178d4
24
app/Resources/assets/style/homepage.scss
Normal file
24
app/Resources/assets/style/homepage.scss
Normal 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;
|
||||
}
|
@ -1,12 +1,11 @@
|
||||
.default-theme {
|
||||
|
||||
.ui.main {
|
||||
padding-top: 10px;
|
||||
margin-top: 40px;
|
||||
padding-top: 50px;
|
||||
min-height: calc(100% - 67px);
|
||||
}
|
||||
|
||||
.ui.masthead {
|
||||
.ui.head {
|
||||
position: relative;
|
||||
|
||||
.header {
|
||||
@ -105,8 +104,29 @@
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.image {
|
||||
width: 4em;
|
||||
height: 4em;
|
||||
}
|
||||
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 {
|
||||
|
@ -2,6 +2,7 @@
|
||||
@import "mixins";
|
||||
|
||||
@import "main";
|
||||
@import "homepage";
|
||||
@import "modelviewer";
|
||||
|
||||
@import "part";
|
||||
|
@ -363,6 +363,16 @@ u9140p02c01: u9140p01c01
|
||||
|
||||
92243p02c01: 92243p01c01
|
||||
|
||||
u9142p02c03: u9142p01c08
|
||||
|
||||
u9151p02c03: u9151p01c04
|
||||
|
||||
u9106p02c02: u9106p01c03
|
||||
|
||||
u595p02c04: u595p01c10
|
||||
|
||||
u9140p02c02: u9140p01c04
|
||||
|
||||
64022c01: 64022
|
||||
64022c02: 64022
|
||||
|
||||
@ -382,3 +392,5 @@ u9209c01: u9209
|
||||
2772c03: 2772c01
|
||||
|
||||
81294: 3351a
|
||||
|
||||
61738: 54086
|
@ -69,3 +69,17 @@ filter:
|
||||
model:
|
||||
search: Search Model
|
||||
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
|
@ -1,6 +1,7 @@
|
||||
{% extends 'html.html.twig' %}
|
||||
|
||||
{% import 'macros/elements.html.twig' as elements %}
|
||||
{% import 'macros/blocks.html.twig' as blocks %}
|
||||
|
||||
{% block body %}
|
||||
<div class="ui fixed inverted menu">
|
||||
@ -21,7 +22,7 @@
|
||||
{% block page %}
|
||||
<div class="ui main">
|
||||
<div class="ui container">
|
||||
<div class="ui masthead vertical segment">
|
||||
<div class="ui head vertical segment">
|
||||
<h1 class="ui header">{% block header %}{% endblock %}</h1>
|
||||
|
||||
<div class="ui small breadcrumb">
|
||||
@ -73,7 +74,8 @@
|
||||
fields: {
|
||||
title: 'name',
|
||||
description: 'id',
|
||||
url: 'url'
|
||||
url: 'url',
|
||||
image: 'img'
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
@ -1,16 +1,51 @@
|
||||
{% extends 'base.html.twig' %}
|
||||
|
||||
{% block page %}
|
||||
<div class="ui main">
|
||||
<div class="ui grid massive message vertical">
|
||||
{% block body %}
|
||||
<!-- Page Contents -->
|
||||
<div class="pusher">
|
||||
<div class="ui inverted vertical masthead center aligned segment">
|
||||
|
||||
<div class="ui container">
|
||||
<div class="row">
|
||||
<div class="h1 ui huge header">
|
||||
Hello, world!
|
||||
<div class="ui large secondary inverted pointing menu">
|
||||
{{ 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>
|
||||
|
||||
<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>
|
||||
{% endblock %}
|
||||
|
||||
|
@ -14,7 +14,6 @@
|
||||
|
||||
{% endblock %}
|
||||
{% block javascripts %}
|
||||
|
||||
<script type="text/javascript" src="{{ asset('resources/js/three.js') }}"></script>
|
||||
|
||||
<script type="text/javascript" src="{{ asset('resources/js/OrbitControls.js') }}"></script>
|
||||
|
@ -5,6 +5,7 @@
|
||||
{% else %}
|
||||
{% set placeholder = asset("resources/images/transparent_min.png") %}
|
||||
{% endif %}
|
||||
|
||||
<img src="{{ placeholder }}" data-src="{{ asset(color~'/'~number~'.png') | imagine_filter(filter)}}">
|
||||
</div>
|
||||
{% endmacro %}
|
||||
@ -63,13 +64,13 @@
|
||||
{% import _self as blocks %}
|
||||
{{ blocks.setImage(set.id,'set_min') }}
|
||||
<div class="content">
|
||||
<h3 class="header truncate">
|
||||
<h3 title="{{ set.name }}" class="header truncate">
|
||||
{{ set.name }}
|
||||
</h3>
|
||||
<div class="meta">
|
||||
<span class="left floated">{{ set.id }}</span>
|
||||
<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 class="description">
|
||||
<small>
|
||||
@ -83,7 +84,9 @@
|
||||
{% endmacro %}
|
||||
|
||||
{% 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 %}
|
||||
|
||||
{% macro ccal2_license(title,author) %}
|
||||
|
@ -75,7 +75,7 @@
|
||||
<div class="ui vertical segment">
|
||||
|
||||
<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 %}
|
||||
{{ blocks.model(subpart['model'], subpart['quantity']) }}
|
||||
{% endfor %}
|
||||
@ -83,7 +83,7 @@
|
||||
</div>
|
||||
|
||||
<div class="ui tab" data-tab="related">
|
||||
<div class="ui eight column grid">
|
||||
<div class="ui eight column grid parts">
|
||||
{% for subpart in related %}
|
||||
<div class="column">
|
||||
{{ blocks.model(subpart) }}
|
||||
@ -93,7 +93,7 @@
|
||||
</div>
|
||||
|
||||
<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 %}
|
||||
<div class="column">
|
||||
{{ blocks.model(subpart.parent) }}
|
||||
|
@ -11,31 +11,29 @@
|
||||
<div class="row">
|
||||
<div class="column four wide">
|
||||
<h3>{{ 'model.filter.title' | trans }}</h3>
|
||||
{#<form method="get" action="" class="ui form">#}
|
||||
{{ form_start(form) }}
|
||||
|
||||
{{ form_rest(form) }}
|
||||
{{ form_row(form.query) }}
|
||||
{{ form_row(form.category) }}
|
||||
<div class="field">
|
||||
<input class="ui fluid submit button" type="submit" value="Filter"/>
|
||||
</div>
|
||||
{{ form_end(form) }}
|
||||
{#</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(models, 'Number', 'm.id', {'class':'item'}) }}
|
||||
{{ knp_pagination_sortable(models, 'Name', ['m.name'], {'class':'item'}) }}
|
||||
{{ knp_pagination_sortable(models, 'Number', 'm.id') }}
|
||||
{{ knp_pagination_sortable(models, 'Name', 'm.name') }}
|
||||
</div>
|
||||
|
||||
<div class="found-count ui text menu">
|
||||
<div class="header item">Showing</div>
|
||||
<span class="item">{{ models.getTotalItemCount }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<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 %}
|
||||
{{ blocks.model(model) }}
|
||||
{% else %}
|
||||
|
12
app/Resources/views/pagination/sortable_link.html.twig
Normal file
12
app/Resources/views/pagination/sortable_link.html.twig
Normal 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>
|
@ -7,26 +7,27 @@
|
||||
{% block header %}{{ 'page.search' | trans({'%query%':query}) }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
|
||||
<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">
|
||||
{% for set in sets %}
|
||||
{{ blocks.set(set) }}
|
||||
{% endfor %}
|
||||
</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 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">
|
||||
{% for model in models %}
|
||||
{{ blocks.model(model) }}
|
||||
{% endfor %}
|
||||
</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>
|
||||
{% endblock %}
|
@ -9,9 +9,9 @@
|
||||
{% block content %}
|
||||
<div class="ui stackable grid">
|
||||
<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') }}
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="column seven wide">
|
||||
<div class="item-info ui">
|
||||
|
@ -8,49 +8,52 @@
|
||||
|
||||
{% block content %}
|
||||
<div class="ui container divided stackable grid">
|
||||
<div class="row">
|
||||
<div class="column four wide">
|
||||
<h3>{{ 'set.filter.title' | trans }}</h3>
|
||||
{{ form_start(form) }}
|
||||
<div class="row">
|
||||
<div class="column four wide">
|
||||
<h3>{{ 'set.filter.title' | trans }}</h3>
|
||||
{{ form_start(form) }}
|
||||
|
||||
{{ form_row(form.query) }}
|
||||
{{ form_row(form.theme) }}
|
||||
{{ form_row(form.year) }}
|
||||
{{ form_row(form.partCount) }}
|
||||
{{ form_row(form.query) }}
|
||||
{{ form_row(form.theme) }}
|
||||
{{ form_row(form.year) }}
|
||||
{{ form_row(form.partCount) }}
|
||||
|
||||
{{ form_rest(form) }}
|
||||
{{ form_rest(form) }}
|
||||
|
||||
<div class="field">
|
||||
<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 class="field">
|
||||
<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>
|
||||
|
||||
<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 %}
|
||||
{{ knp_pagination_sortable(sets, 'Number', ['s.id']) }}
|
||||
{{ knp_pagination_sortable(sets, 'Year', ['s.year']) }}
|
||||
{{ knp_pagination_sortable(sets, 'Name', ['s.name']) }}
|
||||
{{ knp_pagination_sortable(sets, 'Parts', ['s.partCount']) }}
|
||||
</div>
|
||||
|
||||
<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 class="ui segment vertical noborder">
|
||||
{{ knp_pagination_render(sets) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -99,15 +99,15 @@ knp_menu:
|
||||
default_renderer: twig
|
||||
|
||||
knp_paginator:
|
||||
page_range: 10 # default page range used in pagination control
|
||||
page_range: 5 # default page range used in pagination control
|
||||
default_options:
|
||||
page_name: page # page 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
|
||||
template:
|
||||
pagination: :pagination:knp_pagination.html.twig
|
||||
sortable: KnpPaginatorBundle:Pagination:sortable_link.html.twig # sort link template
|
||||
sortable: :pagination:sortable_link.html.twig
|
||||
|
||||
oneup_flysystem:
|
||||
adapters:
|
||||
|
@ -10,27 +10,31 @@ fos_elastica:
|
||||
custom_analyzer:
|
||||
type: custom
|
||||
tokenizer: nGram
|
||||
filter: [lowercase, snowball]
|
||||
filter: [lowercase,stopwords]
|
||||
tokenizer:
|
||||
nGram:
|
||||
type: nGram
|
||||
min_gram: 3
|
||||
max_gram: 10
|
||||
max_gram: 20
|
||||
filter:
|
||||
snowball:
|
||||
type: snowball
|
||||
language: English
|
||||
stopwords:
|
||||
type: stop
|
||||
stopwords: [_english_]
|
||||
ignore_case : true
|
||||
types:
|
||||
set:
|
||||
mappings:
|
||||
id: { analyzer: custom_analyzer, search_analyzer: "standard" }
|
||||
id: ~
|
||||
name: { analyzer: custom_analyzer, search_analyzer: "standard" }
|
||||
year: { type: integer }
|
||||
partCount: { type: integer }
|
||||
theme:
|
||||
type: "object"
|
||||
properties:
|
||||
id: { analyzer: custom_analyzer, search_analyzer: "standard" }
|
||||
id: ~
|
||||
name: { analyzer: custom_analyzer, search_analyzer: "standard" }
|
||||
persistence:
|
||||
driver: orm
|
||||
@ -40,16 +44,16 @@ fos_elastica:
|
||||
repository: AppBundle\Repository\Search\SetRepository
|
||||
model:
|
||||
mappings:
|
||||
id: { analyzer: custom_analyzer, search_analyzer: "standard" }
|
||||
id: ~
|
||||
name: { analyzer: custom_analyzer, search_analyzer: "standard" }
|
||||
aliases:
|
||||
type: "object"
|
||||
properties:
|
||||
id: { analyzer: custom_analyzer, search_analyzer: "standard" }
|
||||
id: ~
|
||||
category:
|
||||
type: "object"
|
||||
properties:
|
||||
id: { analyzer: custom_analyzer, search_analyzer: "standard" }
|
||||
id: ~
|
||||
name: { analyzer: custom_analyzer, search_analyzer: "standard" }
|
||||
keywords:
|
||||
type: "object"
|
||||
|
@ -10,7 +10,8 @@ liip_imagine:
|
||||
cache: ~
|
||||
default_image: "/resources/images/noimage_min.png"
|
||||
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' }
|
||||
set_large:
|
||||
data_loader: set_image_loader
|
||||
@ -18,6 +19,7 @@ liip_imagine:
|
||||
quality: 90
|
||||
default_image: "/resources/images/noimage_large.png"
|
||||
filters:
|
||||
upscale: { min: [840, 580] }
|
||||
thumbnail: { size: [840, 580], mode: inset, allow_upscale: true }
|
||||
background: { size: [900, 600], position: center, color: '#FFFFFF' }
|
||||
part_min:
|
||||
@ -26,8 +28,8 @@ liip_imagine:
|
||||
cache: ~
|
||||
default_image: "/resources/images/noimage_min.png"
|
||||
filters:
|
||||
upscale: {min: [200, 200]}
|
||||
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' }
|
||||
part_large:
|
||||
data_loader: part_image_loader
|
||||
@ -35,5 +37,6 @@ liip_imagine:
|
||||
quality: 90
|
||||
default_image: "/resources/images/noimage_large.png"
|
||||
filters:
|
||||
thumbnail: { size: [840, 580], mode: inset, allow_upscale: true }
|
||||
upscale: { min: [600, 400] }
|
||||
thumbnail: { size: [600, 400], mode: inset, allow_upscale: true }
|
||||
background: { size: [900, 600], position: center, color: '#FFFFFF' }
|
@ -2,6 +2,8 @@
|
||||
|
||||
namespace AppBundle\Controller;
|
||||
|
||||
use AppBundle\Repository\LDraw\ModelRepository;
|
||||
use AppBundle\Repository\Rebrickable\SetRepository;
|
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
@ -13,7 +15,14 @@ class DefaultController extends Controller
|
||||
*/
|
||||
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', [
|
||||
'models' => $modelRepository->count(),
|
||||
'sets' => $setRepository->count(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ namespace AppBundle\Controller;
|
||||
use AppBundle\Entity\LDraw\Model;
|
||||
use AppBundle\Form\Search\ModelSearchType;
|
||||
use AppBundle\Model\ModelSearch;
|
||||
use Knp\Component\Pager\Paginator;
|
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
|
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||
@ -32,15 +33,9 @@ class ModelController extends Controller
|
||||
$form->handleRequest($request);
|
||||
|
||||
$elasticaManager = $this->get('fos_elastica.manager');
|
||||
$results = $elasticaManager->getRepository(Model::class)->search($modelSearch);
|
||||
|
||||
$paginator = $this->get('knp_paginator');
|
||||
$sets = $paginator->paginate(
|
||||
$results,
|
||||
$request->query->getInt('page', 1)/*page number*/,
|
||||
$request->query->getInt('limit', 30)/*limit per page*/
|
||||
);
|
||||
$results = $elasticaManager->getRepository(Model::class)->search($modelSearch,5000);
|
||||
|
||||
/** @var Paginator $paginator */
|
||||
$paginator = $this->get('knp_paginator');
|
||||
$models = $paginator->paginate(
|
||||
$results,
|
||||
|
@ -8,6 +8,8 @@ use AppBundle\Repository\Search\ModelRepository;
|
||||
use AppBundle\Repository\Search\SetRepository;
|
||||
use FOS\ElasticaBundle\HybridResult;
|
||||
use FOS\ElasticaBundle\Repository;
|
||||
use Liip\ImagineBundle\Imagine\Cache\CacheManager;
|
||||
use Liip\ImagineBundle\Imagine\Cache\Resolver\CacheResolver;
|
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
@ -53,6 +55,9 @@ class SearchController extends Controller
|
||||
{
|
||||
$query = trim(strip_tags($request->get('query')));
|
||||
|
||||
/** @var CacheManager $liip */
|
||||
$liip = $this->get('liip_imagine.cache.manager');
|
||||
|
||||
/** var FOS\ElasticaBundle\Manager\RepositoryManager */
|
||||
$repositoryManager = $this->get('fos_elastica.manager');
|
||||
|
||||
@ -75,6 +80,7 @@ class SearchController extends Controller
|
||||
'id' => $id,
|
||||
'name' => $name,
|
||||
'url' => $this->generateUrl('model_detail', ['id' => $model->getTransformed()->getId()]),
|
||||
'img' => $liip->getBrowserPath('-1/'.$model->getTransformed()->getId().'.png','part_min'),
|
||||
];
|
||||
}
|
||||
|
||||
@ -88,6 +94,7 @@ class SearchController extends Controller
|
||||
'id' => $id,
|
||||
'name' => $name,
|
||||
'url' => $this->generateUrl('set_detail', ['id' => $set->getTransformed()->getId()]),
|
||||
'img' => $liip->getBrowserPath($set->getTransformed()->getId().'.jpg','set_min'),
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -32,7 +32,7 @@ class Builder
|
||||
'route' => 'homepage',
|
||||
]);
|
||||
|
||||
$menu->addChild('homepage', [
|
||||
$menu->addChild('Home', [
|
||||
'route' => 'homepage',
|
||||
]);
|
||||
|
||||
|
@ -106,6 +106,13 @@ class ModelRepository extends BaseRepository
|
||||
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.
|
||||
*
|
||||
|
@ -73,6 +73,13 @@ class SetRepository extends BaseRepository
|
||||
return $queryBuilder->getQuery()->getSingleScalarResult();
|
||||
}
|
||||
|
||||
public function count() {
|
||||
$queryBuilder = $this->createQueryBuilder('s');
|
||||
$queryBuilder->select('count(s)');
|
||||
|
||||
return $queryBuilder->getQuery()->getSingleScalarResult();
|
||||
}
|
||||
|
||||
public function getMaxYear()
|
||||
{
|
||||
$queryBuilder = $this->createQueryBuilder('s')
|
||||
|
@ -13,23 +13,25 @@ class ModelRepository extends Repository
|
||||
* @return \Elastica\Query
|
||||
*/
|
||||
public function getSearchQuery(ModelSearch $modelSearch) {
|
||||
$boolQuery = new \Elastica\Query\BoolQuery();
|
||||
$boolQuery = new Query\BoolQuery();
|
||||
|
||||
if ($searchQuery = $modelSearch->getQuery()) {
|
||||
$query = new \Elastica\Query\MultiMatch();
|
||||
$query = new Query\MultiMatch();
|
||||
|
||||
$query->setFields(['name', 'id', 'aliases.id', 'keywords.name']);
|
||||
$query->setQuery($searchQuery);
|
||||
$query->setFuzziness(0.7);
|
||||
$query->setMinimumShouldMatch('80%');
|
||||
$query->setOperator('and');
|
||||
|
||||
} else {
|
||||
$query = new \Elastica\Query\MatchAll();
|
||||
$query = new Query\MatchAll();
|
||||
}
|
||||
|
||||
$boolQuery->addMust($query);
|
||||
|
||||
if ($modelSearch->getCategory()) {
|
||||
$categoryQuery = new \Elastica\Query\Match();
|
||||
$categoryQuery = new Query\Match();
|
||||
$categoryQuery->setField('category.id', $modelSearch->getCategory()->getId());
|
||||
$boolQuery->addFilter($categoryQuery);
|
||||
}
|
||||
@ -37,13 +39,13 @@ class ModelRepository extends Repository
|
||||
return new Query($boolQuery);
|
||||
}
|
||||
|
||||
public function search(ModelSearch $modelSearch)
|
||||
public function search(ModelSearch $modelSearch, $limit = 500)
|
||||
{
|
||||
$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->setQuery($query);
|
||||
|
||||
|
@ -27,9 +27,9 @@ class SetRepository extends Repository
|
||||
$query->setQuery($searchQuery);
|
||||
$query->setFuzziness(0.7);
|
||||
$query->setMinimumShouldMatch('80%');
|
||||
$query->setOperator('and');
|
||||
|
||||
$boolQuery->addMust($query);
|
||||
|
||||
} else {
|
||||
$query = new \Elastica\Query\MatchAll();
|
||||
$boolQuery->addMust($query);
|
||||
@ -69,7 +69,7 @@ class SetRepository extends Repository
|
||||
return $this->find($query, $limit);
|
||||
}
|
||||
|
||||
public function findHighlighted($query, $limit = null) {
|
||||
public function findHighlighted($query, $limit = 500) {
|
||||
$setSearch = new SetSearch();
|
||||
$setSearch->setQuery($query);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user