From 84fbcaffb48bcefb5676829ab40d3b79c8baf873 Mon Sep 17 00:00:00 2001 From: Andreas <6977712+AndreasK79@users.noreply.github.com> Date: Sat, 4 Sep 2021 20:26:51 +0200 Subject: [PATCH] [DX Atlas Gridsquare Export] Got file export working. --- application/controllers/Dxatlas.php | 118 +++++++++++++---------- application/models/Dxatlas_model.php | 139 ++++++++++++++++++++++++++- 2 files changed, 205 insertions(+), 52 deletions(-) diff --git a/application/controllers/Dxatlas.php b/application/controllers/Dxatlas.php index 07c997df..4e4f11e1 100644 --- a/application/controllers/Dxatlas.php +++ b/application/controllers/Dxatlas.php @@ -11,9 +11,9 @@ class Dxatlas extends CI_Controller { if(!$this->user_model->authorize(99)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); } - $data['worked_bands'] = $this->dxcc->get_worked_bands(); // Used in the view for band select - $data['modes'] = $this->modes->active(); // Used in the view for mode select - $data['dxcc'] = $this->logbook_model->fetchDxcc(); // Used in the view for dxcc select + $data['worked_bands'] = $this->dxcc->get_worked_bands(); // Used in the view for band select + $data['modes'] = $this->modes->active(); // Used in the view for mode select + $data['dxcc'] = $this->logbook_model->fetchDxcc(); // Used in the view for dxcc select $data['page_title'] = "DX Atlas Gridsquare Export"; @@ -25,11 +25,6 @@ class Dxatlas extends CI_Controller { public function export() { - // Load Librarys - $this->load->library('qra'); - $this->load->helper('file'); - - // Load Database connections $this->load->model('dxatlas_model'); // Parameters @@ -42,63 +37,84 @@ class Dxatlas extends CI_Controller { $todate = $this->input->post('todate'); // Get QSOs with Valid QRAs - $qsos = $this->dxatlas_model->get_gridsquares($band, $mode, $dxcc, $cqz, $propagation, $fromdate, $todate); + $grids = $this->dxatlas_model->get_gridsquares($band, $mode, $dxcc, $cqz, $propagation, $fromdate, $todate); - $output = ""; - $output .= ""; + $this->generateFiles($grids['worked'], $grids['confirmed'], $band); + } - $output .= ""; + function generateFiles($wkdArray, $cfmArray, $band) { - foreach ($qsos->result() as $row) - { - $output .= ""; + $gridCfmArray = []; + $gridWkdArray = []; + $fieldCfmArray = []; + $fieldWkdArray = []; - if($row->COL_GRIDSQUARE != null) { - $stn_loc = $this->qra->qra2latlong($row->COL_GRIDSQUARE); + foreach ($cfmArray as $grid) { + $field = substr($grid, 0, 2); + if (!in_array($field, $fieldCfmArray)) { + $fieldCfmArray[] = $field; + } + $gridCfmArray[] = $grid; + } - $lat = $stn_loc[0]; - $lng = $stn_loc[1]; - } else { - $query = $this->db->query(' - SELECT * - FROM dxcc_entities - WHERE prefix = SUBSTRING( \''.$row->COL_CALL.'\', 1, LENGTH( prefix ) ) - ORDER BY LENGTH( prefix ) DESC - LIMIT 1 - '); - foreach ($query->result() as $dxcc) { - $lat = $dxcc->lat; - $lng = $dxcc->long; + foreach ($wkdArray as $grid) { + $field = substr($grid, 0, 2); + if (!in_array($field, $fieldCfmArray)) { + if (!in_array($field, $fieldWkdArray)) { + $fieldWkdArray[] = $field; } } - - $timestamp = strtotime($row->COL_TIME_ON); - - $output .= "".$row->COL_CALL.""; - $output .= "Date/Time: ".date('Y-m-d H:i:s', ($timestamp))."
Band: ".$row->COL_BAND."

]]>
"; - $output .= ""; - $output .= "".$lng.",".$lat.",0"; - $output .= ""; - $output .= "
"; + if (!in_array($grid, $gridCfmArray)) { + $gridWkdArray[] = $grid; + } } - $output .= "
"; - $output .= "
"; + $gridWkdString = ''; + $gridCfmString = ''; - if (!file_exists('kml')) { - mkdir('kml', 0755, true); + asort($gridWkdArray); + asort($gridCfmArray); + asort($fieldWkdArray); + asort($fieldCfmArray); + + foreach ($fieldWkdArray as $fields) { + $gridWkdString .= $fields . "\r\n"; } - if ( ! write_file('kml/qsos.kml', $output)) - { - echo 'Unable to write the file. Make sure the folder KML has write permissions.'; - } - else - { - header("Content-Disposition: attachment; filename=\"qsos.kml\""); - echo $output; + foreach ($gridWkdArray as $grids) { + $gridWkdString .= $grids . "\r\n"; } + foreach ($fieldCfmArray as $fields) { + $gridCfmString .= $fields . "\r\n"; + } + + foreach ($gridCfmArray as $grids) { + $gridCfmString .= $grids . "\r\n"; + } + + $this->makeZip($gridWkdString, $gridCfmString, $band); + } + + function makeZip($gridWkdString, $gridCfmString, $band) { + $zipFileName = $this->session->userdata('user_callsign') . '_'. $band . '.zip'; + // Prepare File + $file = tempnam("tmp", "zip"); + $zip = new ZipArchive(); + $zip->open($file, ZipArchive::OVERWRITE); + + // Stuff with content + $zip->addFromString($band . '_grids.wkd', $gridWkdString); + $zip->addFromString($band . '_grids.cfm', $gridCfmString); + + // Close and send to users + $zip->close(); + $length = filesize($file); + header('Content-Type: application/zip'); + header('Content-Length: ' . $length); + header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); + readfile($file); + unlink($file); } } diff --git a/application/models/Dxatlas_model.php b/application/models/Dxatlas_model.php index 8764ebbb..54b20157 100644 --- a/application/models/Dxatlas_model.php +++ b/application/models/Dxatlas_model.php @@ -35,7 +35,7 @@ class Dxatlas_model extends CI_Model /* * Fetches worked and confirmed gridsquare on each band and total */ - function get_gridsquares($data) { + function get_gridsquares($band, $mode, $dxcc, $cqz, $propagation, $fromdate, $todate) { $gridArray = $this->fetchGrids($band, $mode, $dxcc, $cqz, $propagation, $fromdate, $todate); if (isset($gridArray)) { @@ -45,5 +45,142 @@ class Dxatlas_model extends CI_Model } } + /* + * Builds the array to display worked/confirmed vucc on awward page + */ + function fetchGrids($band, $mode, $dxcc, $cqz, $propagation, $fromdate, $todate) { + // Getting all the worked grids + $col_gridsquare_worked = $this->get_grids($band, $mode, $dxcc, $cqz, $propagation, $fromdate, $todate, 'none'); + + $workedGridArray = array(); + foreach ($col_gridsquare_worked as $workedgrid) { + array_push($workedGridArray, $workedgrid['gridsquare']); + } + + $col_vucc_grids_worked = $this->get_grids_col_vucc($band, $mode, $dxcc, $cqz, $propagation, $fromdate, $todate, 'none'); + + foreach ($col_vucc_grids_worked as $gridSplit) { + $grids = explode(",", $gridSplit['col_vucc_grids']); + foreach($grids as $key) { + $grid_four = strtoupper(substr(trim($key),0,4)); + + if(!in_array($grid_four, $workedGridArray)){ + array_push($workedGridArray, $grid_four); + } + } + } + + // Getting all the confirmed grids + $col_gridsquare_confirmed = $this->get_grids($band, $mode, $dxcc, $cqz, $propagation, $fromdate, $todate, 'both'); + + $confirmedGridArray = array(); + foreach ($col_gridsquare_confirmed as $confirmedgrid) { + array_push($confirmedGridArray, $confirmedgrid['gridsquare']); + if(in_array($confirmedgrid['gridsquare'], $workedGridArray)){ + $index = array_search($confirmedgrid['gridsquare'],$workedGridArray); + unset($workedGridArray[$index]); + } + } + + $col_vucc_grids_confirmed = $this->get_grids_col_vucc($band, $mode, $dxcc, $cqz, $propagation, $fromdate, $todate, 'both'); + + foreach ($col_vucc_grids_confirmed as $gridSplit) { + $grids = explode(",", $gridSplit['col_vucc_grids']); + foreach($grids as $key) { + $grid_four = strtoupper(substr(trim($key),0,4)); + + if(!in_array($grid_four, $confirmedGridArray)){ + array_push($confirmedGridArray, $grid_four); + } + if(in_array($grid_four, $workedGridArray)){ + $index = array_search($grid_four,$workedGridArray); + unset($workedGridArray[$index]); + } + } + } + + $vuccArray['worked'] = $workedGridArray; + $vuccArray['confirmed'] = $confirmedGridArray; + + return $vuccArray; + } + + /* + * Gets the grid from col_vucc_grids + * $band = the band chosen + * $confirmationMethod - qsl, lotw or both, use anything else to skip confirmed + */ + function get_grids_col_vucc($band, $mode, $dxcc, $cqz, $propagation, $fromdate, $todate, $confirmationMethod) { + $station_id = $this->get_station_id(); + + $sql = "select col_vucc_grids + from " . $this->config->item('table_name') . + " where station_id =" . $station_id . + " and col_vucc_grids <> '' "; + + if ($confirmationMethod == 'both') { + $sql .= " and (col_qsl_rcvd='Y' or col_lotw_qsl_rcvd='Y')"; + } + else if ($confirmationMethod == 'qsl') { + $sql .= " and col_qsl_rcvd='Y'"; + } + else if ($confirmationMethod == 'lotw') { + $sql .= " and col_lotw_qsl_rcvd='Y'"; + } + + if ($band != 'All') { + if ($band == 'SAT') { + $sql .= " and col_prop_mode ='" . $band . "'"; + } else { + $sql .= " and col_prop_mode !='SAT'"; + $sql .= " and col_band ='" . $band . "'"; + } + } + + $query = $this->db->query($sql); + return $query->result_array(); + } + + /* + * Gets the grid from col_gridsquare + * $band = the band chosen + * $confirmationMethod - qsl, lotw or both, use anything else to skip confirmed + */ + function get_grids($band, $mode, $dxcc, $cqz, $propagation, $fromdate, $todate, $confirmationMethod) { + $station_id = $this->get_station_id(); + $sql = "select distinct upper(substring(col_gridsquare, 1, 4)) gridsquare + from " . $this->config->item('table_name') . + " where station_id =" . $station_id . + " and col_gridsquare <> ''"; + + if ($confirmationMethod == 'both') { + $sql .= " and (col_qsl_rcvd='Y' or col_lotw_qsl_rcvd='Y')"; + } + else if ($confirmationMethod == 'qsl') { + $sql .= " and col_qsl_rcvd='Y'"; + } + else if ($confirmationMethod == 'lotw') { + $sql .= " and col_lotw_qsl_rcvd='Y'"; + } + + if ($band != 'All') { + if ($band == 'SAT') { + $sql .= " and col_prop_mode ='" . $band . "'"; + } else { + $sql .= " and col_prop_mode !='SAT'"; + $sql .= " and col_band ='" . $band . "'"; + } + } + + $query = $this->db->query($sql); + + return $query->result_array(); + } + + function get_station_id() { + $CI =& get_instance(); + $CI->load->model('Stations'); + return $CI->Stations->find_active(); + } } ?>