Creating a custom Filter
Sylius Grids come with built-in filters, but there are use-cases where you need something more than a basic filter. Grids let you define your own filter types!
To add a new filter, we need to create an appropriate class and form type.
<?php
declare(strict_types=1);
namespace App\Grid\Filter;
use App\Form\Type\Filter\SuppliersStatisticsFilterType;
use Sylius\Bundle\GridBundle\Doctrine\DataSourceInterface;
use Sylius\Component\Grid\Attribute\AsFilter;
use Sylius\Component\Grid\Filtering\FilterInterface;
#[AsFilter(
formType: SuppliersStatisticsFilterType::class, // (custom) Symfony FormType
template: '@SyliusBootstrapAdminUi/shared/grid/filter/select.html.twig', // or you can use your own Twig template
type: 'suppliers_statistics', // optional - FQCN by default
)]
class SuppliersStatisticsFilter implements FilterInterface
{
public function apply(DataSourceInterface $dataSource, $name, $data, array $options = []): void
{
// Your filtering logic.
// $data['stats'] contains the submitted value!
$queryBuilder = $dataSource->getQueryBuilder();
$queryBuilder
->andWhere('stats = :stats')
->setParameter(':stats', $data['stats'])
;
// You can leverage the ExpressionBuilder to apply driver-agnostic filters to the data source.
// Combined with restrict(), it provides query builder–style functionalities for grid filters.
$dataSource->restrict($dataSource->getExpressionBuilder()->equals('stats', $data['stats']));
}
}And the form type:
And the form type:
Create a template for the filter, similar to the existing ones:
If you use autoconfiguration, the filter is automatically registered as a grid filter.
But if you don't use autoconfiguration, let's register your new filter type as a service.
Now you can use your new filter type in any grid configuration!
OR
Last updated