Вопрос или проблема
Я пытаюсь сделать фильтр поиска в нижней части моей серверной таблицы данных, но когда я что-то ввожу, данные не отображаются.
Вот мой КОНТРОЛЛЕР.
public function getDataSales(){//BUAT Sales
$search = $_POST['search']['value'];
$start = $_POST['start'];
$length = $_POST['length'];
$order = $_POST['order'];
$column_order = ['Tanggal', 'Nama Alokasi', 'Cabang', 'Jenis Proyek', 'Nama Proyek', 'jam_mulai', 'jam_selesai', 'Jenis Pekerjaan', 'keterangan', 'persentase_hasil'];
$order_column = $column_order[$order[0]['column']];
$order_dir = $order[0]['dir'];
$cabang = $this->input->get('cabang');
$dari = $this->input->get('dari') ? $this->input->get('dari') : date("Y-m-d");
$filter['dari'] = $dari;
$filter['cabang'] = $cabang;
$columns = ['Tanggal', 'Nama Alokasi', 'Cabang', 'Jenis Proyek', 'Nama Proyek', 'jam_mulai', 'jam_selesai', 'Jenis Pekerjaan', 'keterangan', 'persentase_hasil'];
$columns = $_POST['columns'];
$results = $this->project->getDataTable_alokasiSales($search, $start, $length, $order_column, $order_dir, $filter,$columns);
$data = [];
$no = $start;
foreach($results as $result){
$row = array();
$row ....
$data[] = $row;
}
$output = array(
"draw" => $_POST['draw'],
"recordsTotal" => $this->project->count_all_data_alokasiSales(),
"recordsFiltered" => $this->project->count_filtered_data_alokasiSales($search,$filter),
"data" => $data,
"search" => $search,
"columns" => $columns
);
$this->output->set_content_type('application/json')->set_output(json_encode($output));
}
МОДЕЛЬ:
private function _get_data_query_alokasiSales($filter)
{
$DB2 = $this->load->database('old_db', TRUE);
$search = $_POST['search']['value'];
$sql="
SELECT
`ga - alokasi harian`.*,
`hrd - karyawan`.bagian AS divisi,
`hrd - karyawan`.nama_cabang AS cabang_aktual
FROM
`ga - alokasi harian`
LEFT JOIN
`hrd - karyawan`
ON
`ga - alokasi harian`.`Nama Alokasi` = `hrd - karyawan`.nama
WHERE
`nama` IN ((
SELECT `nama`
FROM
`hrd - karyawan`
WHERE `bagian` = 'Sales & Marketing'
))
AND `hrd - karyawan`.`status`='Aktif'
";
if (!empty($filter['dari']) && !empty($filter['dari'])) {
$sql .= " AND `Tanggal` BETWEEN '" . $DB2->escape_str($filter['dari']) . "' AND '" . $DB2->escape_str($filter['dari']) . "'";
}
if (!empty($filter['cabang']) && !empty($filter['cabang'])) {
$sql .= " AND `hrd - karyawan`.nama_cabang = '" . $DB2->escape_str($filter['cabang']) . "'";
}
if (!empty($search)) {
$sql .= " AND (`Tanggal` LIKE '%" . $DB2->escape_like_str($search) . "%'
OR `Nama Alokasi` LIKE '%" . $DB2->escape_like_str($search) . "%'
OR `Cabang` LIKE '%" .$DB2->escape_like_str($search). "%'
OR `Jenis Proyek` LIKE '%" . $DB2->escape_like_str($search) . "%'
OR `Nama Proyek` LIKE '%" . $DB2->escape_like_str($search) . "%'
OR `jam_mulai` LIKE '%" . $DB2->escape_like_str($search) . "%'
OR `jam_selesai` LIKE '%" . $DB2->escape_like_str($search) . "%'
OR `Jenis Pekerjaan` LIKE '%" . $DB2->escape_like_str($search) . "%'
OR `keterangan` LIKE '%" . $DB2->escape_like_str($search) . "%'
OR `persentase_hasil` LIKE '%" . $DB2->escape_like_str($search) . "%'
OR `ketercapaian` LIKE '%" . $DB2->escape_like_str($search) . "%')";
}
$sql .= " ORDER BY `ga - alokasi harian`.`Nama Alokasi` ASC";
return $sql;
}
public function getDataTable_alokasiSales($search, $start, $length, $order_column, $order_dir, $filter)
{
$DB2 = $this->load->database('old_db', TRUE);
$sql = $this->_get_data_query_alokasiSales($filter);
if ($_POST['length'] != -1) {
$sql .= " LIMIT " . $DB2->escape_str($_POST['start']) . ", " . $DB2->escape_str($_POST['length']);
}
$query = $DB2->query($sql);
return $query->result();
}
public function count_filtered_data_alokasiSales($search, $filter)
{
$DB2 = $this->load->database('old_db', TRUE);
$sql = $this->_get_data_query_alokasiSales($filter);
$query = $DB2->query($sql);
return $query->num_rows();
}
public function count_all_data_alokasiSales()
{
$DB2 = $this->load->database('old_db', TRUE);
$query = $DB2->query('SELECT COUNT(*) as count FROM `ga - alokasi harian`');
$result = $query->row();
return $result->count;
}
ПОКАЗ:
<table class="table table-sm table-striped table-bordered nowrap" style="width:100%" id="table-list-serverside">
...
<tfoot>
<tr>
<th></th>
<th class="umpetinfoot"><input type="text" class="form-control form-control-sm" data-column-name="Tanggal" placeholder="Фильтр Дата." /></th>
<th><input type="text" class="form-control form-control-sm" data-column-name="Nama Alokasi" placeholder="Фильтр Имя Алокации" /></th>
<th><input type="text" class="form-control form-control-sm" data-column-name="Cabang" placeholder="Фильтр Филиал" /></th>
<th><input type="text" class="form-control form-control-sm" data-column-name="Jenis Proyek" placeholder="Фильтр Вид Проекта" /></th>
<th><input type="text" class="form-control form-control-sm" data-column-name="Nama Proyek" placeholder="Фильтр Имя Проекта" /></th>
<th><input type="text" class="form-control form-control-sm" data-column-name="jam_mulai" placeholder="Фильтр Начало" /></th>
<th><input type="text" class="form-control form-control-sm" data-column-name="jam_selesai" placeholder="Фильтр Окончание" /></th>
<th><input type="text" class="form-control form-control-sm" data-column-name="Jenis Pekerjaan" placeholder="Фильтр Вид Работы" /></th>
<th><input type="text" class="form-control form-control-sm" data-column-name="Review" placeholder="Фильтр Обзор" /></th>
<th><input type="text" class="form-control form-control-sm" data-column-name="Hasil" placeholder="Фильтр Результат" /></th>
<th></th>
</tr>
</tfoot>
JS:
$(document).ready(function(){
var bagian = $('#bagian').val();
console.log(bagian);
var tujuan;
if (bagian == 5) {
tujuan = "<?= base_url('common/commonalokasiharianoffice/getDataGA?user_token=') . $this->session->userdata('user_token'); ?>&div="+bagian;
} else if (bagian == 3) {
tujuan = "<?= base_url('common/commonalokasiharianoffice/getData?user_token=') . $this->session->userdata('user_token'); ?>&div="+bagian;
} else if (bagian == 6) {
tujuan = "<?= base_url('common/commonalokasiharianoffice/getDataSales?user_token=') . $this->session->userdata('user_token'); ?>&div="+bagian;
} else if (bagian == 9) {
tujuan = "<?= base_url('common/commonalokasiharianoffice/getDataFinance?user_token=') . $this->session->userdata('user_token'); ?>&div="+bagian;
} else if (bagian == 8) {
tujuan = "<?= base_url('common/commonalokasiharianoffice/getDataLogistik?user_token=') . $this->session->userdata('user_token'); ?>&div="+bagian;
} else if (bagian == 2) {
tujuan = "<?= base_url('common/commonalokasiharianoffice/getDataHRD?user_token=') . $this->session->userdata('user_token'); ?>&div="+bagian;
}
var table = $('#table-list-serverside').DataTable({
"searching" : true,
"processing" : true,
"serverSide" : true,
"ordering" : true,
"filter" : true,
"order" : [1, "asc"],
lengthMenu: [
[10, 15, 25, 50, 100, -1],
[10, 15, 25, 50, 100, 'Все']
],
"pageLength": -1,
"scrollX": true,
"scrollY": 400,
"scrollCollapse": true,
"language": {
"infoFiltered": "", //не показывать общее количество данных в таблице
"info": "Показано _START_ до _END_ из _END_ записей" // не показывать общее количество данных, так как уже используется All lengthset
},
"ajax": {
"url": tujuan,
"data": function(d) {
d.bagian = $('#bagian').val();
d.columns = [];
$('#table-list-serverside tfoot th input').each(function(index) {
var columnName = $(this).data('column-name');
d.columns[index] = {
data: columnName,
search: { value: this.value }
};
console.log(`Column ${index}: ${columnName}, Результат поиска: ${this.value}`);
});
},
"type": "POST"
},
"initComplete": function () {
var api = this.api();
this.api().columns().every(function () {
var column = this;
var title = column.header().textContent.trim(); // Убираем лишние пробелы в начале и в конце заголовка
var input = document.createElement('input');
input.setAttribute('type', 'text');
input.setAttribute('placeholder', 'Фильтр ' + title);
input.setAttribute('class', 'form-control form-control-sm');
if (title !== 'No.' && title !== '') {
$(input).appendTo($(column.footer()).empty());
$(input).on('keyup change', function () {
if (column.search() !== this.value) {
column.search(this.value).draw();
}
});
}
});
}
});
table.column(1).visible(false);
table.column(4).visible(false);
table.column(6).visible(false);
table.column(7).visible(false);
table.column(11).visible(false);
Может кто-то поможет с этой проблемой?
Я уже искал на группу сообщества, даже chatgpt, но так и не решил.
Вопреки распространенному мнению, Lorem Ipsum не просто случайный текст. У него есть корни в произведении классической латинской литературы 45 года до нашей эры, что делает его более чем 2000 лет. Ричард МакКлинток, профессор латинского языка в колледже Хэмпден-Сидни в Вирджинии, нашел одно из более редких латинских слов, consectetur, в отрывке из Lorem Ipsum, и, просматривая цитаты этого слова в классической литературе, открыл неоспоримый источник. Lorem Ipsum происходит из разделов 1.10.32 и 1.10.33 “de Finibus Bonorum et Malorum” (Крайности Добра и Зла) Цицерона, написанного в 45 г. до н.э. Эта книга является трактатом по теории этики, очень популярным в эпоху Возрождения. Первая строка Lorem Ipsum, “Lorem ipsum dolor sit amet..”, происходит из строки в разделе 1.10.32.
Ответ или решение
Ваша проблема с фильтрацией данных в нижнем колонтитуле серверной таблицы DataTable может быть вызвана несколькими причинами. Чтобы помочь вам с этой задачей, давайте рассмотрим наиболее распространенные проблемы и решения, основанные на предоставленном вами коде.
1. Правильность отправки данных
Проверьте, корректно ли передаются данные на сервер. В вашем JavaScript-коде при инициализации DataTable вы используете следующее:
"ajax": {
"url": tujuan,
"data": function(d) {
d.bagian = $('#bagian').val();
d.columns = [];
$('#table-list-serverside tfoot th input').each(function(index) {
var columnName = $(this).data('column-name');
d.columns[index] = {
data: columnName,
search: { value: this.value }
};
});
},
"type": "POST"
},
Убедитесь, что все поля ввода в нижнем колонтитуле имеют правильные индексы и что все данные передаются на сервер правильно. Например, если вы используете d.columns
для получения значений из нижнего колонтитула, убедитесь, что эти данные обрабатываются на сервере.
2. Обработка запроса на сервере
В вашем контроллере метод getDataSales
правильно обрабатывает входящие данные, но важно правильно извлечь значения для фильтрации из массива $_POST['columns']
. В данном случае:
$columns = $_POST['columns'];
Эти данные должны обрабатываться для фильтрации именно по тем колонкам, которые вы указали в вашем нижнем колонтитуле. Убедитесь, что название столбцов в JavaScript соответствует названиям в PHP:
if (!empty($search)) {
$sql .= " AND (`Tanggal` LIKE '%" . $DB2->escape_like_str($search) . "%'
OR `Nama Alokasi` LIKE '%" . $DB2->escape_like_str($search) . "%'
OR `Cabang` LIKE '%" .$DB2->escape_like_str($search). "%'";
}
Также удостоверьтесь, что $search
действительно содержит искомые значения и корректно обрабатывается.
3. Проверьте SQL-запрос
SQL-запрос, генерируемый в методе _get_data_query_alokasiSales
, должен корректно обрабатывать все фильтры. интерфейсы фильтрации, установленные на стороне клиента, должны согласовываться с условиями SQL. Проверьте, правильно ли формируется часть запроса, в котором добавляются условия для фильтрации.
4. Отладка
-
Добавьте отладочные сообщения на сервере, чтобы удостовериться, что данные, которые ожидаются, фактически приходят. Например, вы можете использовать
log_message
в CodeIgniter для записи информации о переменных в файл логов. -
Проверьте, вызывается ли ваш метод
count_filtered_data_alokasiSales
внутриgetDataTable_alokasiSales
. Если он не вызывается, это может означать, что фильтрация не происходит. -
Используйте консоль разработчика (F12) в браузере, чтобы отслеживать AJAX-запросы и проверять, какие данные отправляются на сервер, а какие возвращаются.
Заключение
Подводя итог, проверьте отправку данных на сервер, обработку этих данных в контроллере и корректную генерацию SQL-запросов для фильтрации. Часто неверное отображение данных вызвано нестыковками между клиентским и серверным кодом. Постепенное отладка и внесение изменений в код помогут вам выявить и устранить все возможные проблемы.