Фильтруйте записи с помощью средства выбора даты и времени

#ajax #codeigniter #datatable

Вопрос:

У меня есть цель, в которой мне нужно отфильтровать данные, используя диапазон дат с помощью средства выбора времени. Дело в том, что мне нужно показать результат моих отфильтрованных данных на основе того, что я выбрал в указанном диапазоне дат с помощью средства выбора времени, которое я указал ниже, и моей цели. Заранее большое вам спасибо.

введите описание изображения здесь

Число просмотров:

      <div class="card-body table-responsive py-3 px-3">
       
        
        <input type="text" id="demo" name="daterange" value="06/05/2021 - 06/06/2021" style="width:350px;">
        

                
         <button class="btn btn-success float-right" onclick="add_person()" data-dismiss="modal"><i class="glyphicon glyphicon-plus"></i> Add Person</button>
         
          <table id="table_account" class="table table-bordered table-hover" cellspacing="0">
            <thead>
            
                <tr>
                    <th>First Name</th>
                    <th>Last Name</th>  
                    <th>Username</th>
                    <th>Email</th>
                    <th>Mobile</th> 
                    <th>Role</th> 
                    <th>Status </th> 
<!--                     <th>File </th> -->
                    <th>Added By</th>
                    <th>Date Created</th>
                    <th>Date Updated</th>
                    <th>Updated By</th>              
                    <th style="width:100x;">Action</th>
                </tr>
            </thead>
            <tbody>
            
            </tbody>
 
            
         </table>
    </div>
        </script>
                
    
         
         
            <thead>
            
                <tr>
                    <th>First Name</th>
                    <th>Last Name</th>  
                    <th>Username</th>
                    <th>Email</th>
                    <th>Mobile</th> 
                    <th>Role</th> 
                    <th>Status </th> 
                    <th>Added By</th>
                    <th>Date Created</th>
                    <th>Date Updated</th>
                    <th>Updated By</th>              
                    <th style="width:100x;">Action</th>
                </tr>
            </thead>
            <tbody>
            
            </tbody>
 
            
         </table>
    </div>
 

Аякс:

   <script>
// first, put this at the top of your JS code.
let dateParams = {}

// update this with setting dataParams
$('#demo').daterangepicker({
  "timePicker": true,
  "timePicker24Hour": true,
  "startDate": "06/05/2021",
  "endDate": "06/06/2021",
  locale: {
    format: 'M/DD/YYYY hh:mm A'
  }
}, function(start, end, label) {

  // set the dateParam obj
  dateParams = {
   start: start.format('YYYY-MM-DD hh:mm'),
   end: end.format('YYYY-MM-DD hh:mm')
  }


   console.log('New date range selected: '   start.format('YYYY-MM-DD hh:mm')   ' to '   end.format('YYYY-MM-DD hh:mm')   ' (predefined range: '   start     end  ')');
});

$(document).ready(function() {
 
    //datatables
    table = $('#table_account').DataTable({ 
        dom: 'lBfrtip',
        buttons: [
            'print', 'csv', 'copy', 'excel', 'pdfHtml5'
        ],
       
        "processing": false, //Feature control the processing indicator.
        "serverSide": true, //Feature control DataTables' server-side processing mode.    
        "order": [], //Initial no order.
        
 
        // Load data for the table's content from an Ajax source
        "ajax": {
            "url": "<?php echo site_url('profile/ajax_list')?>",
             "type": "POST",
                "data": function (dateParams) {
                
                 return $.extend( { "start": dateParams.start,
        "end": dateParams.end,}, dateParams, {
       });
    },
         },
 
        //Set column definition initialization properties.
        "columnDefs": [
            { 
                "targets": [ 0 ], //first column
                "orderable": false, //set not orderable
            },
            { 
                "targets": [ -1 ], //last column
                "orderable": false, //set not orderable
            },
 
        ],
 
    });
   });
    
   setInterval( function () {
      table.ajax.reload(null,false);
}, 1000); 
    
</script>  
 

Controller:

  public function ajax_list()
        {
            
            
            $list = $this->profiles->get_datatables();
            $data = array();
            $no = $_POST['start'];
            foreach ($list as $person) {
                $no  ;
                $row = array();
                $row[] = $person->firstname;
                $row[] = $person->lastname;
                $row[] = $person->username;
                $row[] = $person->email;
                $row[] = $person->mobile;
                $row[] = $person->role; 
                $row[] = $person->status; 
                $row[] = $person->addedBy;                   
                $row[] = $person->dateCreated;  
                $row[] = $person->updatedBy;  
                $row[] = $person->dateUpdated;    
                //add html for action
                $row[] = '<a class="btn btn-sm btn-primary" href="javascript:void(0)" title="Edit" onclick="edit_person('."'".$person->userID."'".')"><i class="glyphicon glyphicon-pencil"></i> Edit</a>';
                
                $data[] = $row;
            }
            
            $output = array(
                "draw" => $_POST['draw'],
                "recordsTotal" => $this->profiles->count_all(),
                "recordsFiltered" => $this->profiles->count_filtered(),
                "data" => $data,
            );
            //output to json format
            echo json_encode($output);
        }
 

