adsazad/datatables-bundle
Symfony bundle integrating jQuery DataTables for realtime Ajax tables (Symfony 4.4+/5+). Data source logic is decoupled via adapters; includes Doctrine ORM, MongoDB and Elastica, with support for custom adapters. Includes a console generator command.
Installation:
composer require omines/datatables-bundle
Enable the bundle in config/bundles.php:
return [
// ...
Omines\DataTablesBundle\OminesDataTablesBundle::class => ['all' => true],
];
Basic Controller Integration: Create a controller to handle DataTables requests:
use Omines\DataTablesBundle\DataTables;
use Omines\DataTablesBundle\DataTablesFactory;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class MyController extends AbstractController
{
public function dataTableAction(Request $request, DataTablesFactory $factory): Response
{
$dataTables = $factory->create(DataTables::class);
$dataTables->setDataSource($this->getDataSource()); // Your data source (e.g., EntityManager)
return $dataTables->getResponse($request);
}
First Use Case: Render a DataTable in a Twig template:
{{ render('omines_datatables_bundle::datatable.html.twig', {
'datatable': path('my_controller_data_table'),
'columns': [
{ 'data': 'id', 'title': 'ID' },
{ 'data': 'name', 'title': 'Name' }
]
}) }}
Doctrine ORM: Use Omines\DataTablesBundle\DataSource\DoctrineORMDataSource for EntityManager integration:
$dataSource = new DoctrineORMDataSource($entityManager, MyEntity::class);
$dataTables->setDataSource($dataSource);
Custom Data Sources: Implement Omines\DataTablesBundle\DataSource\DataSourceInterface for non-Doctrine sources (e.g., API clients, CSV files).
Basic Columns:
$dataTables->setColumns([
'id' => ['title' => 'ID', 'data' => 'id'],
'name' => ['title' => 'Name', 'data' => 'name'],
]);
Complex Columns (e.g., computed fields, formatted output):
$dataTables->setColumns([
'full_name' => [
'title' => 'Full Name',
'data' => null, // Use a custom function
'render' => function ($row) {
return $row->getFirstName() . ' ' . $row->getLastName();
}
]
]);
Default Behavior: Enable server-side processing (default) for filtering/sorting:
$dataTables->setOptions(['serverSide' => true]);
Custom Filtering: Override filter() in your data source:
$dataSource->setFilterCallback(function ($queryBuilder, $data) {
if (!empty($data['search']['value'])) {
$queryBuilder->andWhere('e.name LIKE :name')
->setParameter('name', '%' . $data['search']['value'] . '%');
}
});
serverSide: true. Customize via:
$dataTables->setOptions([
'serverSide' => true,
'lengthMenu' => [[10, 25, 50, -1], [10, 25, 50, 'All']],
]);
Omines\DataTablesBundle\Form\DataTablesType to bind DataTables to Symfony forms:
$builder->add('datatable', DataTablesType::class, [
'datatable' => $dataTables,
'columns' => $columns,
]);
CORS Issues:
$response->headers->set('Access-Control-Allow-Origin', '*');
Case Sensitivity in Filtering:
LOWER() in queries for case-insensitive searches:
$queryBuilder->andWhere('LOWER(e.name) LIKE LOWER(:name)')
->setParameter('name', '%' . $data['search']['value'] . '%');
Memory Limits:
$queryBuilder->setFirstResult($data['start'])
->setMaxResults($data['length']);
Column Mismatch:
data in column config matches actual property/method names in your data source. Use render for custom logic.Enable Verbose Logging:
# config/packages/omines_datatables.yaml
omines_datatables:
debug: true
Logs raw DataTables requests/responses to var/log/dev.log.
Inspect Request Data:
Dump $request->request->all() in your controller to verify DataTables parameters (e.g., draw, columns, order).
Selective Field Loading:
DQL to fetch only required fields:
$queryBuilder->select('e.id', 'e.name'); // Instead of 'e'
Indexed Columns:
Lazy Loading:
$dataSource->setLazyLoading(true);
Custom Adapters:
Omines\DataTablesBundle\DataTables to add custom logic (e.g., export buttons, row callbacks).Event Listeners:
datatables.pre_process and datatables.post_process events for request/response modification:
$eventDispatcher->addListener('datatables.pre_process', function ($event) {
$event->setDataSource($customDataSource);
});
Twig Extensions:
templates/omines_datatables_bundle/ to your project and customizing.Default Options:
Override globally in config/packages/omines_datatables.yaml:
omines_datatables:
default_options:
serverSide: true
processing: true
language:
url: '//cdn.datatables.net/plug-ins/1.10.21/i18n/Spanish.json'
Route Scope:
Ensure your DataTables routes are scoped correctly (e.g., _controller in Twig must match Symfony’s routing).
How can I help you explore Laravel packages today?