ahmedsamy/dynamic-datatables-bundle
Installation
composer require ahmedsamy/dynamic-datatables-bundle
Add to AppKernel.php (Symfony 2.x):
new AhmedSamy\DynamicDataTablesBundle\DynamicDataTablesBundle(),
Basic Controller Usage Create a controller method to handle DataTable requests:
use AhmedSamy\DynamicDataTablesBundle\DataTables;
public function indexAction(Request $request)
{
$dataTables = new DataTables();
$dataTables->setDataSource($this->getDoctrine()->getRepository('AppBundle:YourEntity')->findAll());
return $dataTables->getResponse();
}
Frontend Integration Include jQuery, DataTables JS/CSS, and initialize:
$(document).ready(function() {
$('#yourTable').DataTable({
processing: true,
serverSide: true,
ajax: {
url: "{{ path('your_route') }}",
type: 'POST'
}
});
});
Routing Define a route for the DataTable endpoint:
your_route:
path: /api/datatables
defaults: { _controller: 'AppBundle:YourController:index' }
Doctrine Integration
Use setDataSource() with Doctrine repositories or custom queries:
$dataTables->setDataSource(
$this->getDoctrine()
->getRepository('AppBundle:User')
->createQueryBuilder('u')
->getQuery()
);
Column Customization Define columns via annotations or YAML:
# config.yml
ahmedsamy_dynamic_datatables:
columns:
user:
- { property: 'id', title: 'ID' }
- { property: 'email', title: 'Email' }
- { property: 'createdAt', title: 'Created At' }
Server-Side Processing Leverage built-in server-side logic for sorting, filtering, and pagination:
$dataTables->setServerSide(true); // Enable server-side processing
Custom Actions
Add buttons/links to rows via setRowActions():
$dataTables->setRowActions([
'edit' => ['route' => 'edit_user', 'params' => ['id' => 'id']],
'delete' => ['route' => 'delete_user', 'params' => ['id' => 'id']]
]);
Event Listeners Extend functionality with events (e.g., pre/post fetch):
$dataTables->addListener('preFetch', function($event) {
$event->setDataSource($this->customFilter($event->getDataSource()));
});
Symfony 2.x Only
Doctrine ORM Dependency
setDataSource() logic.Limited Documentation
src/AhmedSamy/DynamicDataTablesBundle/) for advanced use cases.CSRF Issues
# config.yml
framework:
csrf_protection:
enabled: false
Performance Overhead
$dataTables->setLimit(100); // Reduce fetch size
Enable Verbose Logging
$dataTables->setDebug(true); // Logs SQL queries and processing steps
Check Request Data Dump raw DataTable request payload:
$requestData = $request->request->all();
// dd($requestData); // Uncomment for debugging
Validate Column Mappings Ensure YAML/annotation column properties match entity fields exactly (case-sensitive).
Custom Data Sources
Implement AhmedSamy\DynamicDataTablesBundle\DataSourceInterface for non-Doctrine data:
class CustomDataSource implements DataSourceInterface {
public function fetch($offset, $length, $columns, $order, $search) {
// Custom logic
}
}
Override Templates
Extend Twig templates (e.g., row_actions.html.twig) in templates/AhmedSamyDynamicDataTablesBundle/.
Add Custom Events Extend the event system for pre/post-processing:
$dataTables->addListener('postFetch', function($event) {
$event->setData($this->transformData($event->getData()));
});
Localization
Override translations in Resources/translations/ for multi-language support.
How can I help you explore Laravel packages today?