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 {
|
.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 {
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
@import "mixins";
|
@import "mixins";
|
||||||
|
|
||||||
@import "main";
|
@import "main";
|
||||||
|
@import "homepage";
|
||||||
@import "modelviewer";
|
@import "modelviewer";
|
||||||
|
|
||||||
@import "part";
|
@import "part";
|
||||||
|
@ -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
|
@ -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
|
@ -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>
|
||||||
|
@ -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 %}
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
@ -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) %}
|
||||||
|
@ -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) }}
|
||||||
|
@ -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 %}
|
||||||
|
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 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 %}
|
@ -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">
|
||||||
|
@ -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>
|
||||||
|
@ -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:
|
||||||
|
@ -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"
|
||||||
|
@ -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' }
|
@ -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(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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'),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ class Builder
|
|||||||
'route' => 'homepage',
|
'route' => 'homepage',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$menu->addChild('homepage', [
|
$menu->addChild('Home', [
|
||||||
'route' => 'homepage',
|
'route' => 'homepage',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
@ -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.
|
||||||
*
|
*
|
||||||
|
@ -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')
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user