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. Adds CSV/Excel/PDF generation and print support for jQuery DataTables Buttons extension, integrated with yajra/laravel-datatables on modern Laravel and PHP versions.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Install the package:

    composer require yajra/laravel-datatables-buttons:^13
    
  2. Publish assets (optional):

    php artisan vendor:publish --tag=datatables-buttons
    

    (Required only if you need custom button styles or JS overrides.)

  3. First use case: Extend a DataTable class and add buttons to an existing DataTables instance:

    use Yajra\DataTables\Facades\DataTables;
    use Yajra\DataTables\Buttons;
    
    // In your controller:
    public function anyData()
    {
        return DataTables::of(User::query())
            ->addColumn('action', function($user) {
                return '<button>View</button>';
            })
            ->addButtons([
                Buttons::export('csv', 'csv'),
                Buttons::export('excel', 'excel'),
                Buttons::printButton(),
            ])
            ->make(true);
    }
    
  4. Frontend integration: Include the DataTables Buttons JS/CSS in your blade template:

    <script src="https://cdn.datatables.net/buttons/2.4.1/js/dataTables.buttons.min.js"></script>
    <script src="https://cdn.datatables.net/buttons/2.4.1/js/buttons.html5.min.js"></script>
    <script src="https://cdn.datatables.net/buttons/2.4.1/js/buttons.print.min.js"></script>
    

Implementation Patterns

Core Workflows

1. Basic Export Setup

// Controller
public function users()
{
    return DataTables::of(User::query())
        ->addButtons([
            Buttons::export('csv', 'CSV'),
            Buttons::export('excel', 'Excel'),
            Buttons::export('pdf', 'PDF'),
        ])
        ->make(true);
}
  • Key: Use Buttons::export() with format and label arguments.
  • Output: Generates buttons for CSV, Excel, and PDF exports with server-side processing.

2. Custom Export Logic

Override default export behavior using exportRender() or exportOptions():

$dt = DataTables::of(User::query())
    ->addColumn('full_name', function($user) {
        return $user->first_name . ' ' . $user->last_name;
    })
    ->editColumn('full_name', function($user) {
        return '<strong>' . $user->full_name . '</strong>';
    })
    ->addButtons([
        Buttons::export('csv', 'CSV', function($query) {
            return $query->select('id', 'full_name as name', 'email');
        }),
    ]);
  • Use case: Filter columns or apply transformations during export (e.g., strip HTML tags).

3. Print Button with Custom View

$dt = DataTables::of(User::query())
    ->addButtons([
        Buttons::printButton('Print', function($query) {
            return $query->select('id', 'name', 'email');
        }, 'print-view'), // Custom view name
    ]);
  • Key: Pass a view name to render the print output (e.g., resources/views/print-view.blade.php).
  • Tip: Use exportOptions() to customize headers/footers:
    ->addButtons([
        Buttons::printButton('Print', null, null, 'print-view', 'Print Users', true, true, [
            'buttons' => ['print', 'reset'],
            'title' => 'User List',
            'footer' => 'Page <span data-dt-footer="page"></span> of <span data-dt-footer="total"></span>',
        ]),
    ])
    

4. Dynamic Button Configuration

Use Buttons::buttons() for complex setups:

$dt = DataTables::of(User::query())
    ->addButtons([
        Buttons::buttons([
            'buttons' => [
                ['extend' => 'csv', 'text' => 'CSV Export'],
                ['extend' => 'excel', 'text' => 'Excel Export'],
                ['extend' => 'pdf', 'text' => 'PDF Export'],
                ['extend' => 'print', 'text' => 'Print'],
            ],
            'init' => function($context, $button) {
                // Custom logic (e.g., disable buttons for admins)
                if (auth()->user()->is_admin) {
                    return false;
                }
                return true;
            },
        ]),
    ]);

5. Macros for Reusability

Define reusable button configurations using macros (Laravel 12+):

