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

Datatables Bundle Laravel Package

adsazad/datatables-bundle

Symfony bundle integrating jQuery DataTables for realtime Ajax tables (Symfony 4.4+/5+). Data source logic is decoupled via adapters; includes Doctrine ORM, MongoDB and Elastica, with support for custom adapters. Includes a console generator command.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require omines/datatables-bundle
    

    Enable the bundle in config/bundles.php:

    return [
        // ...
        Omines\DataTablesBundle\OminesDataTablesBundle::class => ['all' => true],
    ];
    
  2. Basic Controller Integration: Create a controller to handle DataTables requests:

    use Omines\DataTablesBundle\DataTables;
    use Omines\DataTablesBundle\DataTablesFactory;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    
    class MyController extends AbstractController
    {
        public function dataTableAction(Request $request, DataTablesFactory $factory): Response
        {
            $dataTables = $factory->create(DataTables::class);
            $dataTables->setDataSource($this->getDataSource()); // Your data source (e.g., EntityManager)
            return $dataTables->getResponse($request);
        }
    
  3. First Use Case: Render a DataTable in a Twig template:

    {{ render('omines_datatables_bundle::datatable.html.twig', {
        'datatable': path('my_controller_data_table'),
        'columns': [
            { 'data': 'id', 'title': 'ID' },
            { 'data': 'name', 'title': 'Name' }
        ]
    }) }}
    

Implementation Patterns

Data Source Integration

  • Doctrine ORM: Use Omines\DataTablesBundle\DataSource\DoctrineORMDataSource for EntityManager integration:

    $dataSource = new DoctrineORMDataSource($entityManager, MyEntity::class);
    $dataTables->setDataSource($dataSource);
    
  • Custom Data Sources: Implement Omines\DataTablesBundle\DataSource\DataSourceInterface for non-Doctrine sources (e.g., API clients, CSV files).

Column Configuration

  • Basic Columns:

    $dataTables->setColumns([
        'id' => ['title' => 'ID', 'data' => 'id'],
        'name' => ['title' => 'Name', 'data' => 'name'],
    ]);
    
  • Complex Columns (e.g., computed fields, formatted output):

    $dataTables->setColumns([
        'full_name' => [
            'title' => 'Full Name',
            'data' => null, // Use a custom function
            'render' => function ($row) {
                return $row->getFirstName() . ' ' . $row->getLastName();
            }
        ]
    ]);
    

Filtering and Sorting

  • Default Behavior: Enable server-side processing (default) for filtering/sorting:

    $dataTables->setOptions(['serverSide' => true]);
    
  • Custom Filtering: Override filter() in your data source:

    $dataSource->setFilterCallback(function ($queryBuilder, $data) {
        if (!empty($data['search']['value'])) {
            $queryBuilder->andWhere('e.name LIKE :name')
                ->setParameter('name', '%' . $data['search']['value'] . '%');
        }
    });
    

Pagination

  • Auto-Pagination: Handled automatically with serverSide: true. Customize via:
    $dataTables->setOptions([
        'serverSide' => true,
        'lengthMenu' => [[10, 25, 50, -1], [10, 25, 50, 'All']],
    ]);
    

Integration with Symfony Forms

  • Dynamic Column Binding: Use Omines\DataTablesBundle\Form\DataTablesType to bind DataTables to Symfony forms:
    $builder->add('datatable', DataTablesType::class, [
        'datatable' => $dataTables,
        'columns' => $columns,
    ]);
    

Gotchas and Tips

Common Pitfalls

  1. CORS Issues:

    • Ensure your DataTables AJAX endpoint includes CORS headers if frontend and backend are separate:
      $response->headers->set('Access-Control-Allow-Origin', '*');
      
  2. Case Sensitivity in Filtering:

    • Doctrine queries are case-sensitive by default. Use LOWER() in queries for case-insensitive searches:
      $queryBuilder->andWhere('LOWER(e.name) LIKE LOWER(:name)')
          ->setParameter('name', '%' . $data['search']['value'] . '%');
      
  3. Memory Limits:

    • Large datasets may hit memory limits. Use pagination early in queries:
      $queryBuilder->setFirstResult($data['start'])
          ->setMaxResults($data['length']);
      
  4. Column Mismatch:

    • Ensure data in column config matches actual property/method names in your data source. Use render for custom logic.

Debugging

  • Enable Verbose Logging:

    # config/packages/omines_datatables.yaml
    omines_datatables:
        debug: true
    

    Logs raw DataTables requests/responses to var/log/dev.log.

  • Inspect Request Data: Dump $request->request->all() in your controller to verify DataTables parameters (e.g., draw, columns, order).

Performance Tips

  1. Selective Field Loading:

    • Use DQL to fetch only required fields:
      $queryBuilder->select('e.id', 'e.name'); // Instead of 'e'
      
  2. Indexed Columns:

    • Add database indexes to frequently filtered/sorted columns.
  3. Lazy Loading:

    • For large datasets, implement lazy loading in your data source:
      $dataSource->setLazyLoading(true);
      

Extension Points

  1. Custom Adapters:

    • Extend Omines\DataTablesBundle\DataTables to add custom logic (e.g., export buttons, row callbacks).
  2. Event Listeners:

    • Subscribe to datatables.pre_process and datatables.post_process events for request/response modification:
      $eventDispatcher->addListener('datatables.pre_process', function ($event) {
          $event->setDataSource($customDataSource);
      });
      
  3. Twig Extensions:

    • Override default Twig templates by copying templates/omines_datatables_bundle/ to your project and customizing.

Configuration Quirks

  • Default Options: Override globally in config/packages/omines_datatables.yaml:

    omines_datatables:
        default_options:
            serverSide: true
            processing: true
            language:
                url: '//cdn.datatables.net/plug-ins/1.10.21/i18n/Spanish.json'
    
  • Route Scope: Ensure your DataTables routes are scoped correctly (e.g., _controller in Twig must match Symfony’s routing).

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.
comsave/common
alecsammon/php-raml-parser
chrome-php/wrench
lendable/composer-license-checker
typhoon/reflection
mesilov/moneyphp-percentage
mike42/gfx-php
bookdown/themes
aura/view
aura/html
aura/cli
povils/phpmnd
nayjest/manipulator
omnipay/tests
psr-mock/http-message-implementation
psr-mock/http-factory-implementation
psr-mock/http-client-implementation
voku/email-check
voku/urlify
rtheunissen/guzzle-log-middleware