PHP code example of babasultan23 / dynamic-datatable

1. Go to this page and download the library: Download babasultan23/dynamic-datatable library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

babasultan23 / dynamic-datatable example snippets


'providers' => [
    // ...
    BabaSultan23\DynamicDatatable\DynamicDatatableServiceProvider::class,
],

'aliases' => [
    // ...
    'BabaSultan23DynamicDatatable' => BabaSultan23\DynamicDatatable\Facades\BabaSultan23DynamicDatatable::class,
]

use BabaSultan23\DynamicDatatable\Facades\BabaSultan23DynamicDatatable;

class YourController extends Controller
{
    public function index()
    {
        $columns = [
            ['data' => 'id', 'title' => 'ID'],
            ['data' => 'name', 'title' => 'Ad'],
            ['data' => 'email', 'title' => 'E-posta'],
            ['data' => 'actions', 'title' => 'İşlemler', 'orderable' => 'false']
        ];

        $dataTable = BabaSultan23DynamicDatatable::render(
            tableId: 'my-table',                // DataTable id    <table id="{{ my-table }}" >
            dataTableName: 'myDatatable',       // DataTable adı    var {{ myDatatable }} = $('#{{ $tableId }}').DataTable({
            columns: $columns,                  // Tablo kolonları
            fetchUrl: route('data.fetch'),      // Veri çekme URL'i
            title: 'Tablo Başlığı'              // Tablo Başlığı    <h2 class="pageheader-title">{{ $title }}</h2>
        );

        return view('your-view', compact('dataTable'));
    }
}

BabaSultan23DynamicDatatable::setOrderMapping([ //tablodaki kolon adı => veri tabanı karşılığı
    'full_name' => "CONCAT(students.name, ' ', students.surname)",
    'lesson_name' => 'lessons.name',
]);

BabaSultan23DynamicDatatable::setSearchMapping([ //tablodaki kolon adı => veri tabanı karşılığı
    'full_name' => "CONCAT(students.name, ' ', students.surname)",
    'lesson_name' => 'lessons.name',
    'email' => 'students.email',
    'city' => 'students.city'
]);

BabaSultan23DynamicDatatable::setActionButtons(function($row) {
    return '
        <button onclick="edit('.$row->id.')" class="btn btn-warning">Düzenle</button>
        <button onclick="delete('.$row->id.')" class="btn btn-danger">Sil</button>
    ';
});

BabaSultan23DynamicDatatable::setFormatResponse(function($query, $totalRecords, $filteredRecords) {
    return DataTables::of($query)
        ->with([
            'recordsTotal' => $totalRecords,
            'recordsFiltered' => $filteredRecords,
        ])
        ->addColumn('full_name', function($row) {
            return $row->first_name . ' ' . $row->last_name;
        })
        ->addColumn('lesson_name', function ($data) {
            return $data->lesson_name;
        })
        ->filterColumn('full_name', function ($query, $keyword) {
            $query->whereRaw("CONCAT(students.name, ' ', students.surname) LIKE ?", ["%{$keyword}%"]);
        })
        ->filterColumn('lesson_name', function ($query, $keyword) {
            $query->where('lessons.name', 'like', "%{$keyword}%");
        })
        ->addColumn('actions', function($row) {
            return BabaSultan23DynamicDatatable::getActionButtons($row);
        })
        ->rawColumns(['actions'])
        ->make(true);
});

 $dataTable = BabaSultan23DynamicDatatable::render(
     ....
     ....
 return view('',compact('dataTable'));

BabaSultan23DynamicDatatable::render(
    tableId: 'users-table',              // DataTable id    <table id="my-table" >
    dataTableName: 'usersTable',         // DataTable adı    var myDatatable = $('#{{ $tableId }}').DataTable({
    columns: $columns,                   // Tablo kolonları
    fetchUrl: route('users.fetch'),      // Veri çekme URL'i
    title: 'Kullanıcılar',               // Tablo Başlığı    <h2 class="pageheader-title">{{ $title }}</h2>
    options: [                           // DataTable seçenekleri || boş array [] gönderilebilir. //default ayarlar config dosyası içerisinde yer almakta.
        'pageLength' => 10,      // default 10 
        'scrollX' => true,
        'stateSave' => false,
    ],
    filters: [           
                // Herhangi bir filtre olmaması durumunda [] şeklinde gönderebilirsiniz
                // 'filters' => []  veya  'filters' => ['html' => [], 'js'=>[]] şeklinde kullanılabilir
                'html' => '
                    <div class="row mb-3">
                        <div class="col-md-4">
                            <label for="cityFilter" class="filter-label">Şehir Seç:</label>
                            <select id="cityFilter" class="form-control city-select">
                                <option value="">Tüm Şehirler</option>
                            </select>
                        </div>
                        <div class="col-md-4">
                            <label for="dateFilter" class="filter-label">(Örnek) - Tarih:</label>
                            <input type="date" id="dateFilter" class="form-control">
                        </div>
                        <div class="col-md-4">
                            <label for="statusFilter" class="filter-label">(Örnek) - Durum:</label>
                            <select id="statusFilter" class="form-control">
                                <option value="">Tümü</option>
                                <option value="active">Aktif</option>
                                <option value="passive">Pasif</option>
                            </select>
                        </div>
                    </div>
                ',
                'js' => [
                    'filterElements' => ['cityFilter', 'dateFilter', 'statusFilter'],
                    'filterData' => "
                        d.city = $('#cityFilter').val();
                        d.date = $('#dateFilter').val();
                        d.status = $('#statusFilter').val();
                    "
                ]
            ],
    plusButton: true,                    // Alt menü butonu gösterimi | default : false. true olarak gönderildiğinde dinamik child tableda renderlanır
    plusParentIdKey: 'parent_id'         // Alt menü ilişki anahtarı => gönderilen değişkene request->değişken_adı ($request->parent_id) şeklinde ulaşılabilir.
);


   ['data' => 'plus', 'title' => '', 'orderable' => 'false']
   

   ->addColumn('plus', function ($data) {
       if (Model::where('parent_id', $data->id)->count() > 0) {
           return '<button class="btn btn-success sub-menu-button"><i class="fa fa-plus-circle"></i></button>';
       }
   })
   

   $query = Model::query();
   
   $parentId = $request->request_param ?? [];
   if ($parentId != null && $parentId) {
       $query = $query->where('parent_id', $parentId);
   } else {
       $query = $query->whereNull('parent_id');
   }
   

public function fetch(Request $request)
{
    $query = Student::query();   // Veri yalnızca query builder olarak sağlanmalıdır. all(), get(), take(), limit() gibi yöntemlerin kullanılması desteklenmemektedir.

    $parentId = $request->parent_id ?? [];
    if ($parentId != 'null' && $parentId) {
        $query = $query->where('parent_id', $parentId);
    } else {
        $query = $query->whereNull('parent_id');
    }

    $query->leftJoin('lessons', 'students.lesson_id', '=', 'lessons.id')   // Varsa relationlarınız bu şekilde eklenebilir
        ->select('students.*', 'lessons.name as lesson_name');

    if (isset($request->city) && $request->city !== '') {
        $query->where('students.city', $request->city);
    }

    $result = BabaSultan23DynamicDatatable::handleDataTableQuery($query, $request);   //ZORUNLU

    return BabaSultan23DynamicDatatable::formatDataTableResponse(                     //ZORUNLU
        $result['query'],
        $result['totalRecords'],
        $result['filteredRecords']
    );
}

BabaSultan23DynamicDatatable::setOrderMapping([...])
    ->setSearchMapping([...])
    ->setActionButtons(function($row) { ... })
    ->setFormatResponse(function($query, $totalRecords, $filteredRecords) { ... });

public function index()
    {
        $columns = [
            ['data' => 'id', 'title' => 'ID'],
            ['data' => 'plus', 'title' => '', 'orderable' => 'false'],
            ['data' => 'full_name', 'title' => 'Ad - Soyad'],
            ['data' => 'lesson_name', 'title' => 'Ders Adı'],
            ['data' => 'email', 'title' => 'Mail'],
            ['data' => 'city', 'title' => 'İl'],
            ['data' => 'actions', 'title' => 'İşlemler', 'orderable' => 'false']
        ];

        $dataTable = BabaSultan23DynamicDatatable::render(
            tableId: 'tableId',
            dataTableName: 'dataTableName',
            columns: $columns,
            fetchUrl: route('fetchUrl'),
            title: ' ... ',
            options: [ ... ],
            filters: [ ... ],
            plusButton: true,
            plusParentIdKey: 'plusParentIdKey'
        );

        $cities = ['Ankara', 'Istanbul', 'Izmir'];
        $lessons = Lesson::all();

        return view('package-test', compact('dataTable', 'cities', 'lessons'));
    }

    public function fetch(Request $request)
    {
        BabaSultan23DynamicDatatable::setOrderMapping([
            'full_name' => "CONCAT(students.name, ' ', students.surname)",
            'lesson_name' => 'lessons.name',
        ])
            ->setSearchMapping([
                'email' => 'email',
                'city' => 'students.city'
            ])
            ->setActionButtons(function ($row) {
                return '<button onclick="updateStudent(' . $row->id . ')" class="btn btn-warning">Güncelle</button>
                        <button onclick="deleteStudent(' . $row->id . ')" class="btn btn-danger">Sil</button>';
            })
            ->setFormatResponse(function ($query, $totalRecords, $filteredRecords) {
                return DataTables::of($query)
                    ->with([
                        'recordsTotal' => $totalRecords,
                        'recordsFiltered' => $filteredRecords,
                    ])
                    ->addColumn('plus', function ($data) {
                        if (Student::where('parent_id', $data->id)->count() > 0) {
                            return '<button class="btn btn-success sub-menu-button"><i class="fa fa-plus-circle"></i></button>';
                        }
                    })
                    ->addColumn('addColumn', function ($data) {
                        return $data->addColumn;
                    })
                    ->filterColumn('addColumnFilter', function ($query, $keyword) {
                        $query->where('addColumn', 'like', "%{$keyword}%");
                    })
                    ->addColumn('actions', function ($row) {
                        return BabaSultan23DynamicDatatable::getActionButtons($row);
                    })
                    ->rawColumns(['addColumn', 'addColumnFilter', 'plus', 'actions'])
                    ->make(true);
            });

        $query = Model::query();

        $result = BabaSultan23DynamicDatatable::handleDataTableQuery($query, $request);

        return BabaSultan23DynamicDatatable::formatDataTableResponse(
            $result['query'],
            $result['totalRecords'],
            $result['filteredRecords']
        );
    }


bash
php artisan vendor:publish --provider="BabaSultan23\DynamicDatatable\DynamicDatatableServiceProvider" --tag=config
php artisan vendor:publish --provider="BabaSultan23\DynamicDatatable\DynamicDatatableServiceProvider" --tag=crudAjax
bash
php artisan vendor:publish --provider="BabaSultan23\DynamicDatatable\DynamicDatatableServiceProvider" --tag=views <

path:
    resources/babasultan23/dynamic-datatable/dynamic_datatable.blade.php
bash
path:
    config/babasultan23-dynamic-datatable.php
javascript
Yukarıdaki eklemelerin tamamlandığı ve ilgili Blade dosyasına modal entegrasyonunun gerçekleştirildiği varsayılarak:
     
           function createStudent() {
            createAjax(
                "studentDatatable",              // DataTable Name
                "create_student",                // formId
                "{{ route('student.create') }}", // URL
                "#add-modal",                    // modalId
                "Kayıt başarıyla oluşturuldu!"   // successMessage (optional)
            );
        }

        function deleteStudent(id) {
            deleteAjax(
                "studentDatatable",              // DataTable Name
                "",                              // formId
                "{{ route('student.delete') }}", // URL
                "",                              // modalId
                "Kayıt başarıyla silindi!",      // successMessage (optional)
                id                               // Silinecek Datanın Id değeri
            );
        }

        function updateStudent(id) {
            var fieldMapping = { // Input ID - Returning Response Key
                'nameUpdate': 'name',
                'surnameUpdate': 'surname',
                'cityUpdate': 'city',
                'mailUpdate': 'email',
                'updateId': 'updateId',
                'lesson_idUpdate': 'lesson_id'
            };

            getAjaxData(
                "studentDatatable",              // DataTable Name (opsiyonel)
                "{{ route('student.get') }}",    // URL
                "#update_modal",                 // modalId
                fieldMapping,                    // fieldMapping parametresini gönderin
                id                               // Veri ID'si
            );
        }

        function updateStudentPost() {
            updateAjax(
                "studentDatatable",              // DataTable Name
                "update_student",                // formId
                "{{ route('student.update') }}", // URL
                "#update_modal",                 // modalId
                "Kayıt başarıyla güncellendi!"   // successMessage (optional)
            );
        }