Install Dependencies
Run composer require deviantlab/tabulator-bundle and ensure StimulusBundle is configured (required).
If using Webpack Encore, execute npm install --force && npm run watch (or yarn equivalent).
Basic Configuration
Add the bundle to config/bundles.php:
return [
// ...
DeviantLab\TabulatorBundle\TabulatorBundle::class => ['all' => true],
];
First Use Case: Render a Table Use Twig to embed a Tabulator instance:
{{ tabulator({
'id': 'example-table',
'data': dataSource,
'columns': [
{ 'title': 'ID', 'field': 'id' },
{ 'title': 'Name', 'field': 'name' }
]
}) }}
tabulator controller; no manual JS required.Dynamic Data Loading Fetch data via AJAX and update Tabulator:
{{ tabulator({
'id': 'dynamic-table',
'data': [],
'ajaxURL': path('api/data'),
'ajaxConfig': { 'method': 'GET' }
}) }}
path() helper for API routes.JsonResponse for API endpoints.Column Customization Define complex columns in Twig:
{{ tabulator({
'columns': [
{ 'title': 'Actions', 'formatter': 'button', 'formatterParams': { 'label': 'Edit' } },
{ 'title': 'Date', 'field': 'createdAt', 'formatter': 'datetime', 'formatterParams': { 'format': 'YYYY-MM-DD' } }
]
}) }}
Integration with Forms Use Tabulator for form data binding:
{{ form_row(form.field) }}
{{ tabulator({
'data': form.vars.data,
'columns': [
{ 'field': 'id', 'editor': 'input' },
{ 'field': 'name', 'editor': 'input' }
]
}) }}
Reusable Components Create a base template for shared tables:
{% macro tabulatorTable(id, data, columns) %}
{{ tabulator({
'id': id,
'data': data,
'columns': columns,
'layout': 'fitColumns',
'pagination': 'local',
'paginationSize': 10
}) }}
{% endmacro %}
SymfonyUx for reactive components (e.g., trigger reloads on form submission).DoctrineSerializer to convert entities to arrays for Tabulator:
$data = $serializer->serialize($entities, 'json');
AssetMapper over Webpack Encore for simpler setups (avoids npm run watch).Stimulus Dependency
StimulusBundle causes silent failures.StimulusBundle is in bundles.php and assets are compiled.Data Format Mismatch
field keys matching column definitions.ArrayTransformer or Serializer to normalize data:
$transformedData = array_map(function ($item) {
return ['id' => $item->getId(), 'name' => $item->getName()];
}, $entities);
Asset Loading
npm run build (or yarn build) after installation.Twig Syntax Errors
json_encode() in PHP or use {% set config = {...} %} for complex objects.tabulator.min.js failures).{{ dump(config) }} to inspect passed Tabulator options.Custom Formatters Extend Tabulator’s formatters via JS:
// assets/js/tabulator-extensions.js
Tabulator.formatters.customFormatter = function(cell) {
return `<span class="badge">${cell.getValue()}</span>`;
};
Register in Twig:
{{ tabulator({
'columns': [{ 'field': 'status', 'formatter': 'customFormatter' }]
}) }}
Symfony Events Hook into Tabulator lifecycle via Stimulus events:
{{ tabulator({
'id': 'event-table',
'data': data,
'columns': columns,
'onRowClick': 'function(e, row) { Stimulus.dispatch("tabulator-row-click", { detail: { row: row } }); }'
}) }}
Listen in a Stimulus controller:
static get events() { return ['tabulator-row-click']; }
Configuration Overrides
Override default settings in config/packages/deviantlab_tabulator.yaml:
deviantlab_tabulator:
default_options:
layout: 'fitData'
responsiveLayout: 'collapse'
How can I help you explore Laravel packages today?