+
{{ set.name }}
@@ -83,7 +84,9 @@
{% endmacro %}
{% macro empty(message) %}
- {{ message }}
+
+ {{ message }}
+
{% endmacro %}
{% macro ccal2_license(title,author) %}
diff --git a/app/Resources/views/model/detail.html.twig b/app/Resources/views/model/detail.html.twig
index e744bd3..e4c1c76 100644
--- a/app/Resources/views/model/detail.html.twig
+++ b/app/Resources/views/model/detail.html.twig
@@ -75,7 +75,7 @@
-
+
{% for subpart in subparts %}
{{ blocks.model(subpart['model'], subpart['quantity']) }}
{% endfor %}
@@ -83,7 +83,7 @@
-
+
{% for subpart in related %}
{{ blocks.model(subpart) }}
@@ -93,7 +93,7 @@
-
+
{% for subpart in model.parents %}
{{ blocks.model(subpart.parent) }}
diff --git a/app/Resources/views/model/index.html.twig b/app/Resources/views/model/index.html.twig
index 07cc44f..a74a840 100644
--- a/app/Resources/views/model/index.html.twig
+++ b/app/Resources/views/model/index.html.twig
@@ -11,31 +11,29 @@
{{ 'model.filter.title' | trans }}
- {##}
-
+
-
+
{% for model in models %}
{{ blocks.model(model) }}
{% else %}
diff --git a/app/Resources/views/pagination/sortable_link.html.twig b/app/Resources/views/pagination/sortable_link.html.twig
new file mode 100644
index 0000000..ba3deed
--- /dev/null
+++ b/app/Resources/views/pagination/sortable_link.html.twig
@@ -0,0 +1,12 @@
+{% if options['class'] == 'asc' %}
+ {% set icon = '' %}
+ {% set class = 'item active' %}
+{% elseif options['class'] == 'desc' %}
+ {% set icon = '' %}
+ {% set class = 'item active' %}
+{% else %}
+ {% set icon = null %}
+ {% set class = 'item' %}
+{% endif %}
+
+{{ icon|raw }} {{ title }}
diff --git a/app/Resources/views/search/index.html.twig b/app/Resources/views/search/index.html.twig
index 26b289c..d299104 100644
--- a/app/Resources/views/search/index.html.twig
+++ b/app/Resources/views/search/index.html.twig
@@ -7,26 +7,27 @@
{% block header %}{{ 'page.search' | trans({'%query%':query}) }}{% endblock %}
{% block content %}
-
-
-
{% endblock %}
\ No newline at end of file
diff --git a/app/Resources/views/set/detail.html.twig b/app/Resources/views/set/detail.html.twig
index 17d8fc1..e0cb3bb 100644
--- a/app/Resources/views/set/detail.html.twig
+++ b/app/Resources/views/set/detail.html.twig
@@ -9,9 +9,9 @@
{% block content %}
diff --git a/app/Resources/views/set/index.html.twig b/app/Resources/views/set/index.html.twig
index 6515d4f..191c027 100644
--- a/app/Resources/views/set/index.html.twig
+++ b/app/Resources/views/set/index.html.twig
@@ -8,49 +8,52 @@
{% block content %}
-
-
- {{ 'set.filter.title' | trans }}
- {{ form_start(form) }}
+
+
+ {{ 'set.filter.title' | trans }}
+ {{ 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) }}
-
-
-
- {{ form_end(form) }}
-
-
-
-
+
+
- {{ knp_pagination_render(sets) }}
-
diff --git a/app/config/config.yml b/app/config/config.yml
index bd01a7a..8e24293 100644
--- a/app/config/config.yml
+++ b/app/config/config.yml
@@ -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:
diff --git a/app/config/config/fos_elastica.yml b/app/config/config/fos_elastica.yml
index 4abcb18..0dbac78 100644
--- a/app/config/config/fos_elastica.yml
+++ b/app/config/config/fos_elastica.yml
@@ -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"
diff --git a/app/config/config/liip_imagine.yml b/app/config/config/liip_imagine.yml
index 8229250..0f82002 100644
--- a/app/config/config/liip_imagine.yml
+++ b/app/config/config/liip_imagine.yml
@@ -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 }
- background: { size: [900, 600], position: center, color: '#FFFFFF' }
+ upscale: { min: [600, 400] }
+ thumbnail: { size: [600, 400], mode: inset, allow_upscale: true }
+ background: { size: [900, 600], position: center, color: '#FFFFFF' }
\ No newline at end of file
diff --git a/src/AppBundle/Controller/DefaultController.php b/src/AppBundle/Controller/DefaultController.php
index 36ea5c0..576b743 100644
--- a/src/AppBundle/Controller/DefaultController.php
+++ b/src/AppBundle/Controller/DefaultController.php
@@ -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(),
]);
}
}
diff --git a/src/AppBundle/Controller/ModelController.php b/src/AppBundle/Controller/ModelController.php
index e63ce00..bc487b5 100644
--- a/src/AppBundle/Controller/ModelController.php
+++ b/src/AppBundle/Controller/ModelController.php
@@ -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,
diff --git a/src/AppBundle/Controller/SearchController.php b/src/AppBundle/Controller/SearchController.php
index bf3416b..3c2ce27 100644
--- a/src/AppBundle/Controller/SearchController.php
+++ b/src/AppBundle/Controller/SearchController.php
@@ -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'),
];
}
@@ -83,11 +89,12 @@ class SearchController extends Controller
foreach ($setsResult as $set) {
$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();
-
+
$sets[] = [
'id' => $id,
'name' => $name,
'url' => $this->generateUrl('set_detail', ['id' => $set->getTransformed()->getId()]),
+ 'img' => $liip->getBrowserPath($set->getTransformed()->getId().'.jpg','set_min'),
];
}
diff --git a/src/AppBundle/Menu/Builder.php b/src/AppBundle/Menu/Builder.php
index dc1c5c0..e8ca503 100644
--- a/src/AppBundle/Menu/Builder.php
+++ b/src/AppBundle/Menu/Builder.php
@@ -32,7 +32,7 @@ class Builder
'route' => 'homepage',
]);
- $menu->addChild('homepage', [
+ $menu->addChild('Home', [
'route' => 'homepage',
]);
diff --git a/src/AppBundle/Repository/LDraw/ModelRepository.php b/src/AppBundle/Repository/LDraw/ModelRepository.php
index 648f499..05c7fce 100644
--- a/src/AppBundle/Repository/LDraw/ModelRepository.php
+++ b/src/AppBundle/Repository/LDraw/ModelRepository.php
@@ -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.
*
diff --git a/src/AppBundle/Repository/Rebrickable/SetRepository.php b/src/AppBundle/Repository/Rebrickable/SetRepository.php
index 710533a..9674dc7 100644
--- a/src/AppBundle/Repository/Rebrickable/SetRepository.php
+++ b/src/AppBundle/Repository/Rebrickable/SetRepository.php
@@ -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')
diff --git a/src/AppBundle/Repository/Search/ModelRepository.php b/src/AppBundle/Repository/Search/ModelRepository.php
index dc91b8d..c948ef2 100644
--- a/src/AppBundle/Repository/Search/ModelRepository.php
+++ b/src/AppBundle/Repository/Search/ModelRepository.php
@@ -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);
diff --git a/src/AppBundle/Repository/Search/SetRepository.php b/src/AppBundle/Repository/Search/SetRepository.php
index 21146af..cf126c8 100644
--- a/src/AppBundle/Repository/Search/SetRepository.php
+++ b/src/AppBundle/Repository/Search/SetRepository.php
@@ -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);
-
+
{{ message }}
+{{ message }}
+