$(document).ready(function() {
let fact = -1;
// FOREACH_STARTS_HERE
$('table.tab-<?= $tab_id ?>').DataTable({
processing: true,
serverSide: true,
serverMethod: 'post',
ajax: {
url: 'ENDPOINT_URL',
data: function(pdata) {
pdata.tab = <?= $tab_id ?>;
pdata.fact = fact;
},
render: $.fn.dataTable.render.text()
},
});
$("#filter_1-<?= $tab_id ?>").click(function() {
fact = -1;
$('#filter_1-<?= $tab_id ?>').addClass("active");
$('#filter_2-<?= $tab_id ?>').removeClass('active');
$('#filter_3-<?= $tab_id ?>').removeClass('active');
$('table.tab-<?= $tab_id ?>').DataTable().ajax.reload();
});
$("#filter_2-<?= $tab_id ?>").click(function() {
fact = 0;
$('#filter_2-<?= $tab_id ?>').addClass("active");
$('#filter_1-<?= $tab_id ?>').removeClass('active');
$('#filter_3-<?= $tab_id ?>').removeClass('active');
$('table.tab-<?= $tab_id ?>').DataTable().ajax.reload();
});
$("#filter_3-<?= $tab_id ?>").click(function() {
fact = 1;
$('#filter_3-<?= $tab_id ?>').addClass("active");
$('#filter_1-<?= $tab_id ?>').removeClass('active');
$('#filter_2-<?= $tab_id ?>').removeClass('active');
$('table.tab-<?= $tab_id ?>').DataTable().ajax.reload();
});
// FOREACH_ENDS_HERE
});
<!-- FOREACH STARTS HERE -->
<li>
<div>
<button id="filter_1-<?= $tab_id ?>" >Filter_1</button>
<button id="filter_2-<?= $tab_id ?>">Filter_2</button>
<button id="filter_3-<?= $tab_id ?>">Filter_3</button>
</div>
<div>
<div>
<table id="tab-<?= $tab_id ?>" >
<thead>
<tr>
<th>Header - 0</th>
<th>Header - 1</th>
<th>Header - 2</th>
<th>Header - 3</th>
<th>Header - 4</th>
<th>Header - 5</th>
<th>Header - 6</th>
<th>Header - 7</th>
<th>Header - 8</th>
<th>Header - 9</th>
<th>Header - 10</th>
</tr>
</thead>
</table>
</div>
</div>
</li>
<!-- FOREACH ENDS HERE -->
I have a javascript that generates multiple DataTable using foreach
for each table. I also generate several buttons and javascript functions for each table to filter them through server side.
Currently, I am using foreach
to generate .click
functions for additional filtering but I felt like this is not correct way of doing this. Sometimes I have up to 10 tables, which makes the following code 3 x 10 click function on single page. I made some research but couldn't find better approach.
How could I simplify the following javascript part? It looks too messy when there are more than 2 table I need to process;
<script>
$(document).ready(function () {
//...set some variables...
<?php foreach ($tables as $tab_id => $table) : ?>
//...init DataTable, ajax part etc...
$("#filter_1-<?= $tab_id ?>").click(function () {
fact = -1;
$('#filter_1-<?= $tab_id ?>').addClass("active");
$('#filter_2-<?= $tab_id ?>').removeClass('active');
$('#filter_3-<?= $tab_id ?>').removeClass('active');
$('table.tab-<?= $tab_id ?>').DataTable().ajax.reload();
});
$("#filter_2-<?= $tab_id ?>").click(function () {
fact = 0;
$('#filter_2-<?= $tab_id ?>').addClass("active");
$('#filter_1-<?= $tab_id ?>').removeClass('active');
$('#filter_3-<?= $tab_id ?>').removeClass('active');
$('table.tab-<?= $tab_id ?>').DataTable().ajax.reload();
});
$("#filter_3-<?= $tab_id ?>").click(function () {
fact = 1;
$('#filter_3-<?= $tab_id ?>').addClass("active");
$('#filter_1-<?= $tab_id ?>').removeClass('active');
$('#filter_2-<?= $tab_id ?>').removeClass('active');
$('table.tab-<?= $tab_id ?>').DataTable().ajax.reload();
});
<?php endforeach; ?>
});
</script>
Thanks in advance for any guidance, I feel like I am terrible with javascript :)
CodePudding user response:
Here is the script I would consider. I have not tested it, but you do not need the PHP at all in the script if you use the class
I split filter_1-<?= $tab_id ?>
on -
to get the tab_id
$(function() {
let fact = "0";
$('table').each(function() {
$(this).DataTable({
processing: true,
serverSide: true,
serverMethod: 'post',
ajax: {
url: 'ENDPOINT_URL',
data: function(pdata) {
pdata.tab = $(this).attr("id");
pdata.fact = fact;
},
render: $.fn.dataTable.render.text()
},
});
$(".filter").on("click",function() {
$(this).siblings().removeClass("active")
$(this).addClass("active");
const tabID = $(this).attr("id").split("-")[1];
fact = $(this).data("fact");
$(`table.tab-${tabID}`).DataTable().ajax.reload();
});
});
HTML:
<div>
<button id="filter_1-<?= $tab_id ?>" data-fact="-1" >Filter_1</button>
<button id="filter_2-<?= $tab_id ?>" data-fact="0" >Filter_2</button>
<button id="filter_3-<?= $tab_id ?>" data-fact="1" >Filter_3</button>
</div>