From 3540a203e38bb43bc84cfd18779e720d5dcd54a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20H=C3=BCbner?= Date: Wed, 5 Apr 2017 19:49:30 +0200 Subject: [PATCH] Update controllers and views --- app/Resources/views/base.html.twig | 7 ++ .../views/{set => brickset}/browse.html.twig | 0 app/Resources/views/error/error.html.twig | 11 ++ .../views/ldraw/model/detail.html.twig | 85 ++++++++++++++ .../ldraw/{part => model}/index.html.twig | 10 +- app/Resources/views/ldraw/part/show.html.twig | 90 --------------- app/Resources/views/macro/part.html.twig | 6 - app/Resources/views/macros/elements.html.twig | 34 ++++++ .../views/rebrickable/color/index.html.twig | 28 +++++ .../views/rebrickable/part/show.html.twig | 37 ++++++ .../views/rebrickable/set/detail.html.twig | 52 +++++++++ .../views/rebrickable/set/index.html.twig | 21 ++++ app/Resources/views/set/detail.html.twig | 27 ----- .../{ => Brickset}/SetController.php | 31 +---- ...PartController.php => ModelController.php} | 57 +++++----- src/AppBundle/Controller/MediaController.php | 23 ++-- .../Rebrickable/ColorController.php | 29 +++++ .../Controller/Rebrickable/PartController.php | 51 +++++++++ .../Controller/Rebrickable/SetController.php | 106 ++++++++++++++++++ ...PartFilterType.php => ModelFilterType.php} | 13 ++- src/AppBundle/Menu/Builder.php | 10 +- 21 files changed, 523 insertions(+), 205 deletions(-) rename app/Resources/views/{set => brickset}/browse.html.twig (100%) create mode 100644 app/Resources/views/error/error.html.twig create mode 100644 app/Resources/views/ldraw/model/detail.html.twig rename app/Resources/views/ldraw/{part => model}/index.html.twig (75%) delete mode 100644 app/Resources/views/ldraw/part/show.html.twig delete mode 100644 app/Resources/views/macro/part.html.twig create mode 100644 app/Resources/views/macros/elements.html.twig create mode 100644 app/Resources/views/rebrickable/color/index.html.twig create mode 100644 app/Resources/views/rebrickable/part/show.html.twig create mode 100644 app/Resources/views/rebrickable/set/detail.html.twig create mode 100644 app/Resources/views/rebrickable/set/index.html.twig delete mode 100644 app/Resources/views/set/detail.html.twig rename src/AppBundle/Controller/{ => Brickset}/SetController.php (53%) rename src/AppBundle/Controller/LDraw/{PartController.php => ModelController.php} (50%) create mode 100644 src/AppBundle/Controller/Rebrickable/ColorController.php create mode 100644 src/AppBundle/Controller/Rebrickable/PartController.php create mode 100644 src/AppBundle/Controller/Rebrickable/SetController.php rename src/AppBundle/Form/Filter/{PartFilterType.php => ModelFilterType.php} (80%) diff --git a/app/Resources/views/base.html.twig b/app/Resources/views/base.html.twig index f0e5f1c..f8dff0e 100644 --- a/app/Resources/views/base.html.twig +++ b/app/Resources/views/base.html.twig @@ -1,3 +1,5 @@ +{% import 'macros/elements.html.twig' as elements %} + @@ -14,6 +16,11 @@ {{ knp_menu_render('mainMenu') }}
+ {% for label, flashes in app.session.flashbag.all %} + {% for flash in flashes %} + {{ elements.flash(label,flash) }} + {% endfor %} + {% endfor %} {% block content %} {% endblock %} diff --git a/app/Resources/views/set/browse.html.twig b/app/Resources/views/brickset/browse.html.twig similarity index 100% rename from app/Resources/views/set/browse.html.twig rename to app/Resources/views/brickset/browse.html.twig diff --git a/app/Resources/views/error/error.html.twig b/app/Resources/views/error/error.html.twig new file mode 100644 index 0000000..b92b910 --- /dev/null +++ b/app/Resources/views/error/error.html.twig @@ -0,0 +1,11 @@ +{% extends 'base.html.twig' %} + +{% block title %}{{ 'page.error.title'|trans }}{% endblock %} + +{% block content %} +

+ + {{ 'page.error.large'|trans }} +

+

{{ 'page.error.text'|trans }}

+{% endblock %} \ No newline at end of file diff --git a/app/Resources/views/ldraw/model/detail.html.twig b/app/Resources/views/ldraw/model/detail.html.twig new file mode 100644 index 0000000..5495401 --- /dev/null +++ b/app/Resources/views/ldraw/model/detail.html.twig @@ -0,0 +1,85 @@ +{% extends 'base.html.twig' %} + +{% import 'macros/elements.html.twig' as elements %} + +{% block content %} + {% if model %} +
+
number:
{{ model.number }}
+
name:
{{ model.name }}
+
category:
{{ model.category ? model.category.name }}
+
type:
{{ model.type ? model.type.name }}
+
model:
{{ model.path }}
+
author:
{{ model.author }}
+
keywords:
+
+ {% for keyword in model.keywords %} + {{ keyword.name }} + {% endfor %} +
+
aliases:
+
+ {% for alias in model.aliases %} + {{ alias.number }} + {% endfor %} +
+
Download:
+
{{ model.number }}
+
rebrickable parts ({{ rbParts|length }}):
+
+

+

+ {% for alias in rbParts %} + {{ alias.number }} + {% endfor %} +
+

+
+ +
+ {% endif %} + +
+
+
+ +
+ +

+ Subparts of this model +

+ + {% for subpart in model.subparts %} + {{ elements.part(subpart.subpart) }} + {% endfor %} + +

+ Model is subpart of +

+ + {% for subpart in model.parents %} + {{ elements.part(subpart.parent) }} + {% endfor %} + +

+ Sets ({{ sets|length }}) +

+ + {% for set in sets %} + {{ set.number }} + {% endfor %} +
+{% endblock %} + +{% block javascripts %} + {{ parent() }} + + +{% endblock %} \ No newline at end of file diff --git a/app/Resources/views/ldraw/part/index.html.twig b/app/Resources/views/ldraw/model/index.html.twig similarity index 75% rename from app/Resources/views/ldraw/part/index.html.twig rename to app/Resources/views/ldraw/model/index.html.twig index 97c3226..0bc5989 100644 --- a/app/Resources/views/ldraw/part/index.html.twig +++ b/app/Resources/views/ldraw/model/index.html.twig @@ -1,6 +1,6 @@ {% extends 'base.html.twig' %} -{% import 'macro/part.html.twig' as macro %} +{% import 'macros/elements.html.twig' as elements %} {% block content %}
@@ -17,15 +17,17 @@ {{ form_end(form) }}
+ +

{{ models.getTotalItemCount }}

- {% for part in parts %} + {% for model in models %}
- {{ macro.part(part) }} + {{ elements.part(model) }}
{% endfor %}
- {{ knp_pagination_render(parts) }} + {{ knp_pagination_render(models) }} {% endblock %} diff --git a/app/Resources/views/ldraw/part/show.html.twig b/app/Resources/views/ldraw/part/show.html.twig deleted file mode 100644 index ff093f9..0000000 --- a/app/Resources/views/ldraw/part/show.html.twig +++ /dev/null @@ -1,90 +0,0 @@ -{% extends 'base.html.twig' %} - -{% import 'macro/part.html.twig' as macro %} - -{% block content %} -
-
number:
{{ part.number }}
-
name:
{{ part.name }}
-
category:
{{ part.category.name }}
-
type:
{{ part.type.name }}
-
model:
{{ part.model ? part.model.number }}
-
- -
- {% for keyword in part.keywords %} - {{ keyword.name }} - {% endfor %} -
- -
- {% if apiPart is not null %} -
- -
- {% endif %} - - {% if part is defined and part is not null %} -
-
- -
- -

alias of

- {% if part.aliasOf is not null %} - {{ macro.part(part.aliasOf) }} - {% endif %} - -

aliases

- {% for alias in part.aliases %} - {{ macro.part(alias) }} - {% endfor %} - -

subparts

- {% for subpart in part.subparts %} - {{ macro.part(subpart) }} - {% endfor %} - -

subpart of

- {% for subpart in part.subpartOf %} - {{ macro.part(subpart) }} - {% endfor %} - - {% if part.printOf is not null %} -

print of

- {{ macro.part(part.printOf) }} - {% endif %} - - {% if part.prints is not empty %} -

