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.]
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
@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é.
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 = [])
Commentaire le plus utile
Vous devez déclencher le tirage lorsque le filtre est changé. Peut-être quelque chose comme:
En outre, vous utilisez collection. Convertir
À quelque chose comme: