Open pomporov opened 9 months ago
Hi,
I haven't tried it yet but I know that within 2 or 3 weeks I will have to do a similar development, I am thinking of using this solution.
Maybe ComparisonFilter or NumericFilter work, otherwise you can create your own filter.
Based on :
<?php
namespace EasyCorp\Bundle\EasyAdminBundle\Filter;
use Doctrine\ORM\QueryBuilder;
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Filter\FilterInterface;
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\FilterDataDto;
use EasyCorp\Bundle\EasyAdminBundle\Form\Filter\Type\ComparisonFilterType;
/**
* @author Yonel Ceruto <yonelceruto@gmail.com>
* @author Javier Eguiluz <javier.eguiluz@gmail.com>
*/
final class ComparisonFilter implements FilterInterface
{
use FilterTrait;
public static function new(string $propertyName, $label = null): self
{
return (new self())
->setFilterFqcn(__CLASS__)
->setProperty($propertyName)
->setLabel($label)
->setFormType(ComparisonFilterType::class)
->setFormTypeOption('translation_domain', 'EasyAdminBundle');
}
public function apply(QueryBuilder $queryBuilder, FilterDataDto $filterDataDto, ?FieldDto $fieldDto, EntityDto $entityDto): void
{
$alias = $filterDataDto->getEntityAlias();
$property = $filterDataDto->getProperty();
$comparison = $filterDataDto->getComparison();
$parameterName = $filterDataDto->getParameterName();
$value = $filterDataDto->getValue();
$queryBuilder->andWhere(sprintf('%s.%s %s :%s', $alias, $property, $comparison, $parameterName))
->setParameter($parameterName, $value);
}
}
Or
<?php
namespace EasyCorp\Bundle\EasyAdminBundle\Filter;
use Doctrine\ORM\QueryBuilder;
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Filter\FilterInterface;
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\FilterDataDto;
use EasyCorp\Bundle\EasyAdminBundle\Form\Filter\Type\NumericFilterType;
use EasyCorp\Bundle\EasyAdminBundle\Form\Type\ComparisonType;
/**
* @author Yonel Ceruto <yonelceruto@gmail.com>
* @author Javier Eguiluz <javier.eguiluz@gmail.com>
*/
final class NumericFilter implements FilterInterface
{
use FilterTrait;
public static function new(string $propertyName, $label = null): self
{
return (new self())
->setFilterFqcn(__CLASS__)
->setProperty($propertyName)
->setLabel($label)
->setFormType(NumericFilterType::class)
->setFormTypeOption('translation_domain', 'EasyAdminBundle');
}
public function apply(QueryBuilder $queryBuilder, FilterDataDto $filterDataDto, ?FieldDto $fieldDto, EntityDto $entityDto): void
{
$alias = $filterDataDto->getEntityAlias();
$property = $filterDataDto->getProperty();
$comparison = $filterDataDto->getComparison();
$parameterName = $filterDataDto->getParameterName();
$parameter2Name = $filterDataDto->getParameter2Name();
$value = $filterDataDto->getValue();
$value2 = $filterDataDto->getValue2();
if (ComparisonType::BETWEEN === $comparison) {
$queryBuilder->andWhere(sprintf('%s.%s BETWEEN :%s and :%s', $alias, $property, $parameterName, $parameter2Name))
->setParameter($parameterName, $value)
->setParameter($parameter2Name, $value2);
} else {
$queryBuilder->andWhere(sprintf('%s.%s %s :%s', $alias, $property, $comparison, $parameterName))
->setParameter($parameterName, $value);
}
}
}
I just tried
->add(ComparisonFilter::new('customer')->setFormTypeOption('value_type', IntegerType::class))
and
->add(NumericFilter::new('customer'))
It works.
Hello
i have a huge one2many relation so normal EntityFilter is not an option , i would like to render it as 'input' so user can type in the primary key by him self but .
->add(EntityFilter::new('pspTransaction')->setFormType(TextType::class))
does not work , any clues ?
thanks