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

Datatablesbundle Laravel Package

debricked/datatablesbundle

Symfony bundle that integrates jQuery DataTables with Doctrine, providing server-side processing, configurable columns/filters/sorting, and reusable datatable definitions. Includes v1.0 documentation and examples to quickly add data grids to your app.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require debricked/datatablesbundle
    

    Enable the bundle in config/bundles.php:

    return [
        // ...
        Debricked\DatatablesBundle\DatatablesBundle::class => ['all' => true],
    ];
    
  2. Basic Twig Usage: Include the bundle’s assets in your webpack.config.js (if using Webpack Encore):

    Encore
        .addEntry('datatables', './vendor/debricked/datatablesbundle/Resources/public/js/datatables.js')
        .enableSassLoader()
        .copyFiles({
            from: './vendor/debricked/datatablesbundle/Resources/public/css',
            to: 'css/[name].css'
        });
    

    Then, in your Twig template:

    {{ encore_entry_link_tags('datatables') }}
    
  3. First Controller Integration: Create a controller method to return JSON data for DataTables:

    use Debricked\DatatablesBundle\DataTables\DataTables;
    use Debricked\DatatablesBundle\DataTables\Column;
    
    public function getData(Request $request)
    {
        $dataTables = new DataTables();
        $dataTables->setDataSource($this->getUserRepository()->findAll());
        $dataTables->addColumn(new Column('id', 'ID', 'id'));
        $dataTables->addColumn(new Column('name', 'Name', 'name'));
        return $dataTables->render();
    }
    
  4. Frontend Integration: Use the bundle’s Twig helpers to render the table:

    {{ render_datatables_table({
        'dataSource': path('app_datatables_data', {'controller': 'UserController'}),
        'columns': [
            {'data': 'id', 'title': 'ID'},
            {'data': 'name', 'title': 'Name'}
        ]
    }) }}
    

Implementation Patterns

Common Workflows

  1. Dynamic Column Handling: Use Column objects to define columns dynamically based on user roles or permissions:

    $columns = [];
    if ($user->hasRole('ADMIN')) {
        $columns[] = new Column('created_at', 'Created At', 'created_at');
    }
    $dataTables->addColumns($columns);
    
  2. Server-Side Processing: Leverage the bundle’s built-in server-side processing for large datasets:

    $dataTables->setServerSide(true);
    $dataTables->setDataSource(function() {
        return $this->getUserRepository()->createQueryBuilder('u')
            ->getQuery()
            ->getResult();
    });
    
  3. Custom Actions: Add action buttons (e.g., edit, delete) using the Action class:

    use Debricked\DatatablesBundle\DataTables\Action;
    
    $dataTables->addColumn(new Column('actions', 'Actions', 'actions', [
        new Action('Edit', 'edit', ['id' => 'id']),
        new Action('Delete', 'delete', ['id' => 'id'])
    ]));
    
  4. Webpack Encore Integration: Extend the bundle’s default assets in webpack.config.js:

    Encore
        .addEntry('custom_datatables', './assets/js/datatables.js')
        .addDependency('datatables') // Ensure base bundle is loaded
        .copyFiles({
            from: './node_modules/datatables.net-dt/js',
            to: 'js/[name].js'
        });
    
  5. Twig Extensions: Override or extend Twig helpers in your bundle’s Resources/config/services.yaml:

    services:
        App\Twig\Extension\CustomDatatablesExtension:
            tags: ['twig.extension']
    

Integration Tips

  1. Symfony Forms + DataTables: Use the bundle’s FormColumn to bind DataTables columns to Symfony forms:

    use Debricked\DatatablesBundle\DataTables\FormColumn;
    
    $formColumn = new FormColumn('name', $this->createFormBuilder()->getForm());
    $dataTables->addColumn($formColumn);
    
  2. API-Driven Tables: For API-driven apps, return DataTables-compatible JSON from a separate route:

    public function apiData(Request $request)
    {
        $dataTables = new DataTables();
        $dataTables->setDataSource($this->getApiService()->fetchUsers());
        return $dataTables->render();
    }
    
  3. Localization: Override the bundle’s translations in config/packages/debricked_datatables.yaml:

    debricked_datatables:
        translations:
            emptyTable: "No data available in {language}"
    
  4. Event Listeners: Attach listeners to modify DataTables behavior globally:

    // src/EventListener/DatatablesListener.php
    public function onDatatablesBuild(DataTablesEvent $event) {
        $event->getDataTables()->addColumn(new Column('custom', 'Custom', 'custom'));
    }
    

    Register in services.yaml:

    services:
        App\EventListener\DatatablesListener:
            tags:
                - { name: kernel.event_listener, event: debricked.datatables.build, method: onDatatablesBuild }
    

