yajra/laravel-datatables-html
Laravel DataTables HTML plugin for Laravel: build DataTables markup and initialization scripts in PHP, with Laravel 12+ support and Vite-friendly module output. Works with yajra/laravel-datatables to streamline table configuration and rendering.
Installation:
composer require yajra/laravel-datatables-html:^13
Configure Vite (Laravel 12+):
In AppServiceProvider@boot():
use Yajra\DataTables\Html\Builder;
Builder::useVite();
First Usage (Blade View):
use Yajra\DataTables\Facades\DataTables;
DataTables::of(User::query())
->addColumn('action', function($user) {
return '<button>Edit</button>';
})
->make(true);
Render a paginated, sortable table with server-side processing:
// routes/web.php
Route::get('/users', function() {
return DataTables::of(User::query())
->editColumn('name', 'Name')
->addColumn('status', function($user) {
return $user->active ? '<span class="badge bg-success">Active</span>' : '<span class="badge bg-danger">Inactive</span>';
})
->make(true);
});
Query Integration:
DataTables::of(Post::query())
->select(['id', 'title', 'body'])
->where(function($query) {
$query->where('published', true);
});
Column Configuration:
->addColumn('author', function($post) {
return $post->user->name;
})
->editColumn('created_at', 'Published', function($post) {
return $post->created_at->format('M d, Y');
})
->rawColumns(['author', 'action']);
Client-Side Features:
->addIndexColumn()
->orderColumns(['id', 'title'])
->selectInput('status', ['active', 'draft'])
->filterColumn('title', function($query, $keyword) {
$query->where('title', 'like', "%{$keyword}%");
});
Livewire Integration:
use Yajra\DataTables\Html\Builder;
Builder::useLivewire();
// Livewire Component
public function table()
{
return DataTables::of(User::query())
->make(true);
}
Vite Asset Handling:
// app.blade.php
@vite(['resources/js/app.js', 'resources/js/datatables.js'])
// datatables.js
import 'datatables.net-dt/js/dataTables.dataTables';
Reusable Column Macros:
// app/Providers/AppServiceProvider.php
use Yajra\DataTables\DataTables;
DataTables::macro('statusColumn', function($column) {
return $this->addColumn($column, function($model) {
return $model->active ? 'Active' : 'Inactive';
});
});
// Usage
DataTables::of(User::query())
->statusColumn('account_status');
Button Integration:
->addButton([
'name' => 'export',
'title' => 'Export',
'extend' => 'collection',
'buttons' => [
['extend' => 'csv', 'title' => 'CSV'],
['extend' => 'excel', 'title' => 'Excel'],
]
]);
Vite Script Loading:
Builder::useVite().// vite.config.js
export default defineConfig({
build: {
rollupOptions: {
external: ['datatables.net-dt']
}
}
});
Server-Side Processing Mismatch:
->make(true) is used for server-side processing.Column Visibility:
->rawColumns() for HTML columns or ->visible() for conditional visibility:
->addColumn('hidden_column', function($user) {
return $user->hidden_data;
})
->visibleIf(function() {
return auth()->user()->can('view_hidden');
});
Livewire Conflicts:
->useLivewire() and ensure Livewire’s Alpine.js compatibility:
Builder::useLivewire()
->useAlpine();
Inspect Generated HTML/JS:
->toHtml(['table' => 'datatable', 'script' => 'datatable-script'])
Outputs:
<table id="datatable" class="display"></table>
<script>
$(document).ready(function() {
$('#datatable').DataTable({...});
});
</script>
Check for JavaScript Errors:
dataTables.net-dt.jsdataTables.net-buttons/js/dataTables.buttons.jsServer-Side Debugging:
->toJson()
Returns raw server-side data for validation.
Custom Templates:
->template('custom_template')
->template('
<div class="custom-wrapper">
{table}
</div>
<div class="custom-footer">
{footer}
</div>
');
Dynamic Column Rendering:
->addColumn('dynamic', function($model) {
return view('columns.dynamic', ['model' => $model]);
});
Event Listeners:
->addScript('
$(document).on("draw.dt", function() {
console.log("Table redrawn");
});
');
Editor Integration:
use Yajra\DataTables\Editor;
Editor::of(User::class)
->field('name')
->field('email')
->createButton();
How can I help you explore Laravel packages today?