// In AppServiceProvider@boot()
DataTables::macro('adminExportButtons', function($query) {
    return [
        Buttons::export('csv', 'CSV', $query),
        Buttons::export('excel', 'Excel', $query),
        Buttons::printButton('Print', $query, 'admin-print-view'),
    ];
});

// Usage:
$dt = DataTables::of(User::query())
    ->addButtons(DataTables::adminExportButtons(User::query()));

Integration Tips

  1. Leverage exportRender() for Complex Data:

    $dt = DataTables::of(Order::query())
        ->addColumn('total', function($order) {
            return '$' . number_format($order->amount, 2);
        })
        ->addButtons([
            Buttons::export('csv', 'CSV', null, null, 'orders-export', function($query) {
                return $query->with('user:id,name')->select('id', 'user_id', 'amount as total');
            }),
        ]);
    
    • Use case: Export related models or transform data before export.
  2. Custom Export Filenames:

    Buttons::export('csv', 'CSV', null, null, 'custom-filename', function($query) {
        return $query->select('id', 'name');
    }, 'orders-export-' . now()->format('Y-m-d'));
    
  3. Conditional Buttons:

    $buttons = [];
    if (auth()->user()->can('export')) {
        $buttons[] = Buttons::export('csv', 'CSV');
    }
    $dt->addButtons($buttons);
    
  4. Route-Based Exports: Use Buttons::route() for custom routes:

    $dt = DataTables::of(User::query())
        ->addButtons([
            Buttons::route('export.csv', 'CSV', 'export.csv', 'CSV Export'),
            Buttons::route('export.excel', 'Excel', 'export.excel', 'Excel Export'),
        ]);
    
    • Key: Define routes in routes/web.php:
      Route::get('export/csv', [UserController::class, 'exportCsv'])->name('export.csv');
      
  5. OpenSpout (Excel) Customization:

    $dt = DataTables::of(User::query())
        ->addButtons([
            Buttons::export('excel', 'Excel', null, null, 'users-export', function($query) {
                return $query->select('id', 'name', 'email');
            }, [
                'title' => 'User Export',
                'creator' => 'MyApp',
                'modDate' => now(),
                'customProperties' => [
                    'Company' => 'MyCompany',
                ],
            ]),
        ]);
    

Gotchas and Tips

Pitfalls

  1. Asset Loading Issues:

    • Symptom: Buttons appear but don’t work.
    • Fix: Ensure all required DataTables Buttons JS/CSS files are loaded after jQuery and DataTables core:
      <!-- Correct order -->
      <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
      <script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
      <script src="https://cdn.datatables.net/buttons/2.4.1/js/dataTables.buttons.min.js"></script>
      <script src="https://cdn.datatables.net/buttons/2.4.1/js/buttons.html5.min.js"></script>
      <script src="https://cdn.datatables.net/buttons/2.4.1/js/buttons.print.min.js"></script>
      
    • Tip: Use vendor:publish to customize button assets if needed.
  2. CSV/Excel Encoding Problems:

    • Symptom: Special characters (e.g., é, ñ) appear as ?? in exports.
    • Fix: Set the charset in config/datatables.php:
      'buttons' => [
          'exportOptions' => [
              'charset' => 'UTF-8',
          ],
      ],
      
    • Alternative: Use exportOptions() in your DataTable:
      ->addButtons([
          Buttons::export('csv',
      
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.
codraw/framework-extra-bundle
codraw/messenger
codraw/security
codraw/mailer
codraw/contracts
codraw/profiling
codraw/dependency-injection
codraw/tester
codraw/core
nexmo/api-specification
capell-app/block-library
axium/identity
cetria/laravel-dummy-models
cetria/reflection-helper
agropredict/sso-auth-bundle
evolvestudio/spam-protection
datacore/hub-sdk
develia/commons
cuci/prototurk-sdk
cuci/prototurk-sdk-symfony