Laravel-datatables: بحاجة إلى مرشح منسدل مخصص.

تم إنشاؤها على ٢٥ أكتوبر ٢٠١٧  ·  12تعليقات  ·  مصدر: yajra/laravel-datatables

ملخص المشكلة أو طلب الميزة


أحتاج إلى مرشح البيانات باستخدام قائمة منسدلة مخصصة. لدي البيانات التي يتم عرضها في شكل جيد الآن ، فأنا بحاجة إلى قائمة منسدلة مخصصة في الرأس لتصفية البيانات حسب القيمة المنسدلة [ملاحظة: أحتاج إلى توفير هذه القيمة المنسدلة للتصفية في استعلام Laravel. هذه قيمة مخصصة لذا أحتاج إلى تصفية البيانات باستخدام هذه القيمة المخصصة.]

مقتطف رمز المشكلة

يعمل هذا الرمز مع عامل التصفية الافتراضي ولكني أضفت القائمة المنسدلة باستخدام jquery لذلك أحتاج إلى تمرير هذه القيمة في استعلام Laravel لتصفية البيانات.

$(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");
});

ورمز الاستعلام الخاص بي في 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.');
        }
    }

إذا كان ذلك ممكنًا ، يرجى تضمين نسخة من الكود الخاص بك الذي يؤدي إلى الخطأ المشتبه به. يمكنك استخدام علامات كود php markdown لتنسيق اللصق الخاص بك: md5-29f7d4c1ff52f0e396b313bfe2550e56

تفاصيل النظام

الرجاء تضمين هذه التفاصيل حول نظامك! إذا تم حذفها ، سيتم إلغاء الأولوية للتذكرة على طلبات / تذاكر المستخدمين الآخرين.
  • نظام التشغيل أوبونتو 16.04
  • إصدار PHP 7.0.22
  • إصدار Laravel 5.4.1
  • Laravel-Datatables الإصدار 1.10.16

Screenshot

question

التعليق الأكثر فائدة

تحتاج إلى تشغيل الرسم عند تغيير الفلتر. ربما شيء مثل:

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

أيضا ، أنت تستخدم المجموعة. يتحول

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

إلى شيء مثل:

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

ال 12 كومينتر

shankhadevpadam يمكنك القيام بذلك بعدة طرق. ولكن ما أفعله هو تمرير منشئ الاستعلام قبل جداول البيانات في جانب الخادم.


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

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

يمكنك بالطبع عمل IFs الشرطية.


$model = new Example();

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

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

إذا كنت لا تريد أن تفعل المثال أعلاه ، يمكنك الرجوع إلى المستندات. بحث العمود ، عامل تصفية مخصص

سؤالي هو كيفية ربط القائمة المنسدلة مثل الصورة أعلاه ، لقد ربطتها من خلال jquery مخصص ولكني بحاجة إلى الربط باستخدام جدول البيانات ويجب أن تكون هذه القيمة متاحة عند تغيير القائمة المنسدلة. [الرجاء الاطلاع على مقتطف الشفرة الخاص بي]

أضف id في مربع التحديد.

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

ثم قم بتضمينه في معلمات الطلب.

        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();
            }
        },

ثم قم بعمل المرشح اللازم على جانب الخادم.

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

تحتاج إلى تشغيل الرسم عند تغيير الفلتر. ربما شيء مثل:

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

أيضا ، أنت تستخدم المجموعة. يتحول

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

إلى شيء مثل:

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

شكرا تعمل الآن.

مرحبًا ، لا تنس تمييز المشروع بنجمة إذا وجدته مفيدًا. :) شكرا!

تعمل القائمة المنسدلة بشكل مثالي ولكن عرض البيانات بعد تغيير القيمة في القائمة المنسدلة لا يتم الترتيب بشكل صحيح.

Screenshot

هل تريد الترتيب حسب التاريخ عند التصفية؟ تحتاج إلى القيام بذلك على مستوى js . أو عيّن الترتيب الافتراضي لهذا العمود.

نعم ، أي مثال من فضلك.

ليس لدي أي مثال. راجع مستندات js api الرسمية https://datatables.net/reference/api/ للمرجع. الحيلة هي تنفيذ أمر js يدويًا قبل تنفيذ وظيفة إعادة رسم الجدول.

yajra كيفية تطبيق المكافئ في

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

sistemaswebbrasil باستخدام 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 = [])
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات