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 Editor Laravel Package

yajra/laravel-datatables-editor

Laravel plugin for yajra/laravel-datatables that powers DataTables Editor (2.x) server-side CRUD in Laravel. Supports create/edit/remove actions and integrates with DataTables 2.x. Requires a DataTables Editor premium license.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps

  1. Installation:

    composer require yajra/laravel-datatables-editor:^13
    

    Ensure yajra/laravel-datatables is also installed (required dependency).

  2. Publish Config:

    php artisan vendor:publish --provider="Yajra\DataTables\DataTablesServiceProvider" --tag=config
    
  3. Generate Editor Controller:

    php artisan datatables:editor User
    

    Replace User with your Eloquent model. This creates a stub controller with CRUD methods.

  4. Add Route:

    // routes/web.php
    Route::post('/users-editor', [UserEditor::class, 'index']);
    
  5. Frontend Setup: Include DataTables Editor JS/CSS and initialize:

    $(document).ready(function() {
        $('#users-table').DataTable({
            processing: true,
            serverSide: true,
            ajax: {
                url: '/users-editor',
                type: 'POST'
            },
            columns: [
                { data: 'id', name: 'id' },
                { data: 'name', name: 'name' },
                { data: 'email', name: 'email' }
            ],
            editor: {
                ajax: {
                    url: '/users-editor',
                    type: 'POST'
                },
                fields: [
                    { label: 'ID', name: 'id' },
                    { label: 'Name', name: 'name' },
                    { label: 'Email', name: 'email' }
                ]
            }
        });
    });
    

First Use Case

Inline Editing for a User Management Table:

  • Use the generated UserEditor controller to handle CRUD operations for a users table.
  • Leverage Eloquent validation rules (e.g., unique:users,email) to enforce data integrity.
  • Test bulk edits (e.g., updating is_active for multiple users) via the Editor’s bulk actions.

Implementation Patterns

Core Workflow

  1. Controller Integration: Extend Yajra\DataTables\DataTables and implement getEditor():

    public function getEditor()
    {
        return $this->editor
            ->fields([
                'id',
                'name',
                'email',
                'is_active'
            ])
            ->create(function ($request) {
                return User::create($request->all());
            })
            ->update(function ($request, $key) {
                $user = User::findOrFail($key);
                $user->update($request->all());
                return $user;
            })
            ->delete(function ($key) {
                $user = User::findOrFail($key);
                return $user->delete();
            });
    }
    
  2. Validation: Use Laravel’s validation rules in validate():

    protected function validate($request, $key = null, $rule = null)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users,email,'.$key,
            'is_active' => 'boolean'
        ]);
        return $validator;
    }
    
  3. Event Hooks: Override pre/post events for custom logic:

    protected function beforeCreate($request)
    {
        $request->merge(['created_by' => auth()->id()]);
    }
    
    protected function afterUpdate($request, $key)
    {
        event(new UserUpdated($key, $request->all()));
    }
    
  4. Bulk Operations: Handle bulk edits/deletes in getEditor():

    ->edit(function ($request, $keys) {
        return User::whereIn('id', $keys)->update(['is_active' => $request->is_active]);
    })
    ->remove(function ($keys) {
        return User::whereIn('id', $keys)->delete();
    });
    

Integration Tips

  • Artisan Commands: Use php artisan datatables:editor to scaffold controllers for new models. Customize the stub template in resources/views/vendor/datatables/editor.blade.php.

  • Custom Actions: Extend functionality with customActions:

    ->customActions([
        'custom_action' => function ($request, $key) {
            // Custom logic (e.g., send email, trigger API call)
            return ['success' => true];
        }
    ]);
    
  • Relationships: Handle nested data (e.g., hasMany):

    ->fields([
        'id',
        'name',
        'posts.*' // For nested data
    ]);
    
  • File Uploads: Use the built-in upload handlers:

    protected function getUploadDirectory()
    {
        return 'uploads/users';
    }
    
    protected function storeUploadedFile($field, UploadedFile $uploadedFile)
    {
        return $uploadedFile->store($this->getUploadDirectory());
    }
    
  • API Integration: Route Editor requests to a dedicated controller:

    Route::post('/api/users-editor', [Api\UserEditor::class, 'index'])->middleware('api');
    
  • Testing: Mock Editor requests in PHPUnit/Pest:

    $response = $this->post('/users-editor', [
        '_token' => csrf_token(),
        'action' => 'edit',
        'data' => ['id' => 1, 'name' => 'Updated Name']
    ]);
    