Модель:

   var $table = 'users';
    var $column_order = array(null,'userID','firstname','lastname','username','email','mobile','addedBy','dateCreated');
    var $order = array('userID' => 'desc');
    var $column_search = array('email','firstname','lastname','username','email','mobile','dateCreated');
    //set column field database for datatable orderable      //set column field database for datatable searchable just firstname , lastname , address are searchable     var $order = array('id' => 'desc'); // default order
    
    private function _get_datatables_query()
    {
        
        if($this->input->post('daterange')){
            
            $this->db->where('dateCreated >=', $this->input->post('start'));
            $this->db->where('dateCreated <=', $this->input->post('end'));
            
        }
//         $this->input->post('start'); // YYYY-mm-dd
//         $this->input->post('end'); // YYYY-mm-dd
        
        $this->db->from($this->table);
        
        $i = 0;
        
        foreach ($this->column_search as $item) // loop column
        {
            if($_POST['search']['value']) // if datatable send POST for search
            {
                
                if($i===0) // first loop
                {
                    $this->db->group_start(); // open bracket. query Where with OR clause better with bracket. because maybe can combine with other WHERE with AND.
                    $this->db->like($item, $_POST['search']['value']);
                }
                else
                {
                    $this->db->or_like($item, $_POST['search']['value']);
                }
                
                if(count($this->column_search) - 1 == $i) //last loop
                    $this->db->group_end(); //close bracket
            }
            $i  ;
        }
        
        if(isset($_POST['order'])) // here order processing
        {
            $this->db->order_by($this->column_order[$_POST['order']['0']['column']], $_POST['order']['0']['dir']);
        }
        else if(isset($this->order))
        {
            $order = $this->order;
            $this->db->order_by(key($order), $order[key($order)]);
        }
    }

   function get_datatables()
    {
        $this->_get_datatables_query();
        if($_POST['length'] != -1)
            $this->db->limit($_POST['length'], $_POST['start']);
            $query = $this->db->get();
            return $query->result();
    }
 

Ответ №1:

Чтобы подключить календарь к таблице вывода данных, отредактируйте свою daterangepicker инициализацию:

 // first, put this at the top of your JS code.
let dateParams = {}

// update this with setting dataParams
$('#demo').daterangepicker({
  "timePicker": true,
  "timePicker24Hour": true,
  "startDate": "06/05/2021",
  "endDate": "06/06/2021",
  locale: {
    format: 'M/DD hh:mm A'
  }
}, function(start, end, label) {

  // set the dateParam obj
  dataParams = {
   start: start.format('YYYY-MM-DD'),
   end: end.format('YYYY-MM-DD')
  }

  // reload the table 
  table.ajax.reload();

  //console.log('New date range selected: '   start.format('YYYY-MM-DD')   ' to '   end.format('YYYY-MM-DD')   ' (predefined range: '   label   ')');
});
 

В вашей настройке DataTable() измените свой ajax, чтобы передать даты начала и окончания

   "ajax": {
    "url": "<?php echo site_url('profile/ajax_list')?>",
     "type": "POST",
    "data": function ( d ) {
      // add this
      return $.extend( {}, d, {
        "start": dataParams.start,
        "end": dataParams.end
      });
      // could also be written: return $.extend( {}, d, dataParams);
    }
  }
 

Наконец, вам нужно будет найти это в своем приложении CI, чтобы вы могли выполнить поиск в своей базе данных.

 $this->input->post('start'); // YYYY-mm-dd
$this->input->post('end'); // YYYY-mm-dd
 

Тогда это просто ничтожество. Пожалуйста, переместитесь <table id="table_account" class="table table-bordered table-hover" cellspacing="0"> вправо над первым <thead> . Прямо сейчас между ними находится элемент datepicker. Возможно, это не имеет значения, но это должно быть исправлено.

https://datatables.net/reference/option/ajax

Комментарии:

1. Здравствуйте, я столкнулся с некоторыми ошибками при выполнении вашего предложения. Пожалуйста, посмотрите это. Спасибо. prnt.sc/14c7pv9

2. Сделайте это первым делом в теге вашего скрипта: пусть dateParams = {};

3. Я обновляю свои коды выше и получаю целевую дату начала и окончания с помощью журнала консоли. Однако данные, приведенные в таблице, остаются прежними после того, как я выбрал диапазон. Надеюсь, вы поможете мне больше, посмотрите результат моего журнала консоли prnt.sc/14h2nas

4. затем проверьте, чтобы убедиться, что вызов ajax выполняется в профиле/ajax_list, и убедитесь, что он отправляет даты начала и окончания в СООБЩЕНИИ. Вы можете просмотреть свой веб-инспектор (chrome) и перейти на вкладку сеть/XHR