yajra/laravel-datatables-html
Laravel DataTables HTML plugin for building DataTables markup and initialization scripts in PHP. Integrates with yajra/laravel-datatables and supports Laravel 12+. Includes an HTML Builder, column definitions, and Vite-friendly module setup.
yajra/laravel-datatables:
composer require yajra/laravel-datatables yajra/laravel-datatables-html
AppServiceProvider@boot():
Builder::useVite();
// routes/web.php
Route::get('/users', [UserController::class, 'index']);
// UserController.php
public function index()
{
return DataTables::of(User::query())
->addColumn('action', 'users.action')
->make(true);
}
<!-- resources/views/users/index.blade.php -->
{!! DataTables::table(['id', 'name', 'email', 'action'], 'users') !!}
DataTables::of() + ->make(true) for server-side processing.Builder::useVite() to avoid CDN dependencies.Server-Side Processing with HTML Builder
// Controller
public function index()
{
$builder = DataTables::of(User::query())
->editColumn('name', '{{ ucfirst($name) }}')
->addColumn('status', function($row) {
return $row->is_active ? '<span class="badge bg-success">Active</span>' : '<span class="badge bg-danger">Inactive</span>';
})
->addIndexColumn()
->make(true);
return view('users.index', compact('builder'));
}
<!-- View -->
{!! $builder->table(['id', 'name', 'email', 'status'], ['class' => 'table table-striped']) !!}
{!! $builder->scripts() !!}
Dynamic Column Visibility
$builder = DataTables::of(User::query())
->addColumn('name', 'name')
->addColumn('email', 'email')
->addColumn('created_at', 'created_at')
->visibleIf('admin', ['email', 'created_at']); // Hide unless user is admin
Vite + DataTables Integration
// resources/js/app.js
import 'datatables.net-dt/js/dataTables.dataTables';
import 'datatables.net-responsive-dt/js/dataTables.responsive';
// AppServiceProvider
Builder::useVite();
Livewire Integration
public function index()
{
return DataTables::of(User::query())
->useLivewire()
->make(true);
}
{!! $builder->table(['id', 'name']) !!}
@livewireScripts
{!! $builder->scripts() !!}
TableBuilder facade or service to encapsulate common configurations (e.g., AdminTable::users()).DataTables::macro('statusColumn', function($row) {
return $row->is_active ? 'Active' : 'Inactive';
});
$builder = DataTables::of(User::query())
->editColumn('name', 'name')
->addEditorColumn('name', 'name')
->make(true);
Vite Script Loading
Builder::useVite() is not set or Vite is misconfigured.datatables.net-dt and dependencies are imported in your Vite entry file (e.g., resources/js/app.js).Column Visibility Logic
visibleIf() may not work as expected if the condition is not properly bound to the view.return view('users.index', [
'builder' => $builder,
'isAdmin' => auth()->user()->is_admin,
]);
{!! $builder->visibleIf($isAdmin, ['email', 'created_at'])->table(...) !!}
Livewire Conflicts
useLivewire() sparingly and ensure Livewire components are properly mounted before DataTables scripts run.CSRF Token Mismatch
{{ csrf_field() }} is included in forms or use Laravel’s @csrf directive.dd($builder->getJson());
npm run dev
php artisan optimize:clear
Custom Templates
Override default templates (e.g., table, scripts) by publishing assets:
php artisan vendor:publish --tag=datatables-html
Then modify resources/views/vendor/datatables/.
Dynamic Column Rendering Use Blade components for complex columns:
->addColumn('avatar', function($row) {
return view('components.avatar', ['user' => $row]);
})
Button Customization Extend buttons with custom logic:
->addButton('customExport', 'Export', 'export', 'export', fn($query) => [
'action' => route('users.export'),
'title' => 'CSV Export',
])
Performance
->useLivewire() or AJAX for large datasets.->select(['id', 'name', 'email']) // Only fetch needed columns
How can I help you explore Laravel packages today?