dolmitos/symfony-datatables-bundle
Installation
composer require dolmitos/symfony-datatables-bundle
Add to config/bundles.php:
Dolmitos\DataTablesBundle\DolmitosDataTablesBundle::class => ['all' => true],
Basic Controller Integration
Create a controller with a DataTablesController trait:
use Dolmitos\DataTablesBundle\Controller\DataTablesController;
class UserController extends AbstractController
{
use DataTablesController;
public function usersAction()
{
return $this->dataTablesResponse(
$this->getDoctrine()->getRepository(User::class)->findAll(),
['id', 'name', 'email']
);
}
}
First Use Case
/users/datatable) pointing to usersAction.{{ include('dolmitos_datatables::datatables.html.twig') }}
<table id="users-table"> with server-side processing:
$('#users-table').DataTable({
processing: true,
serverSide: true,
ajax: '/users/datatable'
});
Custom Query Building
Override buildQuery() in your controller to customize database queries:
protected function buildQuery($request, QueryBuilder $qb)
{
$qb->andWhere('u.active = :active')
->setParameter('active', true);
}
Column Configuration
Define columns in getColumns():
protected function getColumns()
{
return [
'id' => ['title' => 'ID', 'data' => 'id'],
'name' => ['title' => 'Name', 'data' => 'name'],
'email' => [
'title' => 'Email',
'data' => 'email',
'render' => function($value, $row) {
return '<a href="mailto:'.$value.'">'.$value.'</a>';
}
]
];
}
Action Buttons
Add action buttons via getActions():
protected function getActions()
{
return [
'edit' => [
'title' => 'Edit',
'url' => function($row) {
return $this->generateUrl('user_edit', ['id' => $row['id']]);
}
]
];
}
Search and Filtering Leverage built-in search/filtering:
protected function buildQuery($request, QueryBuilder $qb)
{
$this->addSearch($request, $qb, 'u.name', 'u.email');
$this->addFilter($request, $qb, 'active', 'u.active');
}
Export Integration
Enable CSV/Excel export via getExportOptions():
protected function getExportOptions()
{
return [
'csv' => ['title' => 'CSV'],
'excel' => ['title' => 'Excel']
];
}
Twig Integration
Use dolmitos_datatables:: namespace for templates:
{% extends 'base.html.twig' %}
{% block stylesheets %}
{{ parent() }}
{{ include('dolmitos_datatables::stylesheets.html.twig') }}
{% endblock %}
API-Only Usage For API endpoints, return raw JSON:
return $this->dataTablesJsonResponse($data, $columns);
Dependency Injection
Inject services (e.g., EntityManager) via constructor:
public function __construct(EntityManagerInterface $em) {
$this->em = $em;
}
Custom Response Transformers
Extend DataTablesResponseTransformer for custom JSON structures.
Case Sensitivity in Column Names
Ensure data keys in getColumns() match entity property names exactly (e.g., user_id vs. userId).
Pagination Conflicts
Avoid naming routes with /page or /_page if using DataTables pagination, as it may conflict with server-side processing.
Caching Issues Clear Symfony cache after updating bundle configurations:
php bin/console cache:clear
Doctrine QueryBuilder Limitations
Complex joins or subqueries may require manual SQL or DQL in buildQuery().
CSRF Protection Disable CSRF for DataTables AJAX routes if using server-side processing:
# config/packages/framework.yaml
framework:
csrf_protect_csrf_token: false
Enable Query Logging
Add to config/packages/dev/doctrine.yaml:
doctrine:
dbal:
logging: true
profiling: true
Check Request Data
Dump $request->request->all() in buildQuery() to verify DataTables parameters (draw, start, length, columns, order, search).
Validate JSON Response
Use browser dev tools to inspect the AJAX response for errors (e.g., malformed JSON or missing data/recordsTotal keys).
Default Sorting
Set default sort in getDefaultOrder():
protected function getDefaultOrder()
{
return ['column' => 0, 'dir' => 'desc'];
}
Hidden Columns
Mark columns as hidden in getColumns():
'id' => ['title' => 'ID', 'data' => 'id', 'visible' => false]
Custom Server Parameters
Extend DataTablesRequest to add custom parameters:
use Dolmitos\DataTablesBundle\Request\DataTablesRequest;
class CustomRequest extends DataTablesRequest
{
public function getCustomParam()
{
return $this->request->get('custom_param');
}
}
Localization
Override translations in config/packages/dolmitos_datatables.yaml:
dolmitos_datatables:
translations:
empty_table: "No data available in this language."
Custom Data Source
Implement DataTablesDataSourceInterface for non-Doctrine data sources (e.g., API clients).
Event Listeners
Subscribe to dolmitos_datatables.build_query or dolmitos_datatables.response events for pre/post-processing.
Custom Renderers
Extend DataTablesRenderer to modify HTML output (e.g., add icons or badges).
Plugin Integration
Use addJsPlugin() in Twig to include DataTables extensions (e.g., select, buttons):
{{ include('dolmitos_datatables::datatables.html.twig', {
plugins: ['select', 'buttons']
}) }}
How can I help you explore Laravel packages today?