Laravel-datatables: Perlu filter dropdown kustom.

Dibuat pada 25 Okt 2017  ·  12Komentar  ·  Sumber: yajra/laravel-datatables

Ringkasan masalah atau permintaan fitur


Saya memerlukan filter data menggunakan drop-down kustom. Saya memiliki data yang ditampilkan dalam bentuk yang baik sekarang saya memerlukan dropdown kustom di header untuk memfilter data dengan nilai dropdown [Catatan: saya perlu menyediakan nilai dropdown ini untuk filter di kueri laravel. Ini adalah nilai khusus sehingga saya perlu memfilter data menggunakan nilai khusus ini.]

Potongan kode masalah

Kode ini berfungsi untuk filter default tetapi saya telah menambahkan dropdown menggunakan jquery jadi saya harus meneruskan nilai ini di kueri laravel untuk memfilter data.

$(function () {
    var t = $('#user').DataTable({
        order: [[ 0, 'desc' ]],
        processing: true,
        serverSide: true,
        ajax: {
            url: '{!! route('datatables.data') !!}',
            data: function(d) {
                d.name = $('input[name=name]').val();
                d.email = $('input[name=email]').val();
            }
        },
        columns: [
            { data: 'id', name: 'id' },
            { data: 'name', name: 'name' },
            { data: 'email', name: 'email' },
            { data: 'arrival_date', name: 'arrival_date', orderable: true, searchable: true },
            { data: 'pick_up', name: 'pick_up', orderable: true, searchable: true },
            { data: 'destination', name: 'destination', orderable: true, searchable: true},
            { data: 'trekking_start_date', name: 'trekking_start_date', orderable: true, searchable: true},

            { data: 'trekking_end_date', name: 'trekking_end_date', orderable: true, searchable: true},
            { data: 'action', name: 'action', orderable: false, searchable: false},
        ]
    });
});

$(document).ready(function() {
    $('<label style="margin-left: 10px;">Filter by ' +
        '<select class="form-control input-sm">'+
            '<option value="volvo">Completed Trip</option>'+
            '<option value="saab">Upcoming Trip</option>'+
        '</select>' + 
        '</label>').appendTo("#user_wrapper #user_length");
});

Dan kode kueri saya di laravel

public function getClients(Request $request)
    {
        if($request->ajax()) {
            return Datatables::of(DB::select(DB::Raw('SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM role_user) ORDER BY users.id DESC')))
                    //}))
                    ->addColumn('arrival_date', function($user){
                        if(isset(Helper::getFlightsByClientID($user->id)->arrival_date)) {
                            return date('M j, Y', strtotime(Helper::getFlightsByClientID($user->id)->arrival_date));
                        } else {
                            return 'N/A';
                        }
                    })
                    ->addColumn('pick_up', function($user){
                        if(isset(Helper::getFlightsByClientID($user->id)->pick_up)) {
                            return Helper::getFlightsByClientID($user->id)->pick_up == 1 ? 'Yes' : 'No'; 
                        } else {
                            return 'N/A';
                        }
                    })
                    ->addColumn('destination', function($user){
                        if(isset(Helper::getTreksByClientID($user->id)->trekking_region_id)) {
                            return Helper::getTrekByID(Helper::getTreksByClientID($user->id)->trekking_region_id)->name; 
                        } else {
                            return 'N/A';
                        }
                    })
                    ->addColumn('trekking_start_date', function($user){
                        if(isset(Helper::getTreksByClientID($user->id)->trekking_start_date)) {
                            return date('M j, Y', strtotime(Helper::getTreksByClientID($user->id)->trekking_start_date));
                        } else {
                            return 'N/A';
                        }
                    })
                    ->addColumn('trekking_end_date', function($user){
                        if(isset(Helper::getTreksByClientID($user->id)->trekking_end_date)) {
                            return date('M j, Y', strtotime(Helper::getTreksByClientID($user->id)->trekking_end_date));
                        } else {
                            return 'N/A';
                        }
                    })
                    ->addColumn('action', function($user){
                        $html = '';
                        $html .= '<a class="btn bg-green btn-flat btn-xs" href="'.route('user.clients.edit', $user->id).'">Edit</a>';

                        if(auth()->user()->hasRole('superadmin')) {
                            $html .= ' <a onclick="if(!confirm(\'Are u sure to delete?\')) return false;" class="btn bg-red btn-flat btn-xs" href="'.route('user.clients.delete', $user->id).'">Delete</a>';
                        }

                        return $html;

                    })
                    ->make(true);
        } else {
            abort(400, 'Bad Request.');
        }
    }

Jika berlaku, harap sertakan salinan kode Anda yang memicu bug yang dicurigai. Anda dapat menggunakan tag kode php penurunan harga untuk memformat tempel Anda: md5-29f7d4c1ff52f0e396b313bfe2550e56

Detail sistem

Harap sertakan detail ini tentang sistem Anda! Jika mereka dihilangkan, tiket akan diturunkan prioritasnya daripada permintaan / tiket pengguna lain.
  • Sistem Operasi Ubuntu 16.04
  • Versi PHP 7.0.22
  • Laravel Versi 5.4.0
  • Laravel-Datatables Versi 1.10.16

Screenshot

question

Komentar yang paling membantu

Anda perlu memicu gambar saat filter diubah. Mungkin sesuatu seperti:

<select class="form-control input-sm" id="custom-filter" onchange="$('#user').DataTable().draw()">

Juga, Anda menggunakan koleksi. Mengubah

DB::select(DB::Raw('SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM role_user) ORDER BY users.id DESC'))

Untuk sesuatu seperti:

DB::table('users')->whereNot(...);

Semua 12 komentar

@shankhadevpadam Anda dapat melakukan ini dengan berbagai cara. Tapi yang saya lakukan adalah meneruskan pembuat kueri sebelum datatables di Server Side.


$model = new Example();
$model->where('column_to_filter','=',$this->request->get('filter_by'));

return datatables()->eloquent($model);

Anda tentu saja dapat melakukan IF bersyarat.


$model = new Example();

if($this->request->has('name')) {
     $model->where('name','=','predefined value');
}

return datatables()->eloquent($model);

Jika Anda tidak ingin melakukan contoh di atas, Anda dapat merujuk ke dokumen. Pencarian Kolom Posting , Filter Kustom

Pertanyaan saya adalah bagaimana mengikat dropdown seperti gambar di atas, saya telah mengikatnya melalui jquery kustom tetapi saya perlu mengikat menggunakan datatable dan nilai ini harus tersedia ketika dropdown berubah. [Silakan lihat cuplikan kode saya]

Tambahkan id pada kotak pilih.

<select class="form-control input-sm" id="custom-filter">

Kemudian sertakan di parameter permintaan.

        ajax: {
            url: '{!! route('datatables.data') !!}',
            data: function(d) {
                d.name = $('input[name=name]').val();
                d.email = $('input[name=email]').val();
                d.filter = $('#custom-filter').val();
            }
        },

Kemudian lakukan filter yang diperlukan di sisi server.

if ($filter = request('filter')) {
    $query->where('filter', $filter);
}

Anda perlu memicu gambar saat filter diubah. Mungkin sesuatu seperti:

<select class="form-control input-sm" id="custom-filter" onchange="$('#user').DataTable().draw()">

Juga, Anda menggunakan koleksi. Mengubah

DB::select(DB::Raw('SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM role_user) ORDER BY users.id DESC'))

Untuk sesuatu seperti:

DB::table('users')->whereNot(...);

Terima kasih sekarang bekerja.

Selamat datang, jangan lupa untuk memberi bintang pada proyek jika Anda merasa berguna. :) Terima kasih!

Dropdown berfungsi dengan sempurna tetapi tampilan data setelah perubahan nilai di dropdown tidak diatur dengan benar.

Screenshot

Anda ingin memesan berdasarkan tanggal saat difilter? Anda perlu melakukan ini pada level js . Atau atur urutan default ke kolom itu.

Ya, Tolong contoh apa saja.

Tidak punya contoh. Lihat dokumen js api resmi https://datatables.net/reference/api/ untuk referensi. Triknya adalah dengan melakukan perintah js order manual sebelum melakukan fungsi gambar ulang tabel.

@yajra Bagaimana menerapkan yang setara dalam datatables sebagai layanan?

            data: function(d) {
                d.name = $('input[name=name]').val();
                d.email = $('input[name=email]').val();
                d.filter = $('#custom-filter').val();
            }

@sistemaswebbrasil menggunakan minifiedAjax() :

$script = '
data.name = $('input[name=name]').val();
data.email = $('input[name=email]').val();
data.filter = $('#custom-filter').val();
';

return $this
            ->builder()
            ...
            ->minifiedAjax($url = '', $script = null, $data = [])
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

hari-web picture hari-web  ·  3Komentar

shadoWalker89 picture shadoWalker89  ·  3Komentar

SGarridoDev picture SGarridoDev  ·  3Komentar

jgatringer picture jgatringer  ·  3Komentar

macnux picture macnux  ·  3Komentar