From 20dd49b1c5201e492b9a88b3ce8b1e8354a3ee22 Mon Sep 17 00:00:00 2001 From: slawkens Date: Sat, 22 Jul 2023 14:37:57 +0200 Subject: [PATCH] Add new possibility: to deny saving setting if condition is not met --- admin/tools/settings_save.php | 6 ++++++ system/libs/Settings.php | 14 +++++++++++++- system/settings.php | 10 ++++++++++ system/templates/admin.settings.html.twig | 13 +++++++++++-- 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/admin/tools/settings_save.php b/admin/tools/settings_save.php index 8596fb20..83be1de3 100644 --- a/admin/tools/settings_save.php +++ b/admin/tools/settings_save.php @@ -25,4 +25,10 @@ $settings = Settings::getInstance(); $settings->save($_REQUEST['plugin'], $_POST['settings']); +$errors = $settings->getErrors(); +if (count($errors) > 0) { + http_response_code(500); + die(implode('
', $errors)); +} + echo 'Saved at ' . date('H:i'); diff --git a/system/libs/Settings.php b/system/libs/Settings.php index aaddf72f..9638b617 100644 --- a/system/libs/Settings.php +++ b/system/libs/Settings.php @@ -15,6 +15,7 @@ class Settings implements ArrayAccess private $settingsDatabase = []; private $cache = []; private $valuesAsked = []; + private $errors = []; /** * @return Settings @@ -67,12 +68,19 @@ class Settings implements ArrayAccess } } + $this->errors = []; $db->query('DELETE FROM `' . TABLE_PREFIX . 'settings` WHERE `name` = ' . $db->quote($pluginName) . ';'); foreach ($values as $key => $value) { + $errorMessage = ''; + if (isset($settings['settings'][$key]['callbacks']['beforeSave']) && !$settings['settings'][$key]['callbacks']['beforeSave']($key, $value, $errorMessage)) { + $this->errors[] = $errorMessage; + continue; + } + try { $db->insert(TABLE_PREFIX . 'settings', ['name' => $pluginName, 'key' => $key, 'value' => $value]); } catch (PDOException $error) { - warning('Error while saving setting (' . $pluginName . ' - ' . $key . '): ' . $error->getMessage()); + $this->errors[] = 'Error while saving setting (' . $pluginName . ' - ' . $key . '): ' . $error->getMessage(); } } @@ -587,4 +595,8 @@ class Settings implements ArrayAccess return true; } + + public function getErrors() { + return $this->errors; + } } diff --git a/system/settings.php b/system/settings.php index 04cea71f..8110fbd7 100644 --- a/system/settings.php +++ b/system/settings.php @@ -1301,6 +1301,16 @@ Sent by MyAAC,
'desc' => 'What to give to player after donation - what column in accounts table to use.', 'options' => ['premium_points' => 'Premium Points', 'coins' => 'Coins'], 'default' => 'premium_points', + 'callbacks' => [ + 'beforeSave' => function($key, $value, &$errorMessage) { + global $db; + if ($value == 'coins' && !$db->hasColumn('accounts', 'coins')) { + $errorMessage = "Shop: Donate Column: Cannot set column to coins, because it doesn't exist in database."; + return false; + } + return true; + } + ] ], 'account_generate_new_reckey' => [ 'name' => 'Allow Generate New Key', diff --git a/system/templates/admin.settings.html.twig b/system/templates/admin.settings.html.twig index 44480ceb..d06eadc1 100644 --- a/system/templates/admin.settings.html.twig +++ b/system/templates/admin.settings.html.twig @@ -80,11 +80,20 @@ Toastify({ position: 'center', text: response, - duration: 3000 + duration: 3000, + escapeMarkup: false, }).showToast(); }, error : function(response) { - alert(response.responseText); + Toastify({ + position: 'center', + text: response.responseText, + duration: 3000, + style: { + background: 'red', + }, + escapeMarkup: false, + }).showToast(); } }); });