Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Datatables Buttons Laravel Package

yajra/laravel-datatables-buttons

Laravel DataTables Buttons plugin for server-side exports and printing. Add CSV, Excel, PDF, and print support to yajra/laravel-datatables with DataTables Buttons extension. Compatible with Laravel 12+ and PHP 8.3+.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps

  1. Install the package (requires yajra/laravel-datatables):
    composer require yajra/laravel-datatables-buttons:^13
    
  2. Publish config/assets (recommended):
    php artisan vendor:publish --tag=datatables-buttons
    
  3. Include dependencies in your Blade:
    <!-- CSS -->
    <link rel="stylesheet" href="https://cdn.datatables.net/buttons/2.4.2/css/buttons.dataTables.min.css">
    
    <!-- JS -->
    <script src="https://cdn.datatables.net/buttons/2.4.2/js/dataTables.buttons.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.53/pdfmake.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.53/vfs_fonts.js"></script>
    <script src="https://cdn.datatables.net/buttons/2.4.2/js/buttons.html5.min.js"></script>
    <script src="https://cdn.datatables.net/buttons/2.4.2/js/buttons.print.min.js"></script>
    

First Use Case: Quick CSV Export

// app/Http/Controllers/UserController.php
use Yajra\DataTables\Facades\DataTables;
use App\Models\User;

public function anyData()
{
    return DataTables::of(User::query())
        ->addColumn('action', function($user) {
            return '<button class="btn btn-sm btn-primary">View</button>';
        })
        ->add('buttons', function($user) {
            return '<button class="btn btn-sm btn-success">Export</button>';
        })
        ->make(true);
}
<!-- resources/views/users.blade.php -->
<table id="users-table" class="display">
    <thead>
        <tr>
            <th>Name</th>
            <th>Email</th>
            <th>Actions</th>
        </tr>
    </thead>
</table>

<script>
$(function() {
    $('#users-table').DataTable({
        processing: true,
        serverSide: true,
        ajax: '{!! route('users.datatable') !!}',
        buttons: [
            { extend: 'csv', text: 'Export CSV' }
        ]
    });
});
</script>

Implementation Patterns

1. Button Composition Patterns

Basic Export Workflow

// Controller
public function anyData()
{
    return DataTables::of(User::query())
        ->addColumn('full_name', function($user) {
            return $user->first_name . ' ' . $user->last_name;
        })
        ->add('buttons', function($user) {
            return '<button class="btn btn-sm btn-info">Edit</button>';
        })
        ->rawColumns(['buttons'])
        ->make(true);
}

Custom Export Logic with Macros

// app/DataTables/UserDataTable.php
use Yajra\DataTables\DataTables;
use Yajra\DataTables\Buttons;

class UserDataTable extends DataTables
{
    public function __construct()
    {
        $this->buttons([
            Buttons::export('Excel', 'Excel'),
            Buttons::export('CSV', 'CSV'),
            Buttons::make('customExport')
                ->className('btn btn-warning')
                ->action(function($query, $export) {
                    return $query->get()->map(fn($user) => [
                        'name' => $user->name,
                        'custom_data' => $this->formatCustomData($user),
                    ]);
                })
                ->exportOpenSingle(true)
                ->title('Custom Export'),
        ]);
    }

    protected function formatCustomData($user)
    {
        return json_encode($user->custom_data);
    }
}

Dynamic Button Configuration

// Dynamic button visibility based on user role
public function buttons()
{
    $buttons = [
        Buttons::export('Excel', 'Excel'),
        Buttons::export('CSV', 'CSV'),
    ];

    if (auth()->user()->isAdmin) {
        $buttons[] = Buttons::make('customExport')
            ->className('btn btn-danger')
            ->action(function($query) {
                return $query->with('auditLogs')->get();
            });
    }

    return $buttons;
}

2. Integration with API Resources

// app/Http/Controllers/UserController.php
use App\Http\Resources\UserResource;

