1
0
mirror of https://github.com/ToxicCrack/PrintABrick.git synced 2025-05-20 14:10:11 -07:00

Add Set filter form, Move Model filter

This commit is contained in:
David Hübner 2017-04-11 17:32:45 +02:00
parent c755f0f418
commit 23acea2a18
10 changed files with 174 additions and 23 deletions

View File

@ -1,7 +1,20 @@
services: services:
form.filter.category: form.filter.category:
class: AppBundle\Form\Filter\CategoryFilterType class: AppBundle\Form\Filter\Model\CategoryFilterType
arguments: arguments:
- '@manager.ldraw.category' - '@manager.ldraw.category'
tags: tags:
- { name: form.type } - { name: form.type }
form.filter.brickset:
class: AppBundle\Form\FilterSetType
arguments: ['@api.manager.brickset']
tags:
- { name: form.type }
form.filter.theme:
class: AppBundle\Form\Filter\Set\ThemeFilterType
arguments:
- '@local.manager.rebrickable'
tags:
- { name: form.type }

View File

@ -1,4 +1,14 @@
services: services:
local.manager.base:
abstract: true
class: AppBundle\Manager\BaseManager
calls:
- [setEntityManager, ['@doctrine.orm.entity_manager']]
local.manager.rebrickable:
class: AppBundle\Manager\RebrickableManager
parent: local.manager.base
manager.ldraw.keyword: manager.ldraw.keyword:
class: AppBundle\Manager\LDraw\KeywordManager class: AppBundle\Manager\LDraw\KeywordManager
arguments: arguments:
@ -20,5 +30,3 @@ services:
arguments: arguments:
- "@repository.ldraw.alias" - "@repository.ldraw.alias"

View File

@ -8,12 +8,6 @@ services:
- '@manager.ldraw.model' - '@manager.ldraw.model'
- '@manager.ldraw.alias' - '@manager.ldraw.alias'
app.form.filter_set:
class: AppBundle\Form\FilterSetType
arguments: ['@api.manager.brickset']
tags:
- { name: form.type }
app.twig_extension: app.twig_extension:
class: AppBundle\Twig\AppExtension class: AppBundle\Twig\AppExtension
public: false public: false

View File

@ -31,11 +31,17 @@ class SetController extends Controller
if ($form->isSubmitted() && $form->isValid()) { if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData(); $data = $form->getData();
$sets = $this->get('api.client.brickset')->getSets([ try {
'theme' => $data['theme'] ? $data['theme']->getTheme() : '', $sets = $this->get('api.client.brickset')->getSets([
'subtheme' => $data['subtheme'] ? $data['subtheme']->getSubtheme() : '', 'theme' => $data['theme'] ? $data['theme']->getTheme() : '',
'year' => $data['years'] ? $data['years']->getYear() : '', 'subtheme' => $data['subtheme'] ? $data['subtheme']->getSubtheme() : '',
]); 'year' => $data['years'] ? $data['years']->getYear() : '',
]);
} catch (EmptyResponseException $e) {
$this->addFlash('warning', 'No set found on '.$e->getService());
} catch (\Exception $e) {
$this->addFlash('error', $e->getMessage());
}
} }
return $this->render('brickset/browse.html.twig', [ return $this->render('brickset/browse.html.twig', [

View File

@ -5,7 +5,7 @@ namespace AppBundle\Controller;
use AppBundle\Entity\LDraw\Model; use AppBundle\Entity\LDraw\Model;
use AppBundle\Entity\Rebrickable\Part; use AppBundle\Entity\Rebrickable\Part;
use AppBundle\Entity\Rebrickable\Set; use AppBundle\Entity\Rebrickable\Set;
use AppBundle\Form\Filter\ModelFilterType; use AppBundle\Form\Filter\Model\ModelFilterType;
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;
@ -26,8 +26,6 @@ class ModelController extends Controller
*/ */
public function indexAction(Request $request) public function indexAction(Request $request)
{ {
$em = $this->getDoctrine()->getManager();
$form = $this->get('form.factory')->create(ModelFilterType::class); $form = $this->get('form.factory')->create(ModelFilterType::class);
$filterBuilder = $this->get('repository.ldraw.model') $filterBuilder = $this->get('repository.ldraw.model')

View File

@ -6,9 +6,11 @@ use AppBundle\Api\Exception\EmptyResponseException;
use AppBundle\Entity\LDraw\Model; use AppBundle\Entity\LDraw\Model;
use AppBundle\Entity\Rebrickable\Color; use AppBundle\Entity\Rebrickable\Color;
use AppBundle\Entity\Rebrickable\Inventory_Part; use AppBundle\Entity\Rebrickable\Inventory_Part;
use AppBundle\Entity\Rebrickable\Inventory_Set;
use AppBundle\Entity\Rebrickable\Part; use AppBundle\Entity\Rebrickable\Part;
use AppBundle\Entity\Rebrickable\Set; use AppBundle\Entity\Rebrickable\Set;
use AppBundle\Entity\Rebrickable\Theme; use AppBundle\Entity\Rebrickable\Theme;
use AppBundle\Form\Filter\Set\SetFilterType;
use AppBundle\Form\FilterSetType; use AppBundle\Form\FilterSetType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller;
@ -25,19 +27,29 @@ class SetController extends Controller
*/ */
public function indexAction(Request $request) public function indexAction(Request $request)
{ {
$em = $this->getDoctrine()->getManager(); $form = $this->get('form.factory')->create(SetFilterType::class);
$qb = $em->getRepository(Set::class)->createQueryBuilder('s'); $filterBuilder = $this->get('repository.rebrickable.set')
->createQueryBuilder('s');
if ($request->query->has($form->getName())) {
// manually bind values from the request
$form->submit($request->query->get($form->getName()));
// build the query from the given form object
$this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($form, $filterBuilder);
}
$paginator = $this->get('knp_paginator'); $paginator = $this->get('knp_paginator');
$sets = $paginator->paginate( $sets = $paginator->paginate(
$qb->getQuery(), $filterBuilder->getQuery(),
$request->query->getInt('page', 1)/*page number*/, $request->query->getInt('page', 1)/*page number*/,
$request->query->getInt('limit', 30)/*limit per page*/ $request->query->getInt('limit', 30)/*limit per page*/
); );
return $this->render('set/index.html.twig', [ return $this->render('set/index.html.twig', [
'sets' => $sets, 'sets' => $sets,
'form' => $form->createView()
]); ]);
} }
@ -48,6 +60,9 @@ class SetController extends Controller
{ {
$brset = null; $brset = null;
$rbset = null; $rbset = null;
$inventorySets = null;
$inventorySets = $this->getDoctrine()->getManager()->getRepository(Inventory_Set::class)->findAllBySetNumber($number);
try { try {
if(($rbset = $this->getDoctrine()->getManager()->getRepository(Set::class)->find($number)) == null) { if(($rbset = $this->getDoctrine()->getManager()->getRepository(Set::class)->find($number)) == null) {
$this->addFlash('warning', 'Set not found in Rebrickable database'); $this->addFlash('warning', 'Set not found in Rebrickable database');
@ -62,6 +77,7 @@ class SetController extends Controller
return $this->render('set/detail.html.twig', [ return $this->render('set/detail.html.twig', [
'rbset' => $rbset, 'rbset' => $rbset,
'inventorySets' => $inventorySets,
'brset' => $brset, 'brset' => $brset,
]); ]);
} }

View File

@ -1,6 +1,6 @@
<?php <?php
namespace AppBundle\Form\Filter; namespace AppBundle\Form\Filter\Model;
use AppBundle\Entity\LDraw\Category; use AppBundle\Entity\LDraw\Category;
use AppBundle\Manager\LDraw\CategoryManager; use AppBundle\Manager\LDraw\CategoryManager;

View File

@ -1,6 +1,6 @@
<?php <?php
namespace AppBundle\Form\Filter; namespace AppBundle\Form\Filter\Model;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Lexik\Bundle\FormFilterBundle\Filter\FilterBuilderExecuterInterface; use Lexik\Bundle\FormFilterBundle\Filter\FilterBuilderExecuterInterface;

View File

@ -0,0 +1,58 @@
<?php
namespace AppBundle\Form\Filter\Set;
use Doctrine\ORM\QueryBuilder;
use Lexik\Bundle\FormFilterBundle\Filter\FilterBuilderExecuterInterface;
use Lexik\Bundle\FormFilterBundle\Filter\Form\Type as Filters;
use Lexik\Bundle\FormFilterBundle\Filter\Query\QueryInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class SetFilterType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('search', Filters\TextFilterType::class, [
'apply_filter' => [$this, 'setSearchCallback'],
'label' => 'filter.part.search',
]);
$builder->add('theme', ThemeFilterType::class, [
'add_shared' => function (FilterBuilderExecuterInterface $builderExecuter) {
$builderExecuter->addOnce($builderExecuter->getAlias().'.theme', 'c', function (QueryBuilder $filterBuilder, $alias, $joinAlias, $expr) {
$filterBuilder->leftJoin($alias.'.theme', $joinAlias);
});
},
]);
}
public function getBlockPrefix()
{
return 'model_filter';
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'csrf_protection' => false,
'validation_groups' => ['filtering'], // avoid NotBlank() constraint-related message
]);
}
public function setSearchCallback(QueryInterface $filterQuery, $field, $values)
{
if (empty($values['value'])) {
return null;
}
// expression that represent the condition
$expression = $filterQuery->getExpr()->orX(
$filterQuery->getExpr()->like('s.name', ':value'),
$filterQuery->getExpr()->like('s.number', ':value')
);
return $filterQuery->createCondition($expression, ['value' => '%'.$values['value'].'%']);
}
}

View File

@ -0,0 +1,58 @@
<?php
namespace AppBundle\Form\Filter\Set;
use AppBundle\Entity\Rebrickable\Theme;
use AppBundle\Entity\LDraw\Category;
use AppBundle\Manager\LDraw\CategoryManager;
use AppBundle\Manager\RebrickableManager;
use Lexik\Bundle\FormFilterBundle\Filter\Form\Type as Filters;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ThemeFilterType extends AbstractType
{
private $rebrickableManager;
public function __construct(RebrickableManager $rebrickableManager)
{
$this->rebrickableManager = $rebrickableManager;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('id', Filters\ChoiceFilterType::class, [
'choices' => $this->rebrickableManager->FindAllThemes(),
'choice_label' => function ($allChoices, $currentChoiceKey) {
dump($currentChoiceKey);
$parent = $allChoices->getParent();
return $parent ? $parent->getName().' > '.$allChoices->getName() : $allChoices->getName();
},
'label' => 'filter.set.theme',
]);
}
public function getParent()
{
return Filters\SharedableFilterType::class; // this allow us to use the "add_shared" option
}
public function getBlockPrefix()
{
return 'theme_filter';
}
public function setDefaultOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Theme::class,
'csrf_protection' => false,
'validation_groups' => ['filtering'], // avoid NotBlank() constraint-related message
'method' => 'GET',
]);
}
}