diff --git a/docs/grid/custom_filter.md b/docs/grid/custom_filter.md index 56d0e23b..a329db1a 100644 --- a/docs/grid/custom_filter.md +++ b/docs/grid/custom_filter.md @@ -4,6 +4,128 @@ Sylius Grids come with built-in filters, but there are use-cases where you need To add a new filter, we need to create an appropriate class and form type. +## Using attributes + +{% code title="src/Grid/Filter/SuppliersStatisticsFilter.php" lineNumbers="true" %} +```php +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 functionality for grid filters. + $dataSource->restrict($dataSource->getExpressionBuilder()->equals('stats', $data['stats'])); + } +} +``` +{% endcode %} + +And the form type: + +{% code title="src/Form/Type/Filter/SuppliersStatisticsFilterType.php" lineNumbers="true" %} +```php +add( + 'stats', + ChoiceType::class, + ['choices' => range($options['from'], $options['to'])] + ); + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver + ->setDefaults([ + 'range' => [0, 10], + ]) + ->setAllowedTypes('range', ['array']) + ; + } +} +``` +{% endcode %} + +Create a template for the filter, similar to the existing ones: + +{% code title="templates/grid/filter/suppliers_statistics.html.twig" lineNumbers="true" %} +```twig +{% form_theme form '@SyliusUi/Form/theme.html.twig' %} + +{{ form_row(form) }} +``` +{% endcode %} + +Your custom filter is now ready to be plugged into the grid configuration using its service alias or FQCN. + +{% code title="src/Grid/TournamentGrid.php" lineNumbers="true" %} +```php +addFilter( + Filter::create('stats', 'suppliers_statistics') + ->setFormOptions(['range' => [0, 100]]) + ) + ; + } +} +``` +{% endcode %} + +## Legacy way + {% code title="src/Grid/Filter/SuppliersStatisticsFilter.php" lineNumbers="true" %} ```php getQueryBuilder(); $queryBuilder ->andWhere('stats = :stats') @@ -28,8 +149,6 @@ class SuppliersStatisticsFilter implements ConfigurableFilterInterface ; // For driver abstraction you can use the expression builder. ExpressionBuilder is a kind of query builder. - // $data['stats'] contains the submitted value! - // here is an example $dataSource->restrict($dataSource->getExpressionBuilder()->equals('stats', $data['stats'])); } @@ -66,7 +185,7 @@ class SuppliersStatisticsFilterType extends AbstractType $builder->add( 'stats', ChoiceType::class, - ['choices' => range($options['range'][0], $options['range'][1])] + ['choices' => range($options['from'], $options['to'])] ); } @@ -85,7 +204,7 @@ class SuppliersStatisticsFilterType extends AbstractType Create a template for the filter, similar to the existing ones: -{% code title="templates/Grid/Filter/suppliers_statistics.html.twig" lineNumbers="true" %} +{% code title="templates/grid/filter/suppliers_statistics.html.twig" lineNumbers="true" %} ```twig {% form_theme form '@SyliusUi/Form/theme.html.twig' %} diff --git a/docs/grid/your_first_grid.md b/docs/grid/your_first_grid.md index 801d8180..ec17f399 100644 --- a/docs/grid/your_first_grid.md +++ b/docs/grid/your_first_grid.md @@ -40,57 +40,6 @@ $ bin/console make:grid Now we can configure our first grid: -{% tabs %} -{% tab title="YAML" %} -{% code title="config/packages/sylius_grid.yaml" lineNumbers="true" %} -```yaml -sylius_grid: - grids: - app_admin_supplier: - driver: - name: doctrine/orm - options: - class: App\Entity\Supplier - fields: - name: - type: string - label: app.ui.name - enabled: - type: twig - label: app.ui.enabled - options: - template: '@SyliusBootstrapAdminUi/shared/grid/field/boolean.html.twig' # This will be a checkbox field -``` -{% endcode %} - -{% endtab %} - -{% tab title="PHP" %} -{% code lineNumbers="true" %} -```php -use App\Entity\Supplier; -use Sylius\Bundle\GridBundle\Builder\GridBuilder; -use Sylius\Bundle\GridBundle\Builder\Field\StringField; -use Sylius\Bundle\GridBundle\Builder\Field\TwigField; -use Sylius\Bundle\GridBundle\Config\GridConfig; - -return static function (GridConfig $grid) { - $grid->addGrid(GridBuilder::create('app_admin_supplier', Supplier::class) - ->addField( - StringField::create('name') - ->setLabel('app.ui.name') - ) - ->addField( - TwigField::create('enabled', '@SyliusBootstrapAdminUi/shared/grid/field/boolean.html.twig') - ->setLabel('app.ui.enabled') - ) - ) -}; -``` -{% endcode %} - -OR - {% code title="src/Grid/AdminSupplierGrid.php" lineNumbers="true" %} ```php setRepositoryMethod('mySupplierGridQuery') ; } - - public function getResourceClass(): string - { - return Supplier::class; - } } ``` {% endcode %} @@ -451,14 +374,12 @@ use Sylius\Bundle\GridBundle\Builder\Filter\StringFilter; use Sylius\Bundle\GridBundle\Builder\GridBuilderInterface; use Sylius\Bundle\GridBundle\Grid\AbstractGrid; use Sylius\Bundle\GridBundle\Grid\ResourceAwareGridInterface; +use Sylius\Component\Grid\Attribute\AsGrid; + +#[AsGrid('app_admin_supplier', Supplier::class)] final class AdminSupplierGrid extends AbstractGrid implements ResourceAwareGridInterface { - public static function getName(): string - { - return 'app_admin_supplier'; - } - public function buildGrid(GridBuilderInterface $gridBuilder): void { $gridBuilder @@ -468,11 +389,6 @@ final class AdminSupplierGrid extends AbstractGrid implements ResourceAwareGridI ) ; } - - public function getResourceClass(): string - { - return Supplier::class; - } } ``` {% endcode %} @@ -532,25 +448,17 @@ use App\Entity\Supplier; use Sylius\Bundle\GridBundle\Builder\GridBuilderInterface; use Sylius\Bundle\GridBundle\Grid\AbstractGrid; use Sylius\Bundle\GridBundle\Grid\ResourceAwareGridInterface; +use Sylius\Component\Grid\Attribute\AsGrid; +#[AsGrid('app_admin_supplier', Supplier::class)] final class AdminSupplierGrid extends AbstractGrid implements ResourceAwareGridInterface { - public static function getName(): string - { - return 'app_admin_supplier'; - } - public function buildGrid(GridBuilderInterface $gridBuilder): void { $gridBuilder ->orderBy('name', 'asc') ; } - - public function getResourceClass(): string - { - return Supplier::class; - } } ``` {% endcode %} @@ -616,14 +524,11 @@ use Sylius\Bundle\GridBundle\Builder\Field\StringField; use Sylius\Bundle\GridBundle\Builder\GridBuilderInterface; use Sylius\Bundle\GridBundle\Grid\AbstractGrid; use Sylius\Bundle\GridBundle\Grid\ResourceAwareGridInterface; +use Sylius\Component\Grid\Attribute\AsGrid; +#[AsGrid('app_admin_supplier', Supplier::class)] final class AdminSupplierGrid extends AbstractGrid implements ResourceAwareGridInterface { - public static function getName(): string - { - return 'app_admin_supplier'; - } - public function buildGrid(GridBuilderInterface $gridBuilder): void { $gridBuilder @@ -634,11 +539,6 @@ final class AdminSupplierGrid extends AbstractGrid implements ResourceAwareGridI ) ; } - - public function getResourceClass(): string - { - return Supplier::class; - } } ``` {% endcode %} @@ -710,14 +610,11 @@ use Sylius\Bundle\GridBundle\Builder\Field\TwigField; use Sylius\Bundle\GridBundle\Builder\GridBuilderInterface; use Sylius\Bundle\GridBundle\Grid\AbstractGrid; use Sylius\Bundle\GridBundle\Grid\ResourceAwareGridInterface; +use Sylius\Component\Grid\Attribute\AsGrid; +#[AsGrid('app_admin_supplier', Supplier::class)] final class AdminSupplierGrid extends AbstractGrid implements ResourceAwareGridInterface { - public static function getName(): string - { - return 'app_admin_supplier'; - } - public function buildGrid(GridBuilderInterface $gridBuilder): void { $gridBuilder @@ -729,11 +626,6 @@ final class AdminSupplierGrid extends AbstractGrid implements ResourceAwareGridI ) ; } - - public function getResourceClass(): string - { - return Supplier::class; - } } ``` {% endcode %} @@ -795,25 +687,17 @@ use Sylius\Bundle\GridBundle\Builder\Field\TwigField; use Sylius\Bundle\GridBundle\Builder\GridBuilderInterface; use Sylius\Bundle\GridBundle\Grid\AbstractGrid; use Sylius\Bundle\GridBundle\Grid\ResourceAwareGridInterface; +use Sylius\Component\Grid\Attribute\AsGrid; +#[AsGrid('app_admin_supplier', Supplier::class)] final class AdminSupplierGrid extends AbstractGrid implements ResourceAwareGridInterface { - public static function getName(): string - { - return 'app_admin_supplier'; - } - public function buildGrid(GridBuilderInterface $gridBuilder): void { $gridBuilder ->setLimits([30, 12, 48]) ; } - - public function getResourceClass(): string - { - return Supplier::class; - } } ``` {% endcode %} @@ -958,14 +842,11 @@ use Sylius\Bundle\GridBundle\Builder\ActionGroup\MainActionGroup; use Sylius\Bundle\GridBundle\Builder\GridBuilderInterface; use Sylius\Bundle\GridBundle\Grid\AbstractGrid; use Sylius\Bundle\GridBundle\Grid\ResourceAwareGridInterface; +use Sylius\Component\Grid\Attribute\AsGrid; +#[AsGrid('app_admin_supplier', Supplier::class)] final class AdminSupplierGrid extends AbstractGrid implements ResourceAwareGridInterface { - public static function getName(): string - { - return 'app_admin_supplier'; - } - public function buildGrid(GridBuilderInterface $gridBuilder): void { $gridBuilder @@ -982,11 +863,6 @@ final class AdminSupplierGrid extends AbstractGrid implements ResourceAwareGridI ) ; } - - public function getResourceClass(): string - { - return Supplier::class; - } } ``` {% endcode %}