Gotchas and Tips

Pitfalls

  1. Webpack Encore Mismatch:

    • Issue: If Webpack Encore is misconfigured, the bundle’s JS/CSS won’t load.
    • Fix: Ensure datatables entry is added after bootstrap in webpack.config.js:
      Encore.enableSingleRuntimeChunk()
          .cleanupOutputBeforeBuild()
          .enableSourceMaps(!Encore.isProduction())
          .enableSassLoader()
          .enableReactPreset()
          .copyFiles({
              from: './vendor/debricked/datatablesbundle/Resources/public',
              to: 'bundles/datatables/[path][name].[ext]'
          });
      
  2. Server-Side Processing Overhead:

    • Issue: Server-side processing can slow down responses if queries are inefficient.
    • Fix: Use Doctrine’s DQL or query builder optimizations:
      $qb = $this->getUserRepository()->createQueryBuilder('u');
      $qb->select(['u.id', 'u.name']); // Only select needed columns
      $dataTables->setDataSource($qb->getQuery()->getResult());
      
  3. Column Naming Conflicts:

    • Issue: Column names like id or name may conflict with DataTables’ internal properties.
    • Fix: Use unique aliases:
      $dataTables->addColumn(new Column('user_id', 'ID', 'id', ['alias' => 'user_id']));
      
  4. Twig Cache Invalidation:

    • Issue: Changes to Twig templates (e.g., render_datatables_table) may not reflect due to caching.
    • Fix: Clear the Twig cache:
      php bin/console cache:clear
      
  5. Deprecated jQuery DataTables:

    • Issue: The bundle uses an older version of DataTables (v1.10.x). Newer features (e.g., v1.13+) may not work.
    • Fix: Manually include updated DataTables assets via Webpack:
      Encore.addEntry('datatables', [
          './node_modules/datatables.net/js/jquery.dataTables.js',
          './node_modules/datatables.net-dt/css/jquery.dataTables.css'
      ]);
      

Debugging Tips

  1. Check Raw Data: Log the raw data source before rendering:

    $data = $this->getUserRepository()->findAll();
    \Log::debug('DataTables Data:', ['data' => $data]);
    $dataTables->setDataSource($data);
    
  2. Validate JSON Output: Use a tool like JSONLint to validate the bundle’s JSON response. Common issues:

    • Missing draw, recordsTotal, or data keys.
    • Incorrect column mappings.
  3. Browser Console Errors:

    • 404 for JS/CSS: Verify Webpack Encore’s publicPath and asset paths.
    • Uncaught ReferenceError: Ensure jQuery is loaded before DataTables:
      {{ encore_entry_script_tags('jquery') }}
      {{ encore_entry_script_tags('datatables') }}
      
  4. Symfony Profiler: Use the profiler to inspect DataTables events:

    // In a controller
    $event = new DataTablesEvent($dataTables);
    $this->get('event_dispatcher')->dispatch($event, 'debricked.datatables.build');
    

Extension Points

  1. Custom Data Providers: Implement Debricked\DatatablesBundle\DataTables\DataProviderInterface for non
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.
calmfox/watch-sylius
damienfern/grpc-symfony-bundle
atoolo/index-bundle
atoolo/genai-bundle
coprotoai/laravel-ticket
davidjln/llm-carbon-bundle
cryonighter/valid-request-bundle
coolms/taxonomy-bundle
coolms/field-bundle
articulate-orm/symfony
aaix/laravel-tall-architect
ephoto/akeneo-connector
emmanuelballery/eb-plantumlbundle
emielburgman/symfony-visitor-beacon
emielburgman/symfony-visit-storage
emielburgman/symfony-security-headers
emielburgman/symfony-log-viewer
emarref/xdebug-bundle
emarref/pubnub-bundle
elriseio/finance-money-bundle