Installation:
composer require sylius/grid-bundle
Ensure SyliusGridBundle is enabled in config/bundles.php:
return [
// ...
Sylius\GridBundle\SyliusGridBundle::class => ['all' => true],
];
First Grid Definition:
Create a grid configuration YAML file (e.g., config/grids/product_grid.yaml):
sylius_grid:
grids:
product:
driver:
name: doctrine/orm
options:
class: App\Entity\Product
sorting:
name: ^name
fields:
name:
type: string
label: Name
price:
type: twig
label: Price
options:
template: "@SyliusGrid/Field/price.html.twig"
First Usage in Controller:
use Sylius\Bundle\GridBundle\Grid\GridFactory;
class ProductController extends AbstractController
{
public function index(GridFactory $gridFactory): Response
{
$grid = $gridFactory->create('product', $this->request);
return $this->render('product/index.html.twig', [
'grid' => $grid,
]);
}
}
Render in Twig:
{{ grid('product') }}
string, entity, date) and custom fields (e.g., price, stock).# config/grids/admin_product_grid.yaml
sylius_grid:
grids:
admin_product:
driver: doctrine/orm
options:
class: App\Entity\Product
repository_method: findAdminProducts
# ...
// In a service or controller
$gridName = $user->hasRole('ROLE_ADMIN') ? 'admin_product' : 'public_product';
$grid = $gridFactory->create($gridName, $request);
fields:
thumbnail:
type: twig
label: Thumbnail
options:
template: "@App/Grid/Field/product_thumbnail.html.twig"
{# templates/grid/field/product_thumbnail.html.twig #}
<img src="{{ field.value.imageUrl }}" alt="{{ field.value.name }}">
filters:
stock_status:
type: entity
label: Stock Status
options:
field: stockStatus
choices: ['in_stock', 'out_of_stock']
actions:
edit:
type: edit
label: Edit
options:
route: sylius_admin_product_update
parameters:
id: id
delete:
type: delete
label: Delete
options:
route: sylius_admin_product_delete
parameters:
id: id
{{ grid('product')|sylius_grid_action_row }}
driver:
name: custom
options:
service: app.product_data_provider
// src/Service/ProductDataProvider.php
class ProductDataProvider implements DataProviderInterface
{
public function load(array $criteria): array
{
// Custom logic (e.g., API call)
return $products;
}
}
// src/Twig/GridExtension.php
class GridExtension extends \Twig\Extension\AbstractExtension
{
public function getFunctions(): array
{
return [
new \Twig\TwigFunction('custom_grid_field', [$this, 'renderCustomField']),
];
}
public function renderCustomField(array $field): string
{
// Custom rendering logic
return $field['value'];
}
}
{{ custom_grid_field(field) }}
$product = $grid->getResult()->first();
$form = $this->createForm(ProductType::class, $product);
use Sylius\Bundle\GridBundle\Grid\GridInterface;
$data = $grid->getResult()->toArray();
return $this->json($data);
// src/EventListener/GridSubscriber.php
class GridSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
GridEvents::PRE_LOAD => 'onPreLoad',
];
}
public function onPreLoad(GridEvent $event): void
{
$event->getGrid()->addFilter('custom_filter');
}
}
php bin/console cache:clear
Or disable caching for specific grids:
driver:
options:
cache: false
string for a DateTime field) causes errors.fields:
created_at:
type: datetime # Correct type for DateTime properties
label: Created At
class GridResolver
{
public function resolve(string $requestedGridName, UserInterface $user): string
{
return $user->hasRole('ROLE_ADMIN') ? 'admin_grid' : 'public_grid';
}
}
pagination:
items_per_page: 50
DQL:
driver:
options:
dql: SELECT p FROM App\Entity\Product p WHERE p.enabled = true
templates/bundles/SyliusGridBundle/ or templates/SyliusGridBundle/.php bin/console cache:clear
config/packages/sylius_grid.yaml:
sylius_grid:
debug: true
php bin/console debug:container sylius.grid
$grid = $gridFactory->create('product', $request);
dump($grid->getCriteria());
driver:
name: doctrine/orm
options:
entity_manager: default # Ensure correct EM name
dump to inspect field data:
{{ dump(field) }}
How can I help you explore Laravel packages today?