prints

- {% for print in part.prints %} - {{ macro.part(print) }} - {% endfor %} - {% endif %} - - {% endif %} -

in sets

- {% for set in sets %} - {{ set.number }} - {% endfor %} -
- - {{ dump(rbPart) }} - {{ dump(apiPart) }} - -{% endblock %} - -{% block javascripts %} - {{ parent() }} - - -{% endblock %} \ No newline at end of file diff --git a/app/Resources/views/macro/part.html.twig b/app/Resources/views/macro/part.html.twig deleted file mode 100644 index e9cf053..0000000 --- a/app/Resources/views/macro/part.html.twig +++ /dev/null @@ -1,6 +0,0 @@ -{% macro part(part) %} -
- -

{{ part.number }}

-
-{% endmacro %} \ No newline at end of file diff --git a/app/Resources/views/macros/elements.html.twig b/app/Resources/views/macros/elements.html.twig new file mode 100644 index 0000000..b6df6ff --- /dev/null +++ b/app/Resources/views/macros/elements.html.twig @@ -0,0 +1,34 @@ +{% macro part(model) %} +
+ +

{{ model.number }}

+
+{% endmacro %} + +{% macro flash(type,message) %} + {% if type == 'error' %} + {% set icon = 'ban' %} + {% set title = 'flash.error.title' %} + {% elseif type == 'warning' %} + {% set icon = 'warning' %} + {% set title = 'flash.warning.title' %} + {% elseif type == 'success' %} + {% set icon = 'check' %} + {% set title = 'flash.success.title' %} + {% elseif type == 'info' %} + {% set icon = 'info' %} + {% set title = 'flash.info.title' %} + {% endif %} + + +
+ + +
+
+ {{ title|trans }} +
+

{{ message|trans }}

+
+
+{% endmacro %} \ No newline at end of file diff --git a/app/Resources/views/rebrickable/color/index.html.twig b/app/Resources/views/rebrickable/color/index.html.twig new file mode 100644 index 0000000..e06398d --- /dev/null +++ b/app/Resources/views/rebrickable/color/index.html.twig @@ -0,0 +1,28 @@ +{% extends 'base.html.twig' %} + +{% block content %} + + + + + + + + + + + + + {% for color in colors %} + + + + + + + + {% endfor %} + +
IDNameRGBMaterial
{{ color.id }}{{ color.name }}#{{ color.rgb }}{{ color.transparent ? 'Transparent' : 'Solid' }}
+ +{% endblock %} diff --git a/app/Resources/views/rebrickable/part/show.html.twig b/app/Resources/views/rebrickable/part/show.html.twig new file mode 100644 index 0000000..050fdff --- /dev/null +++ b/app/Resources/views/rebrickable/part/show.html.twig @@ -0,0 +1,37 @@ +{% extends 'base.html.twig' %} + +{% import 'macros/elements.html.twig' as elements %} + +{% block content %} +
+
number:
{{ part.number }}
+
name:
{{ part.name }}
+
category:
{{ part.category ? part.category.name }}
+
+ +
+ {% if apiPart is not null %} +
+ +
+ {% endif %} +
+ +
+ + {% if part.model %} + {{ elements.part(part.model) }} + {% endif %} +
+ +

+ Sets +

+ + {% for set in sets %} + {{ set.number }} + {% endfor %} + + {{ dump(apiPart) }} + +{% endblock %} diff --git a/app/Resources/views/rebrickable/set/detail.html.twig b/app/Resources/views/rebrickable/set/detail.html.twig new file mode 100644 index 0000000..b72d5b6 --- /dev/null +++ b/app/Resources/views/rebrickable/set/detail.html.twig @@ -0,0 +1,52 @@ +{% extends 'base.html.twig' %} + +{% block content %} + + {{ dump(set) }} + + {{ brset ? dump(brset) }} + + {#

{{brset ? brset.name }}

#} + {##} + + {% if set is not null %} +

+ Parts {{ inventoryParts|length }} +

+ +
+ {% for inventoryPart in inventoryParts %} + + {% endfor %} +
+ + +

+ Models {{ parts|length }} +

+ +
+ {% for part in parts %} + + {% endfor %} +
+ + + {% endif %} + +{% endblock %} \ No newline at end of file diff --git a/app/Resources/views/rebrickable/set/index.html.twig b/app/Resources/views/rebrickable/set/index.html.twig new file mode 100644 index 0000000..16375e3 --- /dev/null +++ b/app/Resources/views/rebrickable/set/index.html.twig @@ -0,0 +1,21 @@ +{% extends 'base.html.twig' %} + +{% block content %} +
+
+ {% for set in sets %} + + {% endfor %} +
+
+ +

{{ sets.getTotalItemCount }}

+ + {{ knp_pagination_render(sets) }} +{% endblock %} diff --git a/app/Resources/views/set/detail.html.twig b/app/Resources/views/set/detail.html.twig deleted file mode 100644 index b64e766..0000000 --- a/app/Resources/views/set/detail.html.twig +++ /dev/null @@ -1,27 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block content %} - - {{ dump(set) }} - {{ dump(brset) }} - -

{{brset ? brset.name }}

- - - {% if set is not null %} - {#{% for inventory in set.inventories %}#} -

Parts

-
- {% for inventoryPart in inventoryParts %} - - {% endfor %} -
- {#{% else %}#} - - {#{% endfor %}#} - {% endif %} - -{% endblock %} \ No newline at end of file diff --git a/src/AppBundle/Controller/SetController.php b/src/AppBundle/Controller/Brickset/SetController.php similarity index 53% rename from src/AppBundle/Controller/SetController.php rename to src/AppBundle/Controller/Brickset/SetController.php index 9784616..b55910b 100644 --- a/src/AppBundle/Controller/SetController.php +++ b/src/AppBundle/Controller/Brickset/SetController.php @@ -1,6 +1,6 @@ isSubmitted() && $form->isValid()) { $data = $form->getData(); - $sets = $this->get('client.brickset')->getSets([ + $sets = $this->get('api.client.brickset')->getSets([ 'theme' => $data['theme'] ? $data['theme']->getTheme() : '', 'subtheme' => $data['subtheme'] ? $data['subtheme']->getSubtheme() : '', 'year' => $data['years'] ? $data['years']->getYear() : '', ]); } - return $this->render('set/browse.html.twig', [ + return $this->render('brickset/browse.html.twig', [ 'form' => $form->createView(), 'sets' => $sets, ]); } - - /** - * @Route("/detail/{number}_{name}", name="set_detail") - */ - public function detailAction(Request $request, $number, $name = null) - { - $brset = $this->get('manager.brickset')->getSetByNumber($number); - - $set = $this->get('doctrine.orm.default_entity_manager')->getRepository(Set::class)->find($number); - - $em = $this->getDoctrine()->getManager(); - - $em->getRepository(Color::class)->findAll(); - - $em->getRepository(Theme::class)->findAll(); - - return $this->render('set/detail.html.twig', [ - 'set' => $set, - 'brset' => $brset, - 'parts' => $em->getRepository(Part::class)->findAllBySetNumber($number), - 'inventoryParts' => $em->getRepository(Inventory_Part::class)->findAllBySetNumber($number), - ]); - } } diff --git a/src/AppBundle/Controller/LDraw/PartController.php b/src/AppBundle/Controller/LDraw/ModelController.php similarity index 50% rename from src/AppBundle/Controller/LDraw/PartController.php rename to src/AppBundle/Controller/LDraw/ModelController.php index e794c8a..e607afc 100644 --- a/src/AppBundle/Controller/LDraw/PartController.php +++ b/src/AppBundle/Controller/LDraw/ModelController.php @@ -2,9 +2,10 @@ namespace AppBundle\Controller\LDraw; -use AppBundle\Entity\LDraw\Part; +use AppBundle\Entity\LDraw\Model; +use AppBundle\Entity\Rebrickable\Part; use AppBundle\Entity\Rebrickable\Set; -use AppBundle\Form\Filter\PartFilterType; +use AppBundle\Form\Filter\ModelFilterType; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; @@ -13,26 +14,24 @@ use Symfony\Component\HttpFoundation\Request; /** * Part controller. * - * @Route("ldraw_part") + * @Route("ldraw") */ -class PartController extends Controller +class ModelController extends Controller { /** * Lists all part entities. * - * @Route("/", name="ldraw_part_index") + * @Route("/models/", name="ldraw_model_index") * @Method("GET") */ public function indexAction(Request $request) { $em = $this->getDoctrine()->getManager(); - $form = $this->get('form.factory')->create(PartFilterType::class); + $form = $this->get('form.factory')->create(ModelFilterType::class); - $filterBuilder = $this->get('repository.ldraw.part') - ->createQueryBuilder('part'); - -// $filterBuilder->where('part.type = 1'); + $filterBuilder = $this->get('repository.ldraw.model') + ->createQueryBuilder('model'); if ($request->query->has($form->getName())) { // manually bind values from the request @@ -43,14 +42,14 @@ class PartController extends Controller } $paginator = $this->get('knp_paginator'); - $parts = $paginator->paginate( + $models = $paginator->paginate( $filterBuilder->getQuery(), $request->query->getInt('page', 1)/*page number*/, $request->query->getInt('limit', 100)/*limit per page*/ ); - return $this->render('ldraw/part/index.html.twig', [ - 'parts' => $parts, + return $this->render('ldraw/model/index.html.twig', [ + 'models' => $models, 'form' => $form->createView(), ]); } @@ -58,31 +57,29 @@ class PartController extends Controller /** * Finds and displays a part entity. * - * @Route("/{number}", name="ldraw_part_show") + * @Route("/models/{number}", name="model_detail") * @Method("GET") */ - public function showAction($number) + public function detailAction($number) { $em = $this->getDoctrine()->getManager(); - $rbPart = $em->getRepository(\AppBundle\Entity\Rebrickable\Part::class)->find($number); + if($model = $this->get('manager.ldraw.model')->findByNumber($number)) { + try { + $rbParts = $model != null ? $em->getRepository(Part::class)->findAllByModel($model) : null; + $sets = $model != null ? $em->getRepository(Set::class)->findAllByModel($model) : null; - $part = $em->getRepository(Part::class)->find($number); + return $this->render('ldraw/model/detail.html.twig', [ + 'model' => $model, + 'rbParts' => $rbParts, + 'sets' => $sets, + ]); + } catch (\Exception $e) { + $this->addFlash('error', $e->getMessage()); + } - $apiPart = null; - try { - $apiPart = $this->get('manager.rebrickable')->getPart($number); - } catch (\Exception $e) { - dump($e); } - $sets = $em->getRepository(Set::class)->findAllByPartNumber($number); - - return $this->render('ldraw/part/show.html.twig', [ - 'part' => $part, - 'rbPart' => $rbPart, - 'apiPart' => $apiPart, - 'sets' => $sets, - ]); + return $this->render('error/error.html.twig'); } } diff --git a/src/AppBundle/Controller/MediaController.php b/src/AppBundle/Controller/MediaController.php index 1006a11..83923e3 100644 --- a/src/AppBundle/Controller/MediaController.php +++ b/src/AppBundle/Controller/MediaController.php @@ -3,7 +3,6 @@ namespace AppBundle\Controller; use AppBundle\Entity\LDraw\Model; -use AppBundle\Entity\LDraw\Part; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException; @@ -17,16 +16,16 @@ use Symfony\Component\Routing\Annotation\Route; class MediaController extends Controller { /** - * @Route("/model/{id}", name="model_stl") + * @Route("/model/stl/{number}", name="model_stl") * * @return Response */ - public function modelAction(Model $model) + public function stlAction(Model $model) { $mediaFilesystem = $this->get('oneup_flysystem.media_filesystem'); - if ($mediaFilesystem->has($model->getFile())) { - $response = new BinaryFileResponse($mediaFilesystem->getAdapter()->getPathPrefix().DIRECTORY_SEPARATOR.$model->getFile()); + if ($mediaFilesystem->has($model->getPath())) { + $response = new BinaryFileResponse($mediaFilesystem->getAdapter()->getPathPrefix().DIRECTORY_SEPARATOR.$model->getPath()); $response->headers->set('Content-Type', 'application/vnd.ms-pki.stl'); // Create the disposition of the file @@ -39,32 +38,32 @@ class MediaController extends Controller return $response; } - throw new FileNotFoundException($model->getFile()); + throw new FileNotFoundException($model->getPath()); } /** - * @Route("/part/{number}", name="part_image") + * @Route("/model/image/{number}", name="model_image") * * @return Response */ - public function PartImageAction(Part $part) + public function imageAction(Model $model) { $mediaFilesystem = $this->get('oneup_flysystem.media_filesystem'); - if ($mediaFilesystem->has('ldraw'.DIRECTORY_SEPARATOR.'images'.DIRECTORY_SEPARATOR.$part->getNumber().'.png')) { - $response = new BinaryFileResponse($mediaFilesystem->getAdapter()->getPathPrefix().DIRECTORY_SEPARATOR.'ldraw'.DIRECTORY_SEPARATOR.'images'.DIRECTORY_SEPARATOR.$part->getNumber().'.png'); + if ($mediaFilesystem->has('ldraw'.DIRECTORY_SEPARATOR.'images'.DIRECTORY_SEPARATOR.$model->getNumber().'.png')) { + $response = new BinaryFileResponse($mediaFilesystem->getAdapter()->getPathPrefix().DIRECTORY_SEPARATOR.'ldraw'.DIRECTORY_SEPARATOR.'images'.DIRECTORY_SEPARATOR.$model->getNumber().'.png'); $response->headers->set('Content-Type', 'image/png'); // Create the disposition of the file $disposition = $response->headers->makeDisposition( ResponseHeaderBag::DISPOSITION_ATTACHMENT, - $part->getNumber().'png' + $model->getNumber().'png' ); $response->headers->set('Content-Disposition', $disposition); return $response; } - throw new FileNotFoundException($part->getNumber().'png'); + throw new FileNotFoundException($model->getNumber().'png'); } } diff --git a/src/AppBundle/Controller/Rebrickable/ColorController.php b/src/AppBundle/Controller/Rebrickable/ColorController.php new file mode 100644 index 0000000..6b0b8ad --- /dev/null +++ b/src/AppBundle/Controller/Rebrickable/ColorController.php @@ -0,0 +1,29 @@ +getDoctrine()->getManager(); + + $colors = $em->getRepository(Color::class)->findAll(); + + return $this->render('rebrickable/color/index.html.twig', [ + 'colors' => $colors, + ]); + } +} \ No newline at end of file diff --git a/src/AppBundle/Controller/Rebrickable/PartController.php b/src/AppBundle/Controller/Rebrickable/PartController.php new file mode 100644 index 0000000..2274064 --- /dev/null +++ b/src/AppBundle/Controller/Rebrickable/PartController.php @@ -0,0 +1,51 @@ +getDoctrine()->getManager(); + + $apiPart = null; + + if($part) { + try { + $apiPart = $this->get('api.manager.rebrickable')->getPart($part->getNumber()); + } catch (EmptyResponseException $e) { + $this->addFlash('warning', 'Part not found'); + } catch (\Exception $e) { + $this->addFlash('error', $e->getMessage()); + } + + $sets = $part != null ? $em->getRepository(Set::class)->findAllByPartNumber($part->getNumber()) : null; + + return $this->render('rebrickable/part/show.html.twig', [ + 'part' => $part, + 'apiPart' => $apiPart, + 'sets' => $sets, + ]); + } + + return $this->render('error/error.html.twig'); + } +} diff --git a/src/AppBundle/Controller/Rebrickable/SetController.php b/src/AppBundle/Controller/Rebrickable/SetController.php new file mode 100644 index 0000000..f35b58a --- /dev/null +++ b/src/AppBundle/Controller/Rebrickable/SetController.php @@ -0,0 +1,106 @@ +getDoctrine()->getManager(); + + $qb = $em->getRepository(Set::class)->createQueryBuilder('s'); + + $paginator = $this->get('knp_paginator'); + $sets = $paginator->paginate( + $qb->getQuery(), + $request->query->getInt('page', 1)/*page number*/, + $request->query->getInt('limit', 30)/*limit per page*/ + ); + + return $this->render('rebrickable/set/index.html.twig', [ + 'sets' => $sets, + ]); + } + + /** + * @Route("/detail/{number}_{name}", name="set_detail") + */ + public function detailAction(Request $request, $number, $name = null) + { + $brset = null; + try { + $brset = $this->get('api.manager.brickset')->getSetByNumber($number); + } catch (EmptyResponseException $e) { + $this->addFlash('warning', 'Set not found in Brickset database'); + } catch (\Exception $e) { + $this->addFlash('error', $e->getMessage()); + } + + $set = $this->getDoctrine()->getManager()->getRepository(Set::class)->find($number); + + + $em = $this->getDoctrine()->getManager(); + $em->getRepository(Color::class)->findAll(); + $em->getRepository(Theme::class)->findAll(); + + return $this->render('rebrickable/set/detail.html.twig', [ + 'set' => $set, + 'brset' => $brset, + 'parts' => $em->getRepository(Model::class)->findAllBySetNumber($number), + 'inventoryParts' => $em->getRepository(Inventory_Part::class)->findAllBySetNumber($number), + ]); + } + + + /** + * @Route("/download/{number}", name="set_download") + */ + public function downloadZipAction(Request $request, $number) { + $em = $this->getDoctrine()->getManager(); + + $inventoryParts = $em->getRepository(Inventory_Part::class)->findAllBySetNumber($number); + + $zip = new \ZipArchive(); + $zipName = 'set_'.$number.'.zip'; + $zip->open($zipName, \ZipArchive::CREATE); + /** @var Inventory_Part $part */ + foreach ($inventoryParts as $part) { + $filename = $part->getPart()->getNumber().'_('.$part->getColor()->getName().'_'.$part->getQuantity().'x).stl'; + + try { + if($part->getPart()->getModel()) { + $zip->addFromString($filename, $this->get('oneup_flysystem.media_filesystem')->read($part->getPart()->getModel()->getPath())); + } + } catch (\Exception $e) { + dump($e); + } + } + $zip->close(); + + $response = new Response(file_get_contents($zipName)); + $response->headers->set('Content-Type', 'application/zip'); + $response->headers->set('Content-Disposition', 'attachment;filename="' . $zipName . '"'); + $response->headers->set('Content-length', filesize($zipName)); + + return $response; + } +} diff --git a/src/AppBundle/Form/Filter/PartFilterType.php b/src/AppBundle/Form/Filter/ModelFilterType.php similarity index 80% rename from src/AppBundle/Form/Filter/PartFilterType.php rename to src/AppBundle/Form/Filter/ModelFilterType.php index ce12c92..a6bf2c7 100644 --- a/src/AppBundle/Form/Filter/PartFilterType.php +++ b/src/AppBundle/Form/Filter/ModelFilterType.php @@ -10,12 +10,12 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; -class PartFilterType extends AbstractType +class ModelFilterType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('search', Filters\TextFilterType::class, [ - 'apply_filter' => [$this, 'partSearchCallback'], + 'apply_filter' => [$this, 'modelSearchCallback'], 'label' => 'filter.part.search', ]); @@ -30,7 +30,7 @@ class PartFilterType extends AbstractType public function getBlockPrefix() { - return 'part_filter'; + return 'model_filter'; } public function configureOptions(OptionsResolver $resolver) @@ -41,7 +41,7 @@ class PartFilterType extends AbstractType ]); } - public function partSearchCallback(QueryInterface $filterQuery, $field, $values) + public function modelSearchCallback(QueryInterface $filterQuery, $field, $values) { if (empty($values['value'])) { return null; @@ -49,8 +49,9 @@ class PartFilterType extends AbstractType // expression that represent the condition $expression = $filterQuery->getExpr()->orX( - $filterQuery->getExpr()->like('part.number', ':value'), - $filterQuery->getExpr()->like('part.name', ':value') + $filterQuery->getExpr()->like('model.number', ':value'), + $filterQuery->getExpr()->like('model.name', ':value') + //TODO filter by keywords ); return $filterQuery->createCondition($expression, ['value' => '%'.$values['value'].'%']); diff --git a/src/AppBundle/Menu/Builder.php b/src/AppBundle/Menu/Builder.php index ea53033..d94fe81 100644 --- a/src/AppBundle/Menu/Builder.php +++ b/src/AppBundle/Menu/Builder.php @@ -34,12 +34,16 @@ class Builder 'route' => 'homepage', ]); - $menu->addChild('Parts', [ - 'route' => 'ldraw_part_index', + $menu->addChild('Models', [ + 'route' => 'ldraw_model_index', ]); $menu->addChild('Sets', [ - 'route' => 'set_browse', + 'route' => 'set_index', + ]); + + $menu->addChild('Colors', [ + 'route' => 'color_index', ]); return $menu;