cloudlog/application/controllers/Options.php
Peter Goodhall e34afd51eb Allow partial option saves and surface save errors
Change success logic in Options controller to treat the save as successful if any individual option update persisted (use OR instead of AND), preventing a single-failure from marking the whole operation as failed. Fix Options_model to return TRUE after inserting a new option so inserts are reported as successful. Add a saveFailed flash message display in the email options view so users see explicit failure alerts when appropriate.
2026-04-26 18:04:58 +01:00

534 lines
20 KiB
PHP

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
Handles Displaying of information for station tools.
*/
class Options extends CI_Controller {
function __construct()
{
parent::__construct();
$this->load->helper(array('form', 'url'));
$this->load->model('user_model');
if(!$this->user_model->authorize(99)) { $this->session->set_flashdata('notice', 'You\'re not allowed to do that!'); redirect('dashboard'); }
// Note: Managed deployments may hide specific subsections (e.g. registration)
// but should still allow access to the Options area in general.
// Load language files
$this->lang->load(array(
'options',
));
}
// Default /options view just gives some text to explain the options area
function index() {
//echo $this->config->item('option_theme');
//echo $this->optionslib->get_option('theme');
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$this->load->view('interface_assets/header', $data);
$this->load->view('options/index');
$this->load->view('interface_assets/footer');
}
// function used to display the /appearance url
function appearance() {
// Get Language Options
$directory = 'application/language';
$data['language_options'] = array_diff(scandir($directory), array('..', '.'));
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$data['sub_heading'] = $this->lang->line('options_appearance');
$this->load->model('Themes_model');
$data['themes'] = $this->Themes_model->getThemes();
$this->load->view('interface_assets/header', $data);
$this->load->view('options/appearance');
$this->load->view('interface_assets/footer');
}
// Registration options
function registration() {
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$data['sub_heading'] = $this->lang->line('options_registration');
// If open registration is managed-disabled, keep page hidden
if ($this->config->item('disable_open_registration')) {
$this->session->set_flashdata('notice', 'This setting is managed and cannot be changed.');
redirect('options');
}
$this->load->view('interface_assets/header', $data);
$this->load->view('options/registration');
$this->load->view('interface_assets/footer');
}
function registration_save() {
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$data['sub_heading'] = $this->lang->line('options_registration');
if ($this->config->item('disable_open_registration')) {
$this->session->set_flashdata('notice', 'This setting is managed and cannot be changed.');
redirect('/options');
return;
}
// Save the open registration option
$open_registration = $this->input->post('open_registration');
$update = $this->optionslib->update('open_registration', $open_registration, 'yes');
if ($update == TRUE) {
$this->session->set_flashdata('success', $this->lang->line('options_registration_settings_saved'));
}
redirect('/options/registration');
}
// Handles saving the appreance options to the options system.
function appearance_save() {
// Get Language Options
$directory = 'application/language';
$data['language_options'] = array_diff(scandir($directory), array('..', '.'));
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$data['sub_heading'] = $this->lang->line('options_appearance');
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
$this->form_validation->set_rules('theme', 'theme', 'required');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('interface_assets/header', $data);
$this->load->view('options/appearance');
$this->load->view('interface_assets/footer');
}
else
{
// Track if any updates were successful
$any_update_successful = FALSE;
// Update theme choice within the options system
$theme_update_status = $this->optionslib->update('theme', $this->input->post('theme'), 'yes');
if($theme_update_status == TRUE) {
$any_update_successful = TRUE;
}
// Update global search choice within the options system
$search_update_status = $this->optionslib->update('global_search', $this->input->post('globalSearch'));
if($search_update_status == TRUE) {
$any_update_successful = TRUE;
}
// Update dashboard banner within the options system
$dasboard_banner_update_status = $this->optionslib->update('dashboard_banner', $this->input->post('dashboardBanner'), 'yes');
if($dasboard_banner_update_status == TRUE) {
$any_update_successful = TRUE;
}
// Update dashboard map within the options system
$dashboard_map_update_status = $this->optionslib->update('dashboard_map', $this->input->post('dashboardMap'), 'yes');
if($dashboard_map_update_status == TRUE) {
$any_update_successful = TRUE;
}
// Update logbook map within the options system
$logbook_map_update_status = $this->optionslib->update('logbook_map', $this->input->post('logbookMap'), 'yes');
if($logbook_map_update_status == TRUE) {
$any_update_successful = TRUE;
}
// If any update was successful, show a single success message
if($any_update_successful == TRUE) {
$this->session->set_flashdata('success', $this->lang->line('options_appearance_settings_saved'));
}
// Update Lang choice within the options system
// $lang_update_status = $this->optionslib->update('language', $this->input->post('language'));
// If Lang update is complete set a flashsession with a success note
// if($lang_update_status == TRUE) {
// $this->session->set_flashdata('success', 'Language changed to '.ucfirst($this->input->post('language')));
// }
// Redirect back to /appearance
redirect('/options/appearance');
}
}
// function used to display the /dxcluster url
function dxcluster() {
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$data['sub_heading'] = $this->lang->line('options_dxcluster_settings');
$this->load->view('interface_assets/header', $data);
$this->load->view('options/dxcluster');
$this->load->view('interface_assets/footer');
}
// Handles saving the DXCluster options to the options system.
function dxcluster_save() {
// Get Language Options
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$data['sub_heading'] = $this->lang->line('options_dxcluster_settings');
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
$this->form_validation->set_rules('dxcache_url', 'URL of DXCache', 'valid_url');
$this->form_validation->set_rules('dxcluster_maxage', 'Max Age of Spots', 'required');
$this->form_validation->set_rules('dxcluster_decont', 'de continent', 'required');
if ($this->form_validation->run() == FALSE) {
$this->load->view('interface_assets/header', $data);
$this->load->view('options/dxcluster');
$this->load->view('interface_assets/footer');
} else {
$dxcluster_decont_update = $this->optionslib->update('dxcluster_decont', $this->input->post('dxcluster_decont'), 'yes');
if($dxcluster_decont_update == TRUE) {
$this->session->set_flashdata('success', $this->lang->line('options_dxcluster_decont_changed_to').$this->input->post('dxcluster_decont'));
}
$dxcluster_maxage_update = $this->optionslib->update('dxcluster_maxage', $this->input->post('dxcluster_maxage'), 'yes');
if($dxcluster_maxage_update == TRUE) {
$this->session->set_flashdata('success', $this->lang->line('options_dxcluster_maxage_changed_to').$this->input->post('dxcluster_maxage'));
}
$dxcache_url_update = $this->optionslib->update('dxcache_url', $this->input->post('dxcache_url'), 'yes');
if($dxcache_url_update == TRUE) {
$this->session->set_flashdata('success', $this->lang->line('options_dxcache_url_changed_to').$this->input->post('dxcache_url'));
}
redirect('/options/dxcluster');
}
}
// function used to display the /radio url
function radio() {
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$data['sub_heading'] = $this->lang->line('options_radio_settings');
$this->load->view('interface_assets/header', $data);
$this->load->view('options/radios');
$this->load->view('interface_assets/footer');
}
// Handles saving the radio options to the options system.
function radio_save() {
// Get Language Options
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$data['sub_heading'] = $this->lang->line('options_radio_settings');
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
$this->form_validation->set_rules('radioTimeout', 'radioTimeout', 'required');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('interface_assets/header', $data);
$this->load->view('options/radios');
$this->load->view('interface_assets/footer');
}
else
{
// Update theme choice within the options system
$radioTimeout_update = $this->optionslib->update('cat_timeout_interval', $this->input->post('radioTimeout'), 'yes');
// If theme update is complete set a flashsession with a success note
if($radioTimeout_update == TRUE) {
$this->session->set_flashdata('success', $this->lang->line('options_radio_timeout_warning_changed_to').$this->input->post('radioTimeout').' seconds');
}
// Redirect back to /appearance
redirect('/options/radio');
}
}
// function used to display the /appearance url
function email() {
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$data['sub_heading'] = $this->lang->line('options_email');
$data['is_managed'] = ($this->config->item('managed_service') || $this->config->item('managed_email_protocol')) ? true : false;
$this->load->view('interface_assets/header', $data);
$this->load->view('options/email');
$this->load->view('interface_assets/footer');
}
// Handles saving the radio options to the options system.
function email_save() {
// Check if email is managed - if so, redirect with message
if ($this->config->item('managed_service') || $this->config->item('managed_email_protocol')) {
$this->session->set_flashdata('notice', 'Email settings are centrally managed and cannot be changed here.');
redirect('options');
}
// Get Language Options
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$data['sub_heading'] = $this->lang->line('options_email');
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
$this->form_validation->set_rules('emailProtocol', 'Email Protocol', 'required');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('interface_assets/header', $data);
$this->load->view('options/email');
$this->load->view('interface_assets/footer');
}
else
{
// Update emailProtocol choice within the options system
$emailProtocolupdate = $this->optionslib->update('emailProtocol', $this->input->post('emailProtocol'), 'yes');
// Update smtpEncryption choice within the options system
$smtpEncryptionupdate = $this->optionslib->update('smtpEncryption', $this->input->post('smtpEncryption'), 'yes');
// Update email sender name within the options system
$emailSenderName_value = $this->input->post('emailSenderName');
if (empty($emailSenderName_value)) {
$emailSenderName_value = 'Cloudlog';
}
$emailSenderNameupdate = $this->optionslib->update('emailSenderName', $emailSenderName_value, 'yes');
// Update email address choice within the options system
$emailAddressupdate = $this->optionslib->update('emailAddress', $this->input->post('emailAddress'), 'yes');
// Update smtpHost choice within the options system
$smtpHostupdate = $this->optionslib->update('smtpHost', $this->input->post('smtpHost'), 'yes');
// Update smtpPort choice within the options system
$smtpPortupdate = $this->optionslib->update('smtpPort', $this->input->post('smtpPort'), 'yes');
// Update smtpUsername choice within the options system
$smtpUsernameupdate = $this->optionslib->update('smtpUsername', $this->input->post('smtpUsername'), 'yes');
// Update smtpPassword choice within the options system
$smtpPasswordupdate = $this->optionslib->update('smtpPassword', $this->input->post('smtpPassword'), 'yes');
// Consider save successful when at least one value is persisted.
$updateSuccessful = $emailProtocolupdate ||
$smtpEncryptionupdate ||
$emailSenderNameupdate ||
$emailAddressupdate ||
$smtpHostupdate ||
$smtpPortupdate ||
$smtpUsernameupdate ||
$smtpPasswordupdate;
// Set flash session based on update success
if ($updateSuccessful) {
$this->session->set_flashdata('success', $this->lang->line('options_mail_settings_saved'));
} else {
$this->session->set_flashdata('saveFailed', $this->lang->line('options_mail_settings_failed'));
}
// Redirect back to /email
redirect('/options/email');
}
}
function oqrs() {
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$data['sub_heading'] = $this->lang->line('options_oqrs');
$this->load->view('interface_assets/header', $data);
$this->load->view('options/oqrs');
$this->load->view('interface_assets/footer');
}
function oqrs_save() {
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$data['sub_heading'] = $this->lang->line('options_oqrs');
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
$global_oqrs_text = $this->optionslib->update('global_oqrs_text', $this->input->post('global_oqrs_text'), null);
$global_oqrs_text = $this->optionslib->update('groupedSearch', $this->input->post('groupedSearch'), null);
$global_oqrs_text = $this->optionslib->update('groupedSearchShowStationName', $this->input->post('groupedSearchShowStationName'), null);
if($global_oqrs_text == TRUE) {
$this->session->set_flashdata('success', $this->lang->line('options_oqrs_options_have_been_saved'));
}
redirect('/options/oqrs');
}
function sendTestMail() {
$this->load->model('user_model');
$id = $this->session->userdata('user_id');
$email = $this->user_model->get_user_email_by_id($id);
if($email != "") {
$this->load->library('email');
if($this->optionslib->get_option('emailProtocol') == "smtp") {
$config = Array(
'protocol' => $this->optionslib->get_option('emailProtocol'),
'smtp_crypto' => $this->optionslib->get_option('smtpEncryption'),
'smtp_host' => $this->optionslib->get_option('smtpHost'),
'smtp_port' => $this->optionslib->get_option('smtpPort'),
'smtp_user' => $this->optionslib->get_option('smtpUsername'),
'smtp_pass' => $this->optionslib->get_option('smtpPassword'),
'crlf' => "\r\n",
'newline' => "\r\n"
);
$this->email->initialize($config);
}
$message = $this->load->view('email/testmail.php', NULL, TRUE);
$this->email->from($this->optionslib->get_option('emailAddress'), $this->optionslib->get_option('emailSenderName'));
$this->email->to($email);
$this->email->subject('Cloudlog Test-Mail');
$this->email->message($message);
if (! $this->email->send()){
// Log the error for debugging
log_message('error', 'Test email failed to send. Error: ' . $this->email->print_debugger());
$this->session->set_flashdata('testmailFailed', $this->lang->line('options_send_testmail_failed') . ' Check application logs for details.');
} else {
$this->session->set_flashdata('testmailSuccess', $this->lang->line('options_send_testmail_success'));
}
} else {
$this->session->set_flashdata('testmailFailed', $this->lang->line('options_send_testmail_failed') . ' No email address found in your account settings.');
}
redirect('/options/email');
}
// function used to display the /version_dialog url
function version_dialog() {
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$data['sub_heading'] = $this->lang->line('options_version_dialog_settings');
$this->load->view('interface_assets/header', $data);
$this->load->view('options/version_dialog');
$this->load->view('interface_assets/footer');
}
function version_dialog_save() {
// Get Language Options
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$data['sub_heading'] = $this->lang->line('options_version_dialog_settings');
$this->load->helper(array('form', 'url'));
$version_dialog_header_update = $this->optionslib->update('version_dialog_header', $this->input->post('version_dialog_header'), 'yes');
if($version_dialog_header_update == TRUE) {
$this->session->set_flashdata('success0', $this->lang->line('options_version_dialog_header_changed_to')." "."'".$this->input->post('version_dialog_header')."'");
}
$version_dialog_mode_update = $this->optionslib->update('version_dialog', $this->input->post('version_dialog_mode'), 'yes');
if($version_dialog_mode_update == TRUE) {
$this->session->set_flashdata('success1', $this->lang->line('options_version_dialog_mode_changed_to')." "."'".$this->input->post('version_dialog_mode')."'");
}
if ($this->input->post('version_dialog_mode') == "both" || $this->input->post('version_dialog_mode') == "custom_text" ) {
$version_dialog_custom_text_update = $this->optionslib->update('version_dialog_text', $this->input->post('version_dialog_custom_text'), 'yes');
if($version_dialog_custom_text_update == TRUE) {
$this->session->set_flashdata('success2', $this->lang->line('options_version_dialog_custom_text_saved'));
}
}
redirect('/options/version_dialog');
}
function version_dialog_show_to_all() {
$update_vd_confirmation_to_false = $this->user_options_model->set_option_at_all_users('version_dialog', 'confirmed', array('boolean' => 'false'));
if($update_vd_confirmation_to_false == TRUE) {
$this->session->set_flashdata('success_trigger', $this->lang->line('options_version_dialog_success_show_all'));
}
redirect('/options/version_dialog');
}
function version_dialog_show_to_none() {
$update_vd_confirmation_to_true = $this->user_options_model->set_option_at_all_users('version_dialog', 'confirmed', array('boolean' => 'true'));
if($update_vd_confirmation_to_true == TRUE) {
$this->session->set_flashdata('success_trigger', $this->lang->line('options_version_dialog_success_hide_all'));
}
redirect('/options/version_dialog');
}
// function used to display the /public_diary url
function public_diary() {
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$data['sub_heading'] = $this->lang->line('options_public_station_diary');
$this->load->view('interface_assets/header', $data);
$this->load->view('options/public_diary');
$this->load->view('interface_assets/footer');
}
// Handles saving the public diary options to the options system.
function public_diary_save() {
$data['page_title'] = $this->lang->line('options_cloudlog_options');
$data['sub_heading'] = $this->lang->line('options_public_station_diary');
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
$this->form_validation->set_rules('public_station_diary_enabled', 'Public Station Diary', 'required');
if ($this->form_validation->run() == FALSE) {
$this->load->view('interface_assets/header', $data);
$this->load->view('options/public_diary');
$this->load->view('interface_assets/footer');
} else {
// Update public station diary enabled option within the options system
$public_diary_update = $this->optionslib->update('public_station_diary_enabled', $this->input->post('public_station_diary_enabled'), 'yes');
if($public_diary_update == TRUE) {
$this->session->set_flashdata('success', $this->lang->line('options_public_station_diary_settings_saved'));
}
redirect('/options/public_diary');
}
}
}