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

Datatable Bundle Laravel Package

crossknowledge/datatable-bundle

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require crossknowledge/datatable-bundle
    

    Add to config/bundles.php:

    CrossKnowledge\DataTableBundle\CrossKnowledgeDataTableBundle::class => ['all' => true],
    
  2. Basic Configuration: Update config/packages/cross_knowledge_data_table.yaml (if needed) or rely on defaults.

  3. First Use Case: Create a controller method to handle DataTable requests:

    use CrossKnowledge\DataTableBundle\DataTable\DataTableFactory;
    use Symfony\Component\HttpFoundation\Request;
    
    public function dataTableAction(Request $request, DataTableFactory $factory)
    {
        $dataTable = $factory->create();
        $dataTable->setDataSource($this->getDataSource()); // Your data source (e.g., Doctrine query)
        $dataTable->addColumn('id', 'ID');
        $dataTable->addColumn('name', 'Name');
    
        return $dataTable->handleRequest($request);
    }
    
  4. Frontend Integration: Include jQuery, DataTables CSS/JS, and initialize:

    $(document).ready(function() {
        $('#example').DataTable({
            processing: true,
            serverSide: true,
            ajax: '/your-endpoint'
        });
    });
    

Implementation Patterns

Common Workflows

  1. Dynamic Column Handling: Use addColumn() with custom callbacks for server-side processing:

    $dataTable->addColumn('created_at', 'Date')
        ->setFormatter(function($value) {
            return (new \DateTime($value))->format('Y-m-d');
        });
    
  2. Search and Filtering: Leverage built-in search/filtering via DataTables client-side options or server-side logic:

    $dataTable->setSearchableColumns(['name', 'email']);
    
  3. Pagination and Sorting: Configure via DataTable:

    $dataTable->setDefaultOrder(['column' => 'name', 'dir' => 'asc']);
    $dataTable->setLengthMenu([10, 25, 50, 100]);
    
  4. Complex Data Sources: Integrate with Doctrine (e.g., QueryBuilder) or custom repositories:

    $query = $entityManager->getRepository(User::class)->createQueryBuilder('u');
    $dataTable->setDataSource($query);
    
  5. Custom Actions: Add buttons or links via addActionColumn():

    $dataTable->addActionColumn('actions', 'Actions')
        ->addAction('edit', 'Edit', '/edit/{id}')
        ->addAction('delete', 'Delete', '/delete/{id}', 'confirm');
    

Integration Tips

  • Symfony Forms: Use DataTable to render forms for inline editing (e.g., editable columns).
  • APIs: Return JSON responses for non-Symfony frontend (e.g., React/Vue).
  • Caching: Cache DataTable responses (e.g., StashBundle) for static data.
  • Testing: Mock DataTableFactory and Request for unit tests:
    $request = $this->createMock(Request::class);
    $request->query->expects($this->any())->method('all')->willReturn(['draw' => 1]);
    

Gotchas and Tips

Pitfalls

  1. Case Sensitivity: Column names in addColumn() must match the data source property names exactly (e.g., user_id vs. userId).

  2. Query Builder Pitfalls:

    • Count Queries: Ensure setDataSource() with Doctrine QueryBuilder includes SELECT COUNT(*) for accurate pagination.
    • Joins: Use addJoin() or manually add joins to the QueryBuilder before passing it to the DataTable.
  3. Performance:

    • Avoid eager-loading large datasets. Use fetchJoinColumn() for specific columns:
      $dataTable->addColumn('full_name', 'Full Name')
          ->setFetchJoinColumn(['first_name', 'last_name']);
      
    • Disable server-side processing if data is small:
      $dataTable->setServerSide(false);
      
  4. CSRF Protection: Ensure DataTable endpoints are protected (e.g., via Symfony’s CsrfTokenManager) if using forms/actions.

  5. Deprecation: Some methods (e.g., setData()) may be deprecated in favor of setDataSource(). Check the changelog.

Debugging

  • Enable Debugging: Set debug: true in config/packages/cross_knowledge_data_table.yaml to log SQL queries and DataTable events.
  • Check Request Data: Dump the request payload to verify DataTables parameters:
    dump($request->query->all());
    
  • Validate JSON Responses: Use tools like JSONLint to validate server-side responses.

Extension Points

  1. Custom Data Sources: Implement CrossKnowledge\DataTableBundle\DataTable\DataSourceInterface for non-Doctrine sources (e.g., Elasticsearch):

    class ElasticDataSource implements DataSourceInterface {
        public function fetchData(array $options) { ... }
        public function fetchCount(array $options) { ... }
    }
    
  2. Event Listeners: Subscribe to DataTable events (e.g., data_table.build.query) to modify queries dynamically:

    # config/services.yaml
    services:
        App\EventListener\DataTableListener:
            tags:
                - { name: kernel.event_listener, event: data_table.build.query, method: onBuildQuery }
    
  3. Twig Extensions: Create a Twig extension to render DataTables with default options:

    $twig->addExtension(new DataTableTwigExtension($factory));
    
    {{ render_data_table('users', {'columns': ['id', 'name']}) }}
    
  4. Custom Formatters: Extend CrossKnowledge\DataTableBundle\DataTable\Column\Formatter\FormatterInterface for reusable formatters (e.g., currency, dates).

Configuration Quirks

  • Default Values: Override defaults in config/packages/cross_knowledge_data_table.yaml:
    cross_knowledge_data_table:
        default_length: 25
        default_order: [['column' => 'created_at', 'dir' => 'desc']]
    
  • Locale: Set locale in config to support non-English date/number formatting:
    cross_knowledge_data_table:
        locale: 'fr_FR'
    
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.
terminal42/code-quality-tools
codifyo/ts-generator-bundle
andydefer/laravel-cluster
testo/fiber
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity
christhompsontldr/laravel-inky