Gotchas and Tips

Pitfalls

  1. Premium License Requirement:

    • DataTables Editor is not free. Ensure your team has a valid license for the premium version (required for server-side processing).
    • Tip: Check the DataTables Editor license page for team pricing.
  2. CSRF Token Mismatch:

    • Editor requests must include a valid CSRF token. Use csrf_token() in your frontend or configure Laravel to trust the Editor’s AJAX origins:
      // app/Http/Middleware/VerifyCsrfToken.php
      protected $except = [
          'users-editor',
      ];
      
    • Tip: For API routes, use SameSite cookies or stateless token validation.
  3. Validation Errors:

    • Editor expects validation errors in a specific format. Ensure your validate() method returns a Validator instance:
      // ❌ Wrong
      return ['error' => 'Validation failed'];
      
      // ✅ Correct
      return Validator::make($request->all(), $rules);
      
    • Tip: Use ->errors() to format errors for Editor:
      return response()->json(['errors' => $validator->errors()], 422);
      
  4. Bulk Action Quirks:

    • Bulk edits/deletes may fail silently if the response format is incorrect. Always return:
      {
          "success": true,
          "data": [...]
      }
      
    • Tip: Log bulk action responses for debugging:
      Log::info('Bulk edit response:', $response);
      
  5. Model Binding:

    • Ensure your model uses findOrFail() or firstOrFail() to avoid silent failures:
      // ❌ Risky
      $user = User::find($key);
      
      // ✅ Safe
      $user = User::findOrFail($key);
      
  6. Nested Data Conflicts:

    • Nested fields (e.g., posts.*) may cause conflicts if the backend expects a flat structure. Use ->fields() to explicitly define nested data:
      ->fields([
          'id',
          'name',
          'posts.*.title', // Explicit nested field
          'posts.*.content'
      ]);
      
  7. Event Hook Timing:

    • Pre-events (e.g., beforeCreate) run before validation. Use post-events (e.g., afterCreate) for logic that depends on validated data.
    • Tip: Chain events for complex workflows:
      protected function beforeCreate($request) {
          $request->merge(['temp_field' => 'value']);
      }
      
      protected function afterCreate($request) {
          // Use $request->temp_field
      }
      
  8. Artisan Stub Customization:

    • The datatables:editor command uses a stub template. Override it in resources/views/vendor/datatables/editor.blade.php to add custom methods or fields.
    • Tip: Extend the stub to include default customActions or upload handlers.

Debugging Tips

  1. Log Editor Requests: Add middleware to log raw Editor payloads:

    // app/Http/Middleware/LogEditorRequests.php
    public function handle($request, Closure $next) {
        if ($request->isMethod('post') && $request->has('action')) {
            Log::debug('Editor request:', $request->all());
        }
        return $next($request);
    }
    
  2. Validate Response Format: Use Postman or cURL to

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.
davejamesmiller/laravel-breadcrumbs
artisanry/parsedown
christhompsontldr/phpsdk
enqueue/dsn
bunny/bunny
enqueue/test
enqueue/null
enqueue/amqp-tools
milesj/emojibase
bower-asset/punycode
bower-asset/inputmask
bower-asset/jquery
bower-asset/yii2-pjax
laravel/nova
spatie/laravel-mailcoach
spatie/laravel-superseeder
laravel/liferaft
nst/json-test-suite
danielmiessler/sec-lists
jackalope/jackalope-transport