Installation:
composer require crossknowledge/datatable-bundle
Add to config/bundles.php:
CrossKnowledge\DataTableBundle\CrossKnowledgeDataTableBundle::class => ['all' => true],
Basic Configuration:
Update config/packages/cross_knowledge_data_table.yaml (if needed) or rely on defaults.
First Use Case: Create a controller method to handle DataTable requests:
use CrossKnowledge\DataTableBundle\DataTable\DataTableFactory;
use Symfony\Component\HttpFoundation\Request;
public function dataTableAction(Request $request, DataTableFactory $factory)
{
$dataTable = $factory->create();
$dataTable->setDataSource($this->getDataSource()); // Your data source (e.g., Doctrine query)
$dataTable->addColumn('id', 'ID');
$dataTable->addColumn('name', 'Name');
return $dataTable->handleRequest($request);
}
Frontend Integration: Include jQuery, DataTables CSS/JS, and initialize:
$(document).ready(function() {
$('#example').DataTable({
processing: true,
serverSide: true,
ajax: '/your-endpoint'
});
});
Dynamic Column Handling:
Use addColumn() with custom callbacks for server-side processing:
$dataTable->addColumn('created_at', 'Date')
->setFormatter(function($value) {
return (new \DateTime($value))->format('Y-m-d');
});
Search and Filtering: Leverage built-in search/filtering via DataTables client-side options or server-side logic:
$dataTable->setSearchableColumns(['name', 'email']);
Pagination and Sorting: Configure via DataTable:
$dataTable->setDefaultOrder(['column' => 'name', 'dir' => 'asc']);
$dataTable->setLengthMenu([10, 25, 50, 100]);
Complex Data Sources:
Integrate with Doctrine (e.g., QueryBuilder) or custom repositories:
$query = $entityManager->getRepository(User::class)->createQueryBuilder('u');
$dataTable->setDataSource($query);
Custom Actions:
Add buttons or links via addActionColumn():
$dataTable->addActionColumn('actions', 'Actions')
->addAction('edit', 'Edit', '/edit/{id}')
->addAction('delete', 'Delete', '/delete/{id}', 'confirm');
editable columns).StashBundle) for static data.DataTableFactory and Request for unit tests:
$request = $this->createMock(Request::class);
$request->query->expects($this->any())->method('all')->willReturn(['draw' => 1]);
Case Sensitivity:
Column names in addColumn() must match the data source property names exactly (e.g., user_id vs. userId).
Query Builder Pitfalls:
setDataSource() with Doctrine QueryBuilder includes SELECT COUNT(*) for accurate pagination.addJoin() or manually add joins to the QueryBuilder before passing it to the DataTable.Performance:
fetchJoinColumn() for specific columns:
$dataTable->addColumn('full_name', 'Full Name')
->setFetchJoinColumn(['first_name', 'last_name']);
$dataTable->setServerSide(false);
CSRF Protection:
Ensure DataTable endpoints are protected (e.g., via Symfony’s CsrfTokenManager) if using forms/actions.
Deprecation:
Some methods (e.g., setData()) may be deprecated in favor of setDataSource(). Check the changelog.
debug: true in config/packages/cross_knowledge_data_table.yaml to log SQL queries and DataTable events.dump($request->query->all());
Custom Data Sources:
Implement CrossKnowledge\DataTableBundle\DataTable\DataSourceInterface for non-Doctrine sources (e.g., Elasticsearch):
class ElasticDataSource implements DataSourceInterface {
public function fetchData(array $options) { ... }
public function fetchCount(array $options) { ... }
}
Event Listeners:
Subscribe to DataTable events (e.g., data_table.build.query) to modify queries dynamically:
# config/services.yaml
services:
App\EventListener\DataTableListener:
tags:
- { name: kernel.event_listener, event: data_table.build.query, method: onBuildQuery }
Twig Extensions: Create a Twig extension to render DataTables with default options:
$twig->addExtension(new DataTableTwigExtension($factory));
{{ render_data_table('users', {'columns': ['id', 'name']}) }}
Custom Formatters:
Extend CrossKnowledge\DataTableBundle\DataTable\Column\Formatter\FormatterInterface for reusable formatters (e.g., currency, dates).
config/packages/cross_knowledge_data_table.yaml:
cross_knowledge_data_table:
default_length: 25
default_order: [['column' => 'created_at', 'dir' => 'desc']]
locale in config to support non-English date/number formatting:
cross_knowledge_data_table:
locale: 'fr_FR'
How can I help you explore Laravel packages today?