Skip to content
Merged

2.8.14 #3443

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
2689d3e
Bump migration to 267 and add 2.8.13 tag migration
magicbug Apr 28, 2026
c3b895f
Suport bands from 23cm to 3cm
phl0 Apr 29, 2026
f137a2e
Handle band and prop_mode properly
phl0 Apr 29, 2026
d3c5cd4
SFLE SAT support fix
magicbug Apr 29, 2026
96eee63
Update upcoming_dxccs.php
magicbug Apr 29, 2026
4cfab6f
Add plugin system and Plugin Manager
magicbug Apr 29, 2026
264d6f0
Add plugin award menu and settings
magicbug Apr 29, 2026
d2d8123
Auto-disable plugins on runtime failures
magicbug Apr 29, 2026
fd49056
Enforce plugin read-only policy and show alerts
magicbug Apr 30, 2026
e6f6dd2
Disable caching for radio JSON; use $.ajax
magicbug May 1, 2026
7e40a02
Add resilient CAT polling with backoff and warnings
magicbug May 1, 2026
f5e4b0b
Add .env ignores; remove docs and examples
magicbug May 3, 2026
177f605
Add year filter to DXCC awards
magicbug May 3, 2026
e25714b
Update GMDX Summer Challenge to 2026
magicbug May 6, 2026
0413d8a
Refactor dashboard helpers and improve UX
magicbug May 7, 2026
1aff7dc
Make logbook header and table responsive
magicbug May 7, 2026
e896b60
Improve QSO view mobile responsiveness
magicbug May 8, 2026
397d321
Hide htmx loading indicator in dashboard
magicbug May 8, 2026
77cd614
Add skipCacheClear option to import
magicbug May 9, 2026
35354db
Check correct flag before clearing cache
magicbug May 9, 2026
0aaf722
Focus input after sending message
magicbug May 12, 2026
0fe9cf7
Defer input focus to next event loop
magicbug May 12, 2026
11ccec5
Add CW speaker sidetone and UI controls
magicbug May 14, 2026
d7da056
Enable Enter key to send sendText messages
magicbug May 14, 2026
7a54c05
Add CW sidetone volume and responsive layout
magicbug May 14, 2026
64c97e7
Add Winkey Relay support and settings UI
magicbug May 15, 2026
cc7593c
Add WinKey relay settings API and UI persistence
magicbug May 15, 2026
c27442d
Revamp Winkey macros modal layout
magicbug May 15, 2026
66e81bb
Add TEVEL2 satellites and migration
magicbug May 16, 2026
7c0c751
Add experimental Remote Operation feature
magicbug May 16, 2026
c9e0761
Persist remote operation secret to account
magicbug May 16, 2026
4f46268
Add microphone mute toggle to remote operation
magicbug May 16, 2026
769837c
Apply user remote_operation option and messaging
magicbug May 16, 2026
318d9a4
Prefer VUCC grids for gridsquare and coords
magicbug May 18, 2026
3ca30c1
Remove redundant qso['lng'] assignments
magicbug May 18, 2026
e7045f3
Support varying slp permission column names
magicbug May 21, 2026
320370e
Default winkey_websocket to false when unset
magicbug May 21, 2026
c02e0d7
Persist qso start_date in post-save defaults
magicbug May 25, 2026
c610e1e
Preserve satellite fields & save radio default
magicbug May 27, 2026
538f6cc
Clear selectPropagation when prop_mode empty
magicbug May 27, 2026
0e0244d
Resolve file path for Clublog uploads
magicbug May 28, 2026
5b3272e
Return upload status and report no Clublog QSOs
magicbug May 28, 2026
9057e13
Sync radio after post-save reset
magicbug May 28, 2026
9894c62
Retry radio sync after saving QSO
magicbug May 28, 2026
ab219e8
Prevent duplicate Escape handling and fix SAT reset
magicbug May 28, 2026
5f72af8
Prefer selected radio CAT over sat defaults
magicbug May 29, 2026
32dd9af
Normalize user_options and add defaults
magicbug Jun 1, 2026
764c61b
Add advanced search status and UI state persistence
magicbug Jun 1, 2026
42e6b8a
Bump migration to 271 and add tag 2.8.14
magicbug Jun 5, 2026
5ad7c2e
Merge origin/master into dev
Copilot Jun 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@
/application/config/config.php
/application/config/managed.php
/application/config/managed.sample.php
/.env
/PluginDirectory/.env
/application/cache/*
!/application/cache/index.html
!/application/cache/.htaccess
/application/logs/*.php
/application/plugins/*
!/application/plugins/index.html
/uploads/*.adi
/uploads/*.ADI
/uploads/*.tq8
Expand Down
2 changes: 1 addition & 1 deletion application/config/migration.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
|
*/

$config['migration_version'] = 267;
$config['migration_version'] = 271;

/*
|--------------------------------------------------------------------------
Expand Down
23 changes: 20 additions & 3 deletions application/controllers/Api.php
Original file line number Diff line number Diff line change
Expand Up @@ -1575,7 +1575,9 @@ function recent_qsos($public_slug = null, $limit = 10)
if ($row->COL_SRX_STRING) {
$qso['srx_string'] = $row->COL_SRX_STRING;
}
if ($row->COL_GRIDSQUARE) {
if ($row->COL_VUCC_GRIDS) {
$qso['gridsquare'] = $row->COL_VUCC_GRIDS;
} elseif ($row->COL_GRIDSQUARE) {
$qso['gridsquare'] = $row->COL_GRIDSQUARE;
}
if ($row->COL_QTH) {
Expand All @@ -1585,13 +1587,28 @@ function recent_qsos($public_slug = null, $limit = 10)
$qso['name'] = $row->COL_NAME;
}

// Prefer grid-derived coordinates for plotting, including VUCC multi-grid line/corner records.
$plot_latlng = false;
if (!empty($row->COL_VUCC_GRIDS)) {
$plot_latlng = $this->qralatlng($row->COL_VUCC_GRIDS);
} elseif (!empty($row->COL_GRIDSQUARE)) {
$plot_latlng = $this->qralatlng($row->COL_GRIDSQUARE);
}

if (is_array($plot_latlng) && count($plot_latlng) === 2) {
$qso['lat'] = $plot_latlng[0];
$qso['long'] = $plot_latlng[1];
}

$dxcc = $this->logbook_model->check_dxcc_table(strtoupper(trim(strtoupper($row->COL_CALL))), $row->COL_TIME_ON);
if (empty($dxcc[0])) {
$dxcc_id = null;
} else {
$qso['country'] = $dxcc[1];
$qso['lat'] = $dxcc[4];
$qso['long'] = $dxcc[5];
if (!isset($qso['lat']) || !isset($qso['long'])) {
$qso['lat'] = $dxcc[4];
$qso['long'] = $dxcc[5];
}
}

$qsos[] = $qso;
Expand Down
45 changes: 45 additions & 0 deletions application/controllers/Award.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,20 @@ function __construct()
public function index()
{
$this->load->model('awards_model');
$this->load->model('user_options_model');
$this->load->library('plugin_manager');

$data['user_awards'] = $this->awards_model->get_user_awards();
$data['plugin_award_entries'] = $this->plugin_manager->get_award_menu_entries();

$plugin_award_visibility = array();
$visibility_query = $this->user_options_model->get_options('plugin_awards_menu');
foreach ($visibility_query->result() as $option_row) {
if ($option_row->option_key === 'show') {
$plugin_award_visibility[$option_row->option_name] = (string)$option_row->option_value === '1';
}
}
$data['plugin_award_visibility'] = $plugin_award_visibility;

// Render Page
$data['page_title'] = "Award Settings";
Expand Down Expand Up @@ -58,4 +70,37 @@ public function deactivateall() {
echo json_encode(array('message' => 'OK'));
return;
}

public function savePluginAward() {
$plugin_slug = strtolower(trim((string)$this->security->xss_clean($this->input->post('plugin_slug'))));
$show_in_menu = trim((string)$this->security->xss_clean($this->input->post('show_in_menu')));

if (!preg_match('/^[a-z0-9_-]+$/', $plugin_slug)) {
header('Content-Type: application/json');
echo json_encode(array('message' => 'Invalid plugin slug'));
return;
}

$this->load->library('plugin_manager');
$entries = $this->plugin_manager->get_award_menu_entries();
$known_slugs = array();
foreach ($entries as $entry) {
$known_slugs[] = $entry['slug'];
}

if (!in_array($plugin_slug, $known_slugs, true)) {
header('Content-Type: application/json');
echo json_encode(array('message' => 'Plugin award entry not found'));
return;
}

$this->load->model('user_options_model');
$this->user_options_model->set_option('plugin_awards_menu', $plugin_slug, array(
'show' => $show_in_menu === '1' ? '1' : '0',
));

header('Content-Type: application/json');
echo json_encode(array('message' => 'OK'));
return;
}
}
69 changes: 36 additions & 33 deletions application/controllers/Awards.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ public function dxcc()

$data['worked_bands'] = $this->bands->get_worked_bands('dxcc'); // Used in the view for band select
$data['modes'] = $this->modes->active(); // Used in the view for mode select
$data['worked_years'] = $this->dxcc->get_worked_years(); // Used in the view for year select

if ($this->input->post('band') != NULL) { // Band is not set when page first loads.
if ($this->input->post('band') == 'All') { // Did the user specify a band? If not, use all bands
Expand Down Expand Up @@ -138,6 +139,7 @@ public function dxcc()
$postdata['Antarctica'] = $this->security->xss_clean($this->input->post('Antarctica'));
$postdata['band'] = $this->security->xss_clean($this->input->post('band'));
$postdata['mode'] = $this->security->xss_clean($this->input->post('mode'));
$postdata['year'] = $this->security->xss_clean($this->input->post('year'));
} else { // Setting default values at first load of page
$postdata['qsl'] = 1;
$postdata['lotw'] = 1;
Expand All @@ -155,6 +157,7 @@ public function dxcc()
$postdata['Antarctica'] = 1;
$postdata['band'] = 'All';
$postdata['mode'] = 'All';
$postdata['year'] = 'All';
}

$dxcclist = $this->dxcc->fetchdxcc($postdata);
Expand Down Expand Up @@ -813,51 +816,51 @@ public function gmdxsummer()
$this->load->model('gmdxsummer_model');

// Get Week 1
$data['week1_6m_cw'] = $this->gmdxsummer_model->get_week('2024-05-26 18:00:00', '6m', 'CW');
$data['week1_6m_ssb'] = $this->gmdxsummer_model->get_week_voice('2024-05-26 18:00:00', '6m');
$data['week1_6m_digital'] = $this->gmdxsummer_model->get_week_digital('2024-05-26 18:00:00', '6m');
$data['week1_6m_combined'] = $this->gmdxsummer_model->get_week_combined('2024-05-26 18:00:00', '6m');
$data['week1_6m_cw'] = $this->gmdxsummer_model->get_week('2026-05-24 18:00:00', '6m', 'CW');
$data['week1_6m_ssb'] = $this->gmdxsummer_model->get_week_voice('2026-05-24 18:00:00', '6m');
$data['week1_6m_digital'] = $this->gmdxsummer_model->get_week_digital('2026-05-24 18:00:00', '6m');
$data['week1_6m_combined'] = $this->gmdxsummer_model->get_week_combined('2026-05-24 18:00:00', '6m');


$data['week1_4m_cw'] = $this->gmdxsummer_model->get_week('2024-05-26 18:00:00', '4m', 'CW');
$data['week1_4m_ssb'] = $this->gmdxsummer_model->get_week_voice('2024-05-26 18:00:00', '4m');
$data['week1_4m_digital'] = $this->gmdxsummer_model->get_week_digital('2024-05-26 18:00:00', '4m');
$data['week1_4m_combined'] = $this->gmdxsummer_model->get_week_combined('2024-05-26 18:00:00', '4m');
$data['week1_4m_cw'] = $this->gmdxsummer_model->get_week('2026-05-24 18:00:00', '4m', 'CW');
$data['week1_4m_ssb'] = $this->gmdxsummer_model->get_week_voice('2026-05-24 18:00:00', '4m');
$data['week1_4m_digital'] = $this->gmdxsummer_model->get_week_digital('2026-05-24 18:00:00', '4m');
$data['week1_4m_combined'] = $this->gmdxsummer_model->get_week_combined('2026-05-24 18:00:00', '4m');

// Get Week 2
$data['week2_6m_cw'] = $this->gmdxsummer_model->get_week('2024-06-09 18:00:00', '6m', 'CW');
$data['week2_6m_ssb'] = $this->gmdxsummer_model->get_week_voice('2024-06-09 18:00:00', '6m');
$data['week2_6m_digital'] = $this->gmdxsummer_model->get_week_digital('2024-06-09 18:00:00', '6m');
$data['week2_6m_combined'] = $this->gmdxsummer_model->get_week_combined('2024-06-09 18:00:00', '6m');
$data['week2_6m_cw'] = $this->gmdxsummer_model->get_week('2026-06-07 18:00:00', '6m', 'CW');
$data['week2_6m_ssb'] = $this->gmdxsummer_model->get_week_voice('2026-06-07 18:00:00', '6m');
$data['week2_6m_digital'] = $this->gmdxsummer_model->get_week_digital('2026-06-07 18:00:00', '6m');
$data['week2_6m_combined'] = $this->gmdxsummer_model->get_week_combined('2026-06-07 18:00:00', '6m');


$data['week2_4m_cw'] = $this->gmdxsummer_model->get_week('2024-06-09 18:00:00', '4m', 'CW');
$data['week2_4m_ssb'] = $this->gmdxsummer_model->get_week_voice('2024-06-09 18:00:00', '4m');
$data['week2_4m_digital'] = $this->gmdxsummer_model->get_week_digital('2024-06-09 18:00:00', '4m');
$data['week2_4m_combined'] = $this->gmdxsummer_model->get_week_combined('2024-06-09 18:00:00', '4m');
$data['week2_4m_cw'] = $this->gmdxsummer_model->get_week('2026-06-07 18:00:00', '4m', 'CW');
$data['week2_4m_ssb'] = $this->gmdxsummer_model->get_week_voice('2026-06-07 18:00:00', '4m');
$data['week2_4m_digital'] = $this->gmdxsummer_model->get_week_digital('2026-06-07 18:00:00', '4m');
$data['week2_4m_combined'] = $this->gmdxsummer_model->get_week_combined('2026-06-07 18:00:00', '4m');


// Get Week 3
$data['week3_6m_cw'] = $this->gmdxsummer_model->get_week('2024-06-23 18:00:00', '6m', 'CW');
$data['week3_6m_ssb'] = $this->gmdxsummer_model->get_week_voice('2024-06-23 18:00:00', '6m');
$data['week3_6m_digital'] = $this->gmdxsummer_model->get_week_digital('2024-06-23 18:00:00', '6m');
$data['week3_6m_combined'] = $this->gmdxsummer_model->get_week_combined('2024-06-23 18:00:00', '6m');
$data['week3_6m_cw'] = $this->gmdxsummer_model->get_week('2026-06-21 18:00:00', '6m', 'CW');
$data['week3_6m_ssb'] = $this->gmdxsummer_model->get_week_voice('2026-06-21 18:00:00', '6m');
$data['week3_6m_digital'] = $this->gmdxsummer_model->get_week_digital('2026-06-21 18:00:00', '6m');
$data['week3_6m_combined'] = $this->gmdxsummer_model->get_week_combined('2026-06-21 18:00:00', '6m');

$data['week3_4m_cw'] = $this->gmdxsummer_model->get_week('2024-06-23 18:00:00', '4m', 'CW');
$data['week3_4m_ssb'] = $this->gmdxsummer_model->get_week_voice('2024-06-23 18:00:00', '4m');
$data['week3_4m_digital'] = $this->gmdxsummer_model->get_week_digital('2024-06-23 18:00:00', '4m');
$data['week3_4m_combined'] = $this->gmdxsummer_model->get_week_combined('2024-06-23 18:00:00', '4m');
$data['week3_4m_cw'] = $this->gmdxsummer_model->get_week('2026-06-21 18:00:00', '4m', 'CW');
$data['week3_4m_ssb'] = $this->gmdxsummer_model->get_week_voice('2026-06-21 18:00:00', '4m');
$data['week3_4m_digital'] = $this->gmdxsummer_model->get_week_digital('2026-06-21 18:00:00', '4m');
$data['week3_4m_combined'] = $this->gmdxsummer_model->get_week_combined('2026-06-21 18:00:00', '4m');

// Get Week 4
$data['week4_6m_cw'] = $this->gmdxsummer_model->get_week('2024-07-01 18:00:00', '6m', 'CW');
$data['week4_6m_ssb'] = $this->gmdxsummer_model->get_week_voice('2024-07-01 18:00:00', '6m');
$data['week4_6m_digital'] = $this->gmdxsummer_model->get_week_digital('2024-07-01 18:00:00', '6m');
$data['week4_6m_combined'] = $this->gmdxsummer_model->get_week_combined('2024-07-01 18:00:00', '6m');

$data['week4_4m_cw'] = $this->gmdxsummer_model->get_week('2024-07-01 18:00:00', '4m', 'CW');
$data['week4_4m_ssb'] = $this->gmdxsummer_model->get_week_voice('2024-07-01 18:00:00', '4m');
$data['week4_4m_digital'] = $this->gmdxsummer_model->get_week_digital('2024-07-01 18:00:00', '4m');
$data['week4_4m_combined'] = $this->gmdxsummer_model->get_week_combined('2024-07-01 18:00:00', '4m');
$data['week4_6m_cw'] = $this->gmdxsummer_model->get_week('2026-07-05 23:59:59', '6m', 'CW');
$data['week4_6m_ssb'] = $this->gmdxsummer_model->get_week_voice('2026-07-05 23:59:59', '6m');
$data['week4_6m_digital'] = $this->gmdxsummer_model->get_week_digital('2026-07-05 23:59:59', '6m');
$data['week4_6m_combined'] = $this->gmdxsummer_model->get_week_combined('2026-07-05 23:59:59', '6m');

$data['week4_4m_cw'] = $this->gmdxsummer_model->get_week('2026-07-05 23:59:59', '4m', 'CW');
$data['week4_4m_ssb'] = $this->gmdxsummer_model->get_week_voice('2026-07-05 23:59:59', '4m');
$data['week4_4m_digital'] = $this->gmdxsummer_model->get_week_digital('2026-07-05 23:59:59', '4m');
$data['week4_4m_combined'] = $this->gmdxsummer_model->get_week_combined('2026-07-05 23:59:59', '4m');


// Render page
Expand Down
27 changes: 21 additions & 6 deletions application/controllers/Clublog.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,15 @@ public function upload() {
$this->load->model('clublog_model');

$users = $this->clublog_model->get_clublog_users();
$uploaded_any_qsos = false;

foreach ($users as $user) {
$this->uploadUser($user->user_id, $user->user_clublog_name, $user->user_clublog_password);
$uploaded_any_qsos = $this->uploadUser($user->user_id, $user->user_clublog_name, $user->user_clublog_password) || $uploaded_any_qsos;
}

if (!$uploaded_any_qsos) {
echo 'Nothing awaiting upload to Clublog.' . "<br>";
log_message('info', 'Nothing awaiting upload to Clublog.');
}
}

Expand All @@ -31,7 +37,7 @@ function uploadUser($userid, $username, $password) {
if (!empty($clean_username) && !filter_var($clean_username, FILTER_VALIDATE_EMAIL)) {
echo "Error: Clublog username must be a valid email address. Clublog no longer accepts callsigns as usernames for " . $clean_username . "<br>";
log_message('error', 'Clublog upload failed for user ID ' . $clean_userid . ': invalid email format for username ' . $clean_username);
return;
return false;
}

$this->config->load('config');
Expand All @@ -48,6 +54,7 @@ function uploadUser($userid, $username, $password) {
$station_profiles = $this->clublog_model->all_with_count($clean_userid);

if($station_profiles->num_rows()){
$uploaded_for_user = false;
foreach ($station_profiles->result() as $station_row)
{
// Only process stations that have QSOs to upload
Expand All @@ -73,10 +80,13 @@ function uploadUser($userid, $username, $password) {
// Initialize the CURL request to Clublog's API endpoint
$request = curl_init('https://clublog.org/putlogs.php');

if($this->config->item('directory') != "") {
$filepath = $_SERVER['DOCUMENT_ROOT']."/".$this->config->item('directory')."/".$file_info['server_path'];
} else {
$filepath = $_SERVER['DOCUMENT_ROOT']."/".$file_info['server_path'];
$filepath = FCPATH . ltrim($file_info['server_path'], '/\\');
if (!file_exists($filepath) && !empty($this->config->item('directory'))) {
$document_root = rtrim((string)($_SERVER['DOCUMENT_ROOT'] ?? ''), '/\\');
$install_dir = trim((string)$this->config->item('directory'), '/\\');
if ($document_root !== '') {
$filepath = $document_root . '/' . $install_dir . '/' . ltrim($file_info['server_path'], '/\\');
}
}

if (function_exists('curl_file_create')) { // php 5.5+
Expand Down Expand Up @@ -112,6 +122,7 @@ function uploadUser($userid, $username, $password) {
// If Clublog Accepts mark the QSOs
if (preg_match('/\baccepted\b/', $response)) {
echo "QSOs uploaded and Logbook QSOs marked as sent to Clublog"."<br>";
$uploaded_for_user = true;

$this->load->model('clublog_model');
$this->clublog_model->mark_qsos_sent($station_row->station_id);
Expand Down Expand Up @@ -141,7 +152,11 @@ function uploadUser($userid, $username, $password) {
log_message('info', 'Nothing awaiting upload to clublog for '.$station_row->station_callsign);
}
}

return $uploaded_for_user;
}

return false;
}
}

Expand Down
12 changes: 10 additions & 2 deletions application/controllers/Dashboard.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public function __construct()
$this->load->model('user_model');
$this->load->model('logbook_model');
$this->load->model('logbooks_model');
$this->load->helper('dashboard');
}

public function index()
Expand Down Expand Up @@ -229,16 +230,23 @@ public function logbook_display_component() {
return;
}

$this->load->library('user_agent');

// Get Logbook Locations
$logbooks_locations_array = $this->logbooks_model->list_logbook_relationships($this->session->userdata('active_station_logbook'));

// Get the last 20 QSOs
$data['last_five_qsos'] = $this->logbook_model->get_last_qsos('20', $logbooks_locations_array);
// Show fewer rows on mobile to reduce dashboard noise.
$recent_qso_limit = $this->agent->is_mobile() ? '10' : '20';
$data['last_five_qsos'] = $this->logbook_model->get_last_qsos($recent_qso_limit, $logbooks_locations_array);
$this->load->view('components/dashboard_logbook_table', $data);
}

function radio_display_component()
{
if ($this->user_model->validate_session() == 0) {
return;
}

$this->load->model('cat');

$data['radio_status'] = $this->cat->recent_status();
Expand Down
8 changes: 8 additions & 0 deletions application/controllers/Lotw.php
Original file line number Diff line number Diff line change
Expand Up @@ -1157,7 +1157,15 @@ function lotw_satellite_map($satname) {
"INSPR7" => "INSPIRE-SAT 7",
"SONATE" => "SONATE-2",
'AO-123' => "ASRTU-1",
'TEV2-1' => "TEVEL2-1",
'TEV2-2' => "TEVEL2-2",
'TEV2-3' => "TEVEL2-3",
'TEV2-4' => "TEVEL2-4",
'TEV2-5' => "TEVEL2-5",
'TEV2-6' => "TEVEL2-6",
'TEV2-7' => "TEVEL2-7",
'TEV2-8' => "TEVEL2-8",
'TEV2-9' => "TEVEL2-9",
);

return array_search(strtoupper($satname),$arr,true);
Expand Down
41 changes: 41 additions & 0 deletions application/controllers/Plugin_awards.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

defined('BASEPATH') OR exit('No direct script access allowed');

class Plugin_awards extends CI_Controller {

public function __construct()
{
parent::__construct();

$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');
}

$this->load->library('plugin_manager');
}

public function view($slug = '')
{
$slug = strtolower(trim((string)$slug));
$result = $this->plugin_manager->render_award_page($slug);

if (!isset($result['ok']) || $result['ok'] !== true) {
$message = isset($result['message']) ? $result['message'] : 'Unable to load plugin award page.';
$this->session->set_flashdata('notice', $message);
redirect('awards');
return;
}

$data['page_title'] = $result['page_title'];
$data['plugin_award_title'] = $result['page_title'];
$data['plugin_award_content'] = $result['content'];
$data['plugin_award_slug'] = $result['plugin_slug'];

$this->load->view('interface_assets/header', $data);
$this->load->view('plugins/award_page', $data);
$this->load->view('interface_assets/footer');
}
}
Loading
Loading