+
+
+ {% 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 %}
+
+
+ {{ 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) }}
-
-
-
- {% if set is not null %}
- {#{% for inventory in set.inventories %}#}
-
- {% 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;