Add new possibility: to deny saving setting if condition is not met

This commit is contained in:
slawkens 2023-07-22 14:37:57 +02:00
parent 3236f1aebb
commit 20dd49b1c5
4 changed files with 40 additions and 3 deletions

View File

@ -25,4 +25,10 @@ $settings = Settings::getInstance();
$settings->save($_REQUEST['plugin'], $_POST['settings']); $settings->save($_REQUEST['plugin'], $_POST['settings']);
$errors = $settings->getErrors();
if (count($errors) > 0) {
http_response_code(500);
die(implode('<br/>', $errors));
}
echo 'Saved at ' . date('H:i'); echo 'Saved at ' . date('H:i');

View File

@ -15,6 +15,7 @@ class Settings implements ArrayAccess
private $settingsDatabase = []; private $settingsDatabase = [];
private $cache = []; private $cache = [];
private $valuesAsked = []; private $valuesAsked = [];
private $errors = [];
/** /**
* @return Settings * @return Settings
@ -67,12 +68,19 @@ class Settings implements ArrayAccess
} }
} }
$this->errors = [];
$db->query('DELETE FROM `' . TABLE_PREFIX . 'settings` WHERE `name` = ' . $db->quote($pluginName) . ';'); $db->query('DELETE FROM `' . TABLE_PREFIX . 'settings` WHERE `name` = ' . $db->quote($pluginName) . ';');
foreach ($values as $key => $value) { 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 { try {
$db->insert(TABLE_PREFIX . 'settings', ['name' => $pluginName, 'key' => $key, 'value' => $value]); $db->insert(TABLE_PREFIX . 'settings', ['name' => $pluginName, 'key' => $key, 'value' => $value]);
} catch (PDOException $error) { } 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; return true;
} }
public function getErrors() {
return $this->errors;
}
} }

View File

@ -1301,6 +1301,16 @@ Sent by MyAAC,<br/>
'desc' => 'What to give to player after donation - what column in accounts table to use.', 'desc' => 'What to give to player after donation - what column in accounts table to use.',
'options' => ['premium_points' => 'Premium Points', 'coins' => 'Coins'], 'options' => ['premium_points' => 'Premium Points', 'coins' => 'Coins'],
'default' => 'premium_points', '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' => [ 'account_generate_new_reckey' => [
'name' => 'Allow Generate New Key', 'name' => 'Allow Generate New Key',

View File

@ -80,11 +80,20 @@
Toastify({ Toastify({
position: 'center', position: 'center',
text: response, text: response,
duration: 3000 duration: 3000,
escapeMarkup: false,
}).showToast(); }).showToast();
}, },
error : function(response) { error : function(response) {
alert(response.responseText); Toastify({
position: 'center',
text: response.responseText,
duration: 3000,
style: {
background: 'red',
},
escapeMarkup: false,
}).showToast();
} }
}); });
}); });