kopia lustrzana https://github.com/magicbug/Cloudlog
Support added for uploading SSTV images against past QSOs
commit
ab8abd1ccc
|
@ -11,6 +11,7 @@
|
|||
/images/eqsl_card_images/*.jpg
|
||||
/updates/clublog_scp.txt
|
||||
/assets/qslcard/*
|
||||
/assets/sstvimages/*
|
||||
/assets/js/sections/custom.js
|
||||
.idea/*
|
||||
.DS_Store
|
||||
|
|
|
@ -22,7 +22,7 @@ $config['migration_enabled'] = TRUE;
|
|||
|
|
||||
*/
|
||||
|
||||
$config['migration_version'] = 174;
|
||||
$config['migration_version'] = 175;
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
|
@ -618,7 +618,9 @@ class Logbook extends CI_Controller {
|
|||
}
|
||||
|
||||
$this->load->model('Qsl_model');
|
||||
$this->load->model('Sstv_model');
|
||||
$data['qslimages'] = $this->Qsl_model->getQslForQsoId($id);
|
||||
$data['sstvimages'] = $this->Sstv_model->getSstvForQsoId($id);
|
||||
$data['primary_subdivision'] = $this->subdivisions->get_primary_subdivision_name($data['query']->result()[0]->COL_DXCC);
|
||||
$data['secondary_subdivision'] = $this->subdivisions->get_secondary_subdivision_name($data['query']->result()[0]->COL_DXCC);
|
||||
$data['max_upload'] = ini_get('upload_max_filesize');
|
||||
|
|
|
@ -0,0 +1,95 @@
|
|||
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
/*
|
||||
Controller for SSTV Images
|
||||
*/
|
||||
|
||||
class Sstv extends CI_Controller {
|
||||
|
||||
function __construct() {
|
||||
parent::__construct();
|
||||
$this->lang->load('qslcard');
|
||||
$this->load->model('user_model');
|
||||
if(!$this->user_model->authorize(2)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); }
|
||||
}
|
||||
|
||||
public function uploadSSTV() {
|
||||
$this->load->model('user_model');
|
||||
if(!$this->user_model->authorize(2)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); }
|
||||
|
||||
if (!file_exists('./assets/sstvimages')) {
|
||||
mkdir('./assets/sstvimages', 0755, true);
|
||||
}
|
||||
$qsoid = $this->input->post('qsoid');
|
||||
|
||||
$results = array();
|
||||
if (isset($_FILES['sstvimages']) && $_FILES['sstvimages']['error'][0] == 0)
|
||||
{
|
||||
for($i=0; $i<count($_FILES['sstvimages']['name']); $i++) {
|
||||
$file = array(
|
||||
'name' => $_FILES['sstvimages']['name'][$i],
|
||||
'type' => $_FILES['sstvimages']['type'][$i],
|
||||
'tmp_name' => $_FILES['sstvimages']['tmp_name'][$i],
|
||||
'error' => $_FILES['sstvimages']['error'][$i],
|
||||
'size' => $_FILES['sstvimages']['size'][$i]
|
||||
);
|
||||
$result = $this->uploadSSTVImage($qsoid, $file);
|
||||
array_push($results, $result);
|
||||
}
|
||||
}
|
||||
|
||||
header("Content-type: application/json");
|
||||
echo json_encode($results);
|
||||
}
|
||||
|
||||
function uploadSSTVImage($qsoid, $file) {
|
||||
$config['upload_path'] = './assets/sstvimages';
|
||||
$config['allowed_types'] = 'jpg|gif|png|jpeg|JPG|PNG|bmp';
|
||||
$array = explode(".", $file['name']);
|
||||
$ext = end($array);
|
||||
$config['file_name'] = $qsoid . '.sstv.' . '_' . time() . '.' . $ext;
|
||||
|
||||
$this->load->library('upload', $config);
|
||||
|
||||
$_FILES['sstvimage'] = $file;
|
||||
if ( ! $this->upload->do_upload('sstvimage')) {
|
||||
// Upload of SSTV image Failed
|
||||
$error = array('error' => $this->upload->display_errors());
|
||||
|
||||
return $error;
|
||||
}
|
||||
else {
|
||||
// Load database queries
|
||||
$this->load->model('Sstv_model');
|
||||
|
||||
//Upload of SSTV image was successful
|
||||
$data = $this->upload->data();
|
||||
|
||||
// Now we need to insert info into database about file
|
||||
$filename = $data['file_name'];
|
||||
$insertid = $this->Sstv_model->saveSstvImages($qsoid, $filename);
|
||||
|
||||
$result['status'] = 'Success';
|
||||
$result['insertid'] = $insertid;
|
||||
$result['filename'] = $filename;
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Deletes SSTV Image
|
||||
public function delete() {
|
||||
$this->load->model('user_model');
|
||||
if(!$this->user_model->authorize(2)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); }
|
||||
|
||||
$id = $this->input->post('id');
|
||||
$this->load->model('Sstv_model');
|
||||
|
||||
$path = './assets/sstvimages/';
|
||||
$file = $this->Sstv_model->getSSTVFilename($id)->row();
|
||||
$filename = $file->filename;
|
||||
unlink($path.$filename);
|
||||
|
||||
$this->Sstv_model->deleteSstv($id);
|
||||
}
|
||||
}
|
|
@ -74,6 +74,10 @@ $lang['general_word_invalid_ignore'] = 'Invalid (Ignore)';
|
|||
$lang['general_word_qslcard'] = 'QSL Card';
|
||||
$lang['general_word_qslcard_management'] = 'QSL Management';
|
||||
$lang['general_word_qslcards'] = 'QSL Cards';
|
||||
$lang['general_word_sstv_management'] = 'SSTV Management';
|
||||
$lang['general_word_sstvimages'] = 'SSTV Images';
|
||||
$lang['general_sstv_upload'] = 'Uploaded SSTV images';
|
||||
$lang['general_sstv_upload_button'] = 'Upload SSTV image(s)';
|
||||
$lang['general_word_qslcard_direct'] = 'Direct';
|
||||
$lang['general_word_qslcard_bureau'] = 'Bureau';
|
||||
$lang['general_word_qslcard_electronic'] = 'Electronic';
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
defined('BASEPATH') OR exit('No direct script access allowed');
|
||||
|
||||
class Migration_add_sstv_images_table extends CI_Migration {
|
||||
|
||||
public function up()
|
||||
{
|
||||
$this->dbforge->add_field(array(
|
||||
'id' => array(
|
||||
'type' => 'INT',
|
||||
'constraint' => 5,
|
||||
'unsigned' => TRUE,
|
||||
'auto_increment' => TRUE
|
||||
),
|
||||
'qsoid' => array(
|
||||
'type' => 'VARCHAR',
|
||||
'constraint' => '250',
|
||||
),
|
||||
'filename' => array(
|
||||
'type' => 'VARCHAR',
|
||||
'constraint' => '250',
|
||||
),
|
||||
'modified' => array(
|
||||
'type' => 'timestamp',
|
||||
'null' => TRUE,
|
||||
),
|
||||
));
|
||||
$this->dbforge->add_key('id', TRUE);
|
||||
$this->dbforge->create_table('sstv_images');
|
||||
}
|
||||
|
||||
public function down()
|
||||
{
|
||||
echo "not possible";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
<?php
|
||||
class Sstv_model extends CI_Model
|
||||
{
|
||||
|
||||
function saveSstvImages($qsoid, $filename)
|
||||
{
|
||||
// Clean ID
|
||||
$clean_id = $this->security->xss_clean($qsoid);
|
||||
|
||||
// be sure that QSO belongs to user
|
||||
$CI = &get_instance();
|
||||
$CI->load->model('logbook_model');
|
||||
if (!$CI->logbook_model->check_qso_is_accessible($clean_id)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$data = array(
|
||||
'qsoid' => $clean_id,
|
||||
'filename' => $filename
|
||||
);
|
||||
|
||||
$this->db->insert('sstv_images', $data);
|
||||
|
||||
return $this->db->insert_id();
|
||||
}
|
||||
|
||||
function getSSTVFilename($id)
|
||||
{
|
||||
// Clean ID
|
||||
$clean_id = $this->security->xss_clean($id);
|
||||
|
||||
// be sure that QSO belongs to user
|
||||
$CI = &get_instance();
|
||||
$CI->load->model('logbook_model');
|
||||
$this->db->select('qsoid');
|
||||
$this->db->from('sstv_images');
|
||||
$this->db->where('id', $clean_id);
|
||||
$qsoid = $this->db->get()->row()->qsoid;
|
||||
if (!$CI->logbook_model->check_qso_is_accessible($qsoid)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->db->select('filename');
|
||||
$this->db->from('sstv_images');
|
||||
$this->db->where('id', $clean_id);
|
||||
|
||||
return $this->db->get();
|
||||
}
|
||||
|
||||
|
||||
function deleteSstv($id)
|
||||
{
|
||||
// Clean ID
|
||||
$clean_id = $this->security->xss_clean($id);
|
||||
|
||||
// be sure that QSO belongs to user
|
||||
$CI = &get_instance();
|
||||
$CI->load->model('logbook_model');
|
||||
$this->db->select('qsoid');
|
||||
$this->db->from('sstv_images');
|
||||
$this->db->where('id', $clean_id);
|
||||
$qsoid = $this->db->get()->row()->qsoid;
|
||||
if (!$CI->logbook_model->check_qso_is_accessible($qsoid)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Delete Mode
|
||||
$this->db->delete('sstv_images', array('id' => $clean_id));
|
||||
}
|
||||
|
||||
|
||||
function getSstvForQsoId($id)
|
||||
{
|
||||
// Clean ID
|
||||
$clean_id = $this->security->xss_clean($id);
|
||||
|
||||
// be sure that QSO belongs to user
|
||||
$CI = &get_instance();
|
||||
$CI->load->model('logbook_model');
|
||||
if (!$CI->logbook_model->check_qso_is_accessible($clean_id)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->db->select('*');
|
||||
$this->db->from('sstv_images');
|
||||
$this->db->where('qsoid', $clean_id);
|
||||
|
||||
return $this->db->get()->result();
|
||||
}
|
||||
|
||||
}
|
|
@ -2535,6 +2535,67 @@ if ($this->session->userdata('user_id') != null) {
|
|||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<script>
|
||||
function viewSstv(picture) {
|
||||
var baseURL = "<?php echo base_url(); ?>";
|
||||
var $textAndPic = $('<div></div>');
|
||||
$textAndPic.append('<center><img class="img-fluid w-qsl" style="height:auto;width:auto;"src="' + baseURL + '/assets/sstvimages/' + picture + '" /><center>');
|
||||
title = 'SSTV Image';
|
||||
|
||||
BootstrapDialog.show({
|
||||
title: title,
|
||||
size: BootstrapDialog.SIZE_WIDE,
|
||||
message: $textAndPic,
|
||||
buttons: [{
|
||||
label: lang_admin_close,
|
||||
action: function(dialogRef) {
|
||||
dialogRef.close();
|
||||
}
|
||||
}]
|
||||
});
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
function deleteSstv(id) {
|
||||
BootstrapDialog.confirm({
|
||||
title: 'DANGER',
|
||||
message: 'Warning! Are you sure you want to delete this SSTV Image?',
|
||||
type: BootstrapDialog.TYPE_DANGER,
|
||||
closable: true,
|
||||
draggable: true,
|
||||
btnOKClass: 'btn-danger',
|
||||
callback: function(result) {
|
||||
if (result) {
|
||||
var baseURL = "<?php echo base_url(); ?>";
|
||||
$.ajax({
|
||||
url: baseURL + 'index.php/sstv/delete',
|
||||
type: 'post',
|
||||
data: {
|
||||
'id': id
|
||||
},
|
||||
success: function(data) {
|
||||
// remove selected sstv image from table
|
||||
$("#" + id).parent("tr:first").remove();
|
||||
|
||||
// remove sstv image from carousel
|
||||
$("#sstvCarouselIndicators .carousel-indicators li:last-child").remove();
|
||||
$("#sstvCarouselIndicators .carouselimageid_" + id).remove();
|
||||
$('#sstvCarouselIndicators').find('.carousel-item').first().addClass('active');
|
||||
|
||||
// remove table and hide tab if all sstv images are deleted
|
||||
if ($('.sstvtable tr').length == 1) {
|
||||
$('.sstvtable').remove();
|
||||
$('.sstvimagetab').attr('hidden', '');
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<script>
|
||||
function viewEqsl(picture, callsign) {
|
||||
var baseURL = "<?php echo base_url(); ?>";
|
||||
|
@ -2686,6 +2747,75 @@ if ($this->session->userdata('user_id') != null) {
|
|||
}
|
||||
});
|
||||
}
|
||||
function uploadSSTV() {
|
||||
var baseURL = "<?php echo base_url(); ?>";
|
||||
var formdata = new FormData(document.getElementById("sstvinfo"));
|
||||
|
||||
$.ajax({
|
||||
url: baseURL + 'index.php/sstv/uploadsstv',
|
||||
type: 'post',
|
||||
data: formdata,
|
||||
enctype: 'multipart/form-data',
|
||||
processData: false,
|
||||
contentType: false,
|
||||
success: function(data) {
|
||||
data.forEach((sstvImage) => {
|
||||
if (sstvImage.status == 'Success') {
|
||||
// Check if the table exists, if it does we'll update it, if not, we'll create it
|
||||
if ($('.sstvtable').length > 0) {
|
||||
// Update table on Manage SSTV Image tab
|
||||
$('.sstvtable tr:last').after('<tr><td style="text-align: center">' + sstvImage.filename + '</td>' +
|
||||
'<td id="' + sstvImage.insertid + '"style="text-align: center"><button onclick="deleteSstv(' + sstvImage.insertid + ');" class="btn btn-sm btn-danger">Delete</button></td>' +
|
||||
'<td style="text-align: center"><button onclick="viewSstv(\'' + sstvImage.filename + '\')" class="btn btn-sm btn-success">View</button></td>' +
|
||||
'</tr>');
|
||||
|
||||
// Update SSTV Image carousel
|
||||
var quantity = $("#sstv-carousel-indicators").length;
|
||||
$("#sstvCarouselIndicators .sstv-carousel-indicators").append('<li data-bs-target="#sstvCarouselIndicators" data-bs-slide-to="' + quantity + '"></li>');
|
||||
$("#sstvCarouselIndicators .carousel-inner").append('<center><div class="carousel-item carouselimageid_' + sstvImage.insertid + '"><img class="img-fluid w-qsl" src="' + baseURL + '/assets/sstvimages/' + sstvImage.filename + '" alt="SSTV picture #' + (quantity + 1) + '"></div></center>');
|
||||
|
||||
// Initialize the bootstrap image carousel
|
||||
$("#sstvCarouselIndicators").carousel();
|
||||
|
||||
// Reset the image input
|
||||
$("#sstvimages").val(null);
|
||||
} else {
|
||||
// Create table on Manage SSTV Image tab
|
||||
$("#sstvupload").prepend('<table style="width:100%" class="sstvtable table table-sm table-bordered table-hover table-striped table-condensed">' +
|
||||
'<thead>' +
|
||||
'<tr>' +
|
||||
'<th style="text-align: center">SSTV image file</th>' +
|
||||
'<th style="text-align: center"></th>' +
|
||||
'<th style="text-align: center"></th>' +
|
||||
'</tr>' +
|
||||
'</thead><tbody>' +
|
||||
'<tr><td style="text-align: center">' + sstvImage.filename + '</td>' +
|
||||
'<td id="' + sstvImage.insertid + '"style="text-align: center"><button onclick="deleteSstv(' + sstvImage.insertid + ');" class="btn btn-sm btn-danger">Delete</button></td>' +
|
||||
'<td style="text-align: center"><button onclick="viewSstv(\'' + sstvImage.filename + '\')" class="btn btn-sm btn-success">View</button></td>' +
|
||||
'</tr>' +
|
||||
'</tbody></table>');
|
||||
|
||||
// Make the SSTV image tab visible by remvoving the hidden attribute
|
||||
$('.sstvimagetab').removeAttr('hidden');
|
||||
|
||||
// Create SSTV Image carousel
|
||||
var quantity = $("#sstv-carousel-indicators").length;
|
||||
$("#sstv-carousel-indicators").append('<li class="active" data-bs-target="#sstvCarouselIndicators" data-bs-slide-to="' + quantity + '" />');
|
||||
$("#sstv-carousel-inner").append('<center><div class="active carousel-item carouselimageid_' + sstvImage.insertid + '"><img class="img-fluid w-qsl" src="' + baseURL + '/assets/sstvimages/' + sstvImage.filename + '" alt="SSTV picture #' + (quantity + 1) + '"></div></center>');
|
||||
|
||||
// Initialize the bootstrap carousel
|
||||
$("#sstvCarouselIndicators").carousel();
|
||||
}
|
||||
|
||||
} else if (sstvImage.status != '') {
|
||||
$("#sstvupload").append('<div class="alert alert-danger">SSTV Image:' +
|
||||
sstvImage.error +
|
||||
'</div>');
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function uploadQsl() {
|
||||
var baseURL = "<?php echo base_url(); ?>";
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
<div id="sstvCarouselIndicators" class="carousel slide" data-bs-ride="carousel">
|
||||
<ol class="carousel-indicators" id="sstv-carousel-indicators">
|
||||
<?php
|
||||
$i = 0;
|
||||
foreach ($sstvimages as $image) {
|
||||
echo '<li data-bs-target="#sstvCarouselIndicators" data-bs-slide-to="' . $i . '"';
|
||||
if ($i == 0) {
|
||||
echo 'class="active"';
|
||||
}
|
||||
$i++;
|
||||
echo '></li>';
|
||||
}
|
||||
?>
|
||||
</ol>
|
||||
<div id="sstv-carousel-inner" class="carousel-inner">
|
||||
|
||||
<?php
|
||||
$i = 1;
|
||||
foreach ($sstvimages as $image) {
|
||||
echo '<div class="text-center carousel-item carouselimageid_' . $image->id;
|
||||
if ($i == 1) {
|
||||
echo ' active';
|
||||
}
|
||||
echo '">';
|
||||
echo '<img class="img-fluid w-qsl" src="' . base_url() . '/assets/sstvimages/' . $image->filename .'" alt="SSTV picture #'. $i++.'">';
|
||||
echo '</div>';
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
<a class="carousel-control-prev" href="#sstvCarouselIndicators" role="button" data-bs-slide="prev">
|
||||
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
|
||||
<span class="visually-hidden">Previous</span>
|
||||
</a>
|
||||
<a class="carousel-control-next" href="#sstvCarouselIndicators" role="button" data-bs-slide="next">
|
||||
<span class="carousel-control-next-icon" aria-hidden="true"></span>
|
||||
<span class="visually-hidden">Next</span>
|
||||
</a>
|
||||
</div>
|
|
@ -30,6 +30,22 @@
|
|||
</li>';
|
||||
}
|
||||
|
||||
?>
|
||||
<?php
|
||||
if (($this->config->item('use_auth')) && ($this->session->userdata('user_type') >= 2) && ($row->COL_MODE == 'SSTV')) {
|
||||
echo '<li ';
|
||||
if (count($sstvimages) == 0) {
|
||||
echo 'hidden ';
|
||||
}
|
||||
echo 'class="sstvimagetab nav-item">
|
||||
<a class="nav-link" id="sstvtab" data-bs-toggle="tab" href="#sstvimage" role="tab" aria-controls="home" aria-selected="false">'. lang('general_word_sstvimages') .'</a>
|
||||
</li>';
|
||||
|
||||
echo '<li class="nav-item">
|
||||
<a class="nav-link" id="sstvmanagementtab" data-bs-toggle="tab" href="#sstvupload" role="tab" aria-controls="home" aria-selected="false">'. lang('general_word_sstv_management') .'</a>
|
||||
</li>';
|
||||
}
|
||||
|
||||
?>
|
||||
<?php
|
||||
if (($this->config->item('use_auth')) && ($this->session->userdata('user_type') >= 2)) {
|
||||
|
@ -554,6 +570,45 @@
|
|||
<?php
|
||||
if (($this->config->item('use_auth')) && ($this->session->userdata('user_type') >= 2)) {
|
||||
?>
|
||||
<div class="tab-pane fade" id="sstvupload" role="tabpanel" aria-labelledby="table-tab">
|
||||
<?php
|
||||
if (count($sstvimages) > 0) {
|
||||
echo '<table style="width:100%" class="sstvtable table table-sm table-bordered table-hover table-striped table-condensed">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style=\'text-align: center\'>SSTV image file</th>
|
||||
<th style=\'text-align: center\'></th>
|
||||
<th style=\'text-align: center\'></th>
|
||||
</tr>
|
||||
</thead><tbody>';
|
||||
|
||||
foreach ($sstvimages as $sstv) {
|
||||
echo '<tr>';
|
||||
echo '<td style=\'text-align: center\'>' . $sstv->filename . '</td>';
|
||||
echo '<td id="'.$sstv->id.'" style=\'text-align: center\'><button onclick="deleteSstv('.$sstv->id.')" class="btn btn-sm btn-danger">Delete</button></td>';
|
||||
echo '<td style=\'text-align: center\'><button onclick="viewSstv(\''.$sstv->filename.'\')" class="btn btn-sm btn-success">View</button></td>';
|
||||
echo '</tr>';
|
||||
}
|
||||
|
||||
echo '</tbody></table>';
|
||||
}
|
||||
?>
|
||||
<p><div class="alert alert-warning" role="alert"><span class="badge text-bg-warning"><?php echo lang('general_word_warning'); ?></span><?php echo lang('gen_max_file_upload_size'); ?> <?php echo $max_upload; ?>B.</div></p>
|
||||
<form class="form" id="sstvinfo" name="sstvinfo" enctype="multipart/form-data">
|
||||
<div class="row">
|
||||
<div class="col-md">
|
||||
<fieldset>
|
||||
<div class="mb-3">
|
||||
<label for="sstvimages"><?php echo lang('general_sstv_upload'); ?></label>
|
||||
<input class="form-control" type="file" id="sstvimages" name="sstvimages[]" accept="image/*" multiple>
|
||||
</div>
|
||||
<input type="hidden" class="form-control" id="qsoinputid" name="qsoid" value="<?php echo $row->COL_PRIMARY_KEY; ?>">
|
||||
<button type="button" onclick="uploadSSTV();" id="button2id" name="button2id" class="btn btn-primary"><?php echo lang('general_sstv_upload_button'); ?></button>
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="qslupload" role="tabpanel" aria-labelledby="table-tab">
|
||||
<?php
|
||||
if (count($qslimages) > 0) {
|
||||
|
@ -631,6 +686,11 @@
|
|||
<?php $this->load->view('qslcard/qslcarousel', $qslimages); ?>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="tab-pane fade" id="sstvimage" role="tabpanel" aria-labelledby="table-tab">
|
||||
<?php $this->load->view('sstv/sstvcarousel', $sstvimages); ?>
|
||||
</div>
|
||||
|
||||
<div class="tab-pane fade" id="eqslcard" role="tabpanel" aria-labelledby="table-tab">
|
||||
<?php
|
||||
if ($row->eqsl_image_file != null) {
|
||||
|
|
Ładowanie…
Reference in New Issue