Comments (5)
Hi :) which version of the bundle are you using ?
The way to solve your problem may vary according to the bundle version.
from lexikformfilterbundle.
I am using your bundle with the jordillonch crud generator:
"jordillonch/crud-generator": "2.1.x-dev",
"lexik/form-filter-bundle": "dev-master",
from lexikformfilterbundle.
lexik/form-filter-bundle [dev-master 9c01c14]
from lexikformfilterbundle.
As ProductOptionFilterFieldType
aim to represent a single field (which is a choice in your case) you don't need to implements FilterTypeSharedableInterface
(so you can remove the addShared()
method).
Then you can define a custom filter class to apply the filter conditions for a ProductOptionFilterFieldType
, you can do some thing like :
<?php
namespace Your\Namespace;
use Doctrine\ORM\QueryBuilder;
use Lexik\Bundle\FormFilterBundle\Filter\ORM\Expr;
use Lexik\Bundle\FormFilterBundle\Filter\ORM\ORMFilter;
class ProductOptionFilter extends ORMFilter
{
/**
* {@inheritdoc}
*/
public function getName()
{
return 'product_option_filter_field'; // this is the same name as ProductOptionFilterFieldType::getName()
}
/**
* {@inheritdoc}
*/
protected function apply(QueryBuilder $queryBuilder, Expr $expr, $field, array $values)
{
if (!empty($values['value'])) {
// add your conditions here
}
}
}
You must define this class as a service with a kernel.event_listener
tag :
<service id="my_custom_filter.product_option_filter" class="Your\Namespace\ProductOptionFilter">
<tag name="kernel.event_listener" event="lexik_filter.get" method="onFilterGet" />
</service>
By doing like this the lexik_form_filter.query_builder_updater
service will be able to find the filter class for a type named product_option_filter_field
.
The FilterTypeSharedableInterface
is usefull in case of you define some fields inside the type that implements FilterTypeSharedableInterface
.
from lexikformfilterbundle.
It works!! Very important to add the transformer_id:
$resolver->setDefaults(array(
'invalid_message' => 'The selected productOption does not exist',
'empty_value' => 'Choose an option',
'choices' => $this->buildData(),
'transformer_id' => 'lexik_form_filter.transformer.default',
))
->setAllowedValues(array(
'transformer_id' => array('lexik_form_filter.transformer.default'),
));
Here is the final code:
<?php
namespace Ecomm\Bundle\CatalogBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Ecomm\Bundle\CatalogBundle\Form\DataTransformer\ProductOptionFieldTransformer;
use Symfony\Component\DependencyInjection\ContainerInterface;
class ProductOptionFilterFieldType extends AbstractType
{
/**
* @var ServiceContainer
*/
private $sc;
public function __construct(ContainerInterface $container = null)
{
$this->sc = $container;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$transformer = new ProductOptionFieldTransformer($this->sc);
$builder->addModelTransformer($transformer);
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'invalid_message' => 'The selected productOption does not exist',
'empty_value' => 'Choose an option',
'choices' => $this->buildData(),
'transformer_id' => 'lexik_form_filter.transformer.default',
))
->setAllowedValues(array(
'transformer_id' => array('lexik_form_filter.transformer.default'),
));
}
private function buildData()
{
$em = $this->sc->get('doctrine')->getManager();
$request = $this->sc->get('request');
$choices = array();
$productOptions = $em
->getRepository('EcommCatalogBundle:ProductOption')
->createQueryBuilder('c')
->select('c, ct')
->innerJoin('c.translations', 'ct')
->andWhere('ct.locale = :locale')
->setParameter('locale', $request->getLocale())
->orderBy('ct.name', 'ASC')
->getQuery()
->getResult();
foreach ($productOptions as $productOption)
{
// I assume key is retrieved by getId
$translation = $productOption->getTranslations();
$choices[$productOption->getId()] = $translation[0]->getName();
}
return $choices;
}
public function getName()
{
return 'product_option_filter_field';
}
public function getParent()
{
return 'choice';
}
}
<?php
namespace Ecomm\Bundle\CatalogBundle\Form;
use Doctrine\ORM\QueryBuilder;
use Lexik\Bundle\FormFilterBundle\Filter\ORM\Expr;
use Lexik\Bundle\FormFilterBundle\Filter\ORM\ORMFilter;
class ProductOptionFilter extends ORMFilter
{
/**
* {@inheritdoc}
*/
public function getName()
{
return 'product_option_filter_field'; // this is the same name as ProductOptionFilterFieldType::getName()
}
/**
* {@inheritdoc}
*/
protected function apply(QueryBuilder $queryBuilder, Expr $expr, $field, array $values)
{
if (!empty($values['value']))
{
// add the join if you need it and it not already added
$alias = $queryBuilder->getRootAliases();
$queryBuilder->innerJoin($alias[0].'.productOption', 'po');
$queryBuilder->andWhere('po.id = :id')
->setParameter('id', $values['value']);
}
}
}
from lexikformfilterbundle.
Related Issues (20)
- Mongo as separate packages? HOT 2
- v5.0.9 Broken with symfony 3.4 HOT 2
- Service "lexik_form_filter.query_builder_updater" not found HOT 4
- doctrine/orm v2.6.4 has issues with using ChoiceFilterType with objects
- NumberRangeFilterType can not set attribute " type:'number' '' , and 'label' is not work as well HOT 3
- CollectionAdapterFilterType display an unwanted "level" with a label : "0" HOT 2
- Store Entity in session HOT 1
- Not a issue, change repo description HOT 1
- How to have more user/search engines friendly urls
- Works in symfony 5.1 ? HOT 1
- How to add a field to set maxresults HOT 1
- Options 'data' does not work for EntityFilterType
- Hi HOT 3
- Undefined class constant 'INTEGER' when filtering EntityFilterType HOT 2
- doctrine/orm to specific HOT 1
- Using ChoiceFilterType generate: Undefined constant Doctrine\DBAL\Types\Type::STRING HOT 1
- Ltrim issue in LexikFormFilterBundle/Event/Subscriber/DoctrineORMSubscriber.php
- Filter by entity with string id HOT 3
- Feature Request: Allow using array based $parameters with IN() expressions HOT 2
- Bundle abandonned...and moved on new organization!
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from lexikformfilterbundle.