Laravel-datatables: Besoin d'un filtre déroulant personnalisé.

Créé le 25 oct. 2017  ·  12Commentaires  ·  Source: yajra/laravel-datatables

Résumé du problème ou de la demande de fonctionnalité


J'ai besoin du filtre de données à l'aide de la liste déroulante personnalisée. J'ai les données qui s'affichent bien maintenant, j'ai besoin d'une liste déroulante personnalisée dans l'en-tête pour filtrer les données par valeur de liste déroulante [Remarque: je dois fournir cette valeur déroulante pour le filtre dans la requête laravel. Il s'agit d'une valeur personnalisée, je dois donc filtrer les données à l'aide de cette valeur personnalisée.]

Extrait de code du problème

Ce code fonctionne pour le filtre par défaut, mais j'ai ajouté la liste déroulante à l'aide de jquery, je dois donc transmettre cette valeur dans la requête laravel pour filtrer les données.

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

Et mon code de requête en 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.');
        }
    }

Le cas échéant, veuillez inclure une copie de votre code qui déclenche le bug suspecté. Vous pouvez utiliser les balises de code php markdown pour formater votre pâte: md5-29f7d4c1ff52f0e396b313bfe2550e56

Détails du système

Veuillez inclure ces détails sur votre système! S'ils sont omis, le ticket sera dépriorisé par rapport aux demandes / tickets des autres utilisateurs.
  • Système d'exploitation Ubuntu 16.04
  • PHP version 7.0.22
  • Laravel version 5.4
  • Laravel-Datatables Version 1.10.16

Screenshot

question

Commentaire le plus utile

Vous devez déclencher le tirage lorsque le filtre est changé. Peut-être quelque chose comme:

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

En outre, vous utilisez collection. Convertir

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

À quelque chose comme:

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

Tous les 12 commentaires

@shankhadevpadam vous pouvez le faire de plusieurs manières. Mais ce que je fais, c'est passer le générateur de requêtes avant les tables de données dans Server Side.


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

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

Vous pouvez bien sûr faire des IF conditionnelles.


$model = new Example();

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

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

Si vous ne souhaitez pas faire l'exemple ci-dessus, vous pouvez vous référer à la documentation. Recherche de colonnes d'articles , filtre personnalisé

Ma question est de savoir comment lier le menu déroulant comme l'image ci-dessus, je l'ai lié via jquery personnalisé, mais je dois le lier à l'aide du datatable et cette valeur devrait être disponible lorsque le menu déroulant est modifié. [Veuillez regarder mon extrait de code]

Ajoutez id dans la boîte de sélection.

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

Ensuite, incluez-le dans les paramètres de la requête.

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

Ensuite, effectuez le filtre nécessaire côté serveur.

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

Vous devez déclencher le tirage lorsque le filtre est changé. Peut-être quelque chose comme:

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

En outre, vous utilisez collection. Convertir

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

À quelque chose comme:

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

Merci de travailler maintenant.

Bienvenue, n'oubliez pas de mettre le projet en vedette si vous le trouvez utile. :) Merci!

La liste déroulante fonctionne parfaitement mais l'affichage des données après le changement de valeur dans la liste déroulante n'est pas correctement ordonné.

Screenshot

Vous souhaitez classer par date une fois filtré? Vous devez le faire au niveau js . Ou définissez l'ordre par défaut sur cette colonne.

Oui, tout exemple s'il vous plaît.

Je n'ai aucun exemple. Voir la documentation officielle de js api https://datatables.net/reference/api/ pour la référence. L'astuce consiste à exécuter une commande manuelle de commande js avant d'exécuter la fonction de rafraîchissement de la table.

@yajra Comment implémenter l'équivalent dans les tables de données en tant que service?

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

@sistemaswebbrasil en utilisant 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 = [])
Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

shadoWalker89 picture shadoWalker89  ·  3Commentaires

nasirkhan picture nasirkhan  ·  3Commentaires

SGarridoDev picture SGarridoDev  ·  3Commentaires

jgatringer picture jgatringer  ·  3Commentaires

t0n1zz picture t0n1zz  ·  3Commentaires