Проверьте предварительно выбранные строки в jQuery Datatable
У меня есть jQuery DataTable ниже:
examinees_table = $('#examinees_table').dataTable({
"bJQueryUI": true,
"sPaginationType": "full_numbers",
"aoColumns": [
/*select*/ null,
/*id*/ {"bVisible": false},
/*name*/ null,
/*course*/ null
]
});
И вот мой HTML:
<table id="examinees_table">
<thead>
<tr>
<th>Select</th>
<th>ID</th>
<th>Full Name</th>
<th>Degree</th>
</tr>
</thead>
<tbody>
<?php foreach($users as $user) {?>
<tr>
<?php foreach ($examinees as $examinee) {?>
<?php if($examinee->examinee_id == $user->id) {?>
<td class="center"><?= Form::checkbox('is_examinee-'.$user->id, null, (bool) true, array('id' => $user->id)); ?></td>
<?php } else {?>
<td class="center"><?= Form::checkbox('is_examinee-'.$user->id, null, (bool) false, array('id' => $user->id)); ?></td>
<?php } ?>
<td class="center"><?= $user->id; ?></td>
<td class="center"><?= $user->first_name.' '.$user->last_name; ?></td>
<td class="center"><?= $user->courses->description; ?></td>
<?php }?>
</tr>
<?php }?>
</tbody>
</table>
Что я хочу сделать:
Мне нужно загрузить всех зарегистрированных пользователей из моей таблицы "Пользователи" и проверить каждого пользователя в моей таблице данных, чей идентификатор находится в моей таблице экзаменующихся.
Я обновляю список испытуемых, чтобы пользователь мог удалить (снять отметку) с существующих испытуемых и добавить больше испытуемых. Я могу получить проверенные строки перед отправкой формы, но у меня нет способа определить, какой из существующих испытуемых не был отмечен, поэтому я могу удалить там идентификатор в таблице экзаменующихся.
Что может быть лучшим подходом для этого? Я не чувствую, что то, что я сделал в своем HTML, является лучшим решением.
2 ответа
Я нашел способ получить желаемый результат, в своей таблице данных я использовал функцию fnCreatedRow для проверки каждой созданной строки, если она находится в массиве EXISTING EXAMINEES:
examinees_table = $('#examinees_table').dataTable({
"bJQueryUI": true,
"sPaginationType": "full_numbers",
"aoColumns": [
/*select*/ null,
/*id*/ {"bVisible": false},
/*name*/ null,
/*course*/ null
],
"fnCreatedRow": function( nRow, aData, iDataIndex ) {
var eID = $('#existing_examinees').val();
if(eID === undefined) {
return;
}
var eIDArray = eID.split('/');
var deletedID = $('#removed_examinees').val();
var deletedIDArray = deletedID.split('/');
if(eIDArray.length > 0) {
$.each(eIDArray, function(index, value) {
var id = $("input:checkbox", nRow).attr('id');
// alert('index: ' + index + ' ' + 'value: ' + value + ' ' + 'id: ' + id);
if(id == value) {
$("input:checkbox", nRow).prop('checked', true);
}
});
}
$("input:checkbox", nRow).click(function() {
var selected_id = $("input:checkbox", nRow).attr('id');
var checked = $("input:checkbox", nRow).prop('checked');
if(checked == false) {
var deleted_index = $.inArray(selected_id, eIDArray);
var inDeletedArr = $.inArray(eIDArray[deleted_index], deletedIDArray);
if(inDeletedArr < 0) {
if(deleted_index > -1) {
var removed = $('#removed_examinees').val();
if(removed == '') {
removed = eIDArray[deleted_index];
} else {
removed = removed + '/' + eIDArray[deleted_index];
}
$('#removed_examinees').val(removed);
}
}
}
});
}
});
Я также добавил прослушиватель onClick для добавления не проверяемых существующих испытуемых, которые будут отправлены на сервер при отправке формы.
Есть два способа сделать это:
- Очистите каждый идентификатор испытуемого из базы данных, прежде чем добавлять те, которые идут с данными POST.
- Внедрите массив идентификаторов POST, удалите
NOT IN (id1, id2, ...)
и добавьте новых испытуемых.
PS. Чтобы избежать дублирования кода, переместите проверяемое пользовательское условие == в проверенный атрибут.
<?= Form::checkbox('is_examinee-'.$user->id, null, ($examinee->examinee_id == $user->id), array('id' => $user->id)); ?>
PPS. испытуемый foreach кажется странным, может быть, вы должны сделать отбор.