Installation Run:
composer require dutchbridge/datatablebundle:dev-master
Enable in AppKernel.php:
new DutchBridge\DatatableBundle\DutchBridgeDatatableBundle(),
Bootstrap Setup
Manually copy Bootstrap 2.3 assets (bootstrap.css, bootstrap.js, and icons) into:
vendor/dutchbridge/datatablebundle/Resources/public/{css,js,img}
First Use Case
Create a basic controller action to render a datatable for an entity (e.g., User):
// src/AppBundle/Controller/UserController.php
use DutchBridge\DatatableBundle\Datatable\View\DatatableView;
use DutchBridge\DatatableBundle\Datatable\Doctrine\DoctrineDatatable;
public function indexAction()
{
$datatable = new DoctrineDatatable($this->getDoctrine()->getManager(), 'AppBundle:User');
$view = new DatatableView($datatable);
return $this->render('AppBundle:User:index.html.twig', ['datatable' => $view]);
}
Twig Template
Use the provided Twig helpers in index.html.twig:
{{ datatable.render() }}
Entity-Based Datatables
DoctrineDatatable with an entity class (e.g., 'AppBundle:User').$datatable
->add('id', 'ID', null, ['searchable' => false])
->add('username', 'Username')
->add('email', 'Email')
->setDefaultSort(['username' => 'asc']);
Custom Columns
$datatable->add('full_name', 'Full Name', function($user) {
return $user->getFirstName() . ' ' . $user->getLastName();
});
Server-Side Processing
setServerSide(true).fetch() to customize queries:
$datatable->setFetch(function($queryBuilder, $params) {
// Custom logic (e.g., join tables, apply soft deletes)
return $queryBuilder->getQuery()->getResult();
});
Integration with Forms
datatable.form() in Twig to generate search forms:
{{ form_start(datatable.form()) }}
{{ form_widget(datatable.form.username) }}
{{ form_widget(datatable.form.email) }}
{{ form_end(datatable.form()) }}
AJAX Handling
/users/datatable):
# app/config/routing.yml
users_datatable:
path: /users/datatable
defaults: { _controller: AppBundle:User:datatable }
public function datatableAction(Request $request)
{
$datatable = new DoctrineDatatable($this->getDoctrine()->getManager(), 'AppBundle:User');
return $datatable->handleRequest($request)->render();
}
Asset Management
{% block stylesheets %}
{{ parent() }}
{{ asset('bundles/dutchbridge/datatable/css/bootstrap.css') }}
{% endblock %}
Styling
/* app/Resources/public/css/datatable_override.css */
.dataTables_wrapper .dataTable {
width: 100%;
}
Laravel-Specific Adaptation
Request with Laravel’s Illuminate\Http\Request in the bundle’s service container (if needed).laravel-doctrine/orm) for entity management.Testing
DoctrineDatatable in PHPUnit:
$datatable = $this->getMockBuilder('DutchBridge\DatatableBundle\Datatable\Doctrine\DoctrineDatatable')
->disableOriginalConstructor()
->onlyMethods(['fetch'])
->getMock();
Bootstrap Dependency
Deprecated Symfony2 Features
Request object, Twig extensions). Laravel may need polyfills.symfony/var-dumper for debugging.No Laravel Service Provider
ServiceProvider or Facade).config/app.php:
'DutchBridge\DatatableBundle\DutchBridgeDatatableBundle' => DutchBridge\DatatableBundle\DutchBridgeDatatableBundle::class,
Limited Documentation
APP_DEBUG=true) to inspect generated HTML/JS.Performance with Large Datasets
setServerSide(true)) can be slow for >10k records.DISTINCT in custom queries.Twig Extension Conflicts
datatable Twig function globally. Override in your app’s Twig config:
// config/packages/twig.php
twig:
globals:
datatable: '@dutchbridge.datatable.view'
Check Generated SQL
Enable Doctrine logging in config/packages/dev/doctrine.php:
doctrine:
dbal:
logging: true
profiling: true
Inspect Request Data Dump the raw request payload in your AJAX handler:
public function datatableAction(Request $request)
{
\Log::info('Datatable request:', $request->request->all());
// ...
}
Validate Column Definitions Ensure column names match entity fields (case-sensitive). Use:
$metadata = $this->getDoctrine()->getManager()->getMetadataFactory()->getMetadataFor('AppBundle:User');
$fieldNames = array_keys($metadata->fieldMappings);
Custom Datatable Classes
Extend DoctrineDatatable to add entity-specific logic:
class UserDatatable extends DoctrineDatatable
{
public function __construct(EntityManager $em)
{
parent::__construct($em, 'AppBundle:User');
$this->add('roles', 'Roles', function($user) {
return implode(', ', $user->getRoles());
});
}
}
Override Twig Rendering
Extend the DatatableView class to customize HTML output:
class CustomDatatableView extends DatatableView
{
public function render()
{
// Inject custom templates or logic
return $this->renderTemplate('AppBundle:Datatable:custom.html.twig');
}
}
Add Client-Side Features
Extend the bundle’s JavaScript by overriding the datatable.js template:
{{ datatable.render({
'dom': '<"top"lf>rt<"bottom"ip>',
'buttons': ['copy', 'csv']
}) }}
Laravel Mix/Webpack Integration Process the bundle’s JS/CSS through Laravel Mix:
// webpack.mix.js
mix.copy('vendor/dutchbridge/datatablebundle/Resources/public/js', 'public/js/datatable');
How can I help you explore Laravel packages today?