Футер фильтра серверного режима datatable не может фильтровать.

Вопрос или проблема

Я пытаюсь сделать фильтр поиска в нижней части моей серверной таблицы данных, но когда я что-то ввожу, данные не отображаются.

Вот мой КОНТРОЛЛЕР.

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-запросов для фильтрации. Часто неверное отображение данных вызвано нестыковками между клиентским и серверным кодом. Постепенное отладка и внесение изменений в код помогут вам выявить и устранить все возможные проблемы.

Оцените материал
Добавить комментарий

Капча загружается...