public function anyData()
{
    return DataTables::of(User::query())
        ->addColumn('full_name', function($user) {
            return UserResource::make($user)->full_name;
        })
        ->make(true);
}

3. Export Customization

Custom Excel/CSV Headers

public function anyData()
{
    return DataTables::of(User::query())
        ->addColumn('custom_header', function($user) {
            return $user->created_at->format('Y-m-d');
        })
        ->exportOptions([
            'excel' => [
                'title' => 'User Export',
                'columns' => [
                    ['data' => 'id', 'name' => 'ID'],
                    ['data' => 'name', 'name' => 'Full Name'],
                    ['data' => 'custom_header', 'name' => 'Registration Date'],
                ],
            ],
        ])
        ->make(true);
}

Custom Export Filename

public function anyData()
{
    return DataTables::of(User::query())
        ->exportOptions([
            'excel' => [
                'filename' => 'users_' . now()->format('Y-m-d') . '.xlsx',
            ],
            'csv' => [
                'filename' => 'users_' . now()->format('Y-m-d') . '.csv',
            ],
        ])
        ->make(true);
}

Gotchas and Tips

Common Pitfalls

  1. Missing Dependencies:

    • Forgetting to include jQuery DataTables Buttons JS/CSS in your Blade view.
    • Fix: Ensure all required scripts are loaded (see Getting Started).
  2. CSRF Token Issues:

    • Export buttons failing due to missing CSRF token.
    • Fix: Add csrf: true to your DataTable initialization:
      buttons: [
          { extend: 'excel', text: 'Export', csrf: true }
      ]
      
  3. Memory Limits:

    • Large exports hitting PHP memory limits.
    • Fix: Use chunking for exports:
      $this->buttons([
          Buttons::export('Excel', 'Excel')
              ->setChunkSize(1000)
      ]);
      
  4. Column Mismatch:

    • Exported data not matching displayed columns.
    • Fix: Explicitly define columns in exportOptions:
      ->exportOptions([
          'excel' => [
              'columns' => [
                  ['data' => 'id', 'name' => 'ID'],
                  ['data' => 'name', 'name' => 'Name'],
              ],
          ],
      ])
      

Debugging Tips

  1. Check Export Logs:

    • Enable debug mode in config/datatables.php:
      'debug' => env('DATATABLES_DEBUG', false),
      
    • Logs will appear in storage/logs/laravel.log.
  2. Verify Query:

    • Use toSql() and getBindings() to debug the query:
      $query = User::query();
      dd($query->toSql(), $query->getBindings());
      
  3. Test with Small Data:

    • Temporarily limit results for testing:
      $this->buttons([
          Buttons::export('Excel', 'Excel')
              ->setQuery(User::query()->limit(10))
      ]);
      

Extension Points

  1. Custom Export Formats:

    • Extend the package by creating a custom export driver:
      // app/Exports/CustomExport.php
      use Yajra\DataTables\Buttons\Export\Export;
      use Maatwebsite\Excel\Facades\Excel;
      
      class CustomExport extends Export
      {
          public function export()
          {
              return Excel::download(new CustomExcelExport($this->collection), 'custom.xlsx');
          }
      }
      
  2. Macros for Reusable Logic:

    // app/DataTables/DataTableMacros.php
    DataTables::macro('addCustomExport', function() {
        return $this->buttons([
            Buttons::make('customExport')
                ->className('btn btn-info')
                ->action(function($query) {
                    return $query->get()->map(fn($item) => [
                        'id' => $item->id,
                        'custom_field' => $item->custom_field ?? 'N/A',
                    ]);
                }),
        ]);
    });
    
  3. Override Default Config:

    • Publish and modify config/datatables-buttons.php:
      'export' => [
      
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui
devgeek/beacon-admin
benjamin-rqt/data-watcher-bundle
atriumphp/atrium
sandermuller/package-boost-laravel
sandermuller/boost-skills
redaxo/core
yusufgenc/filament-api-forge
l3aro/rating-star-for-filament
leek/filament-subtenant-scope
anil/file-picker
broqit/fields-ai