mirror of
https://github.com/slawkens/myaac.git
synced 2025-04-26 09:19:22 +02:00

* New admin panel Pages: Options + Config [WIP] * Forgot the plugin example of options * Rename to settings.php * Add Settings Class * New myaac_settings table * Add $limit parameter to $db->select method * Add $member var annotation * Remove useless title_separator from config * Move $menus to menus.php Also fix active link when menu item has subpage * Settings [WIP] New Settings class New Plugins::load() method Move config.php to settings.php MyAAC Settings will have plugin_name = 'core' Add compat_config.php * Change options.php to settings.php * Change name to settings * Add Settings menu * Add Sections + Add setting($key) function Reorganisation * Add email + password fields as type * Update 33.php * add settings migration * php 8 compatibility * add missing hook * Add categories in tabs, move more settings, revert back getPluginSettings Categories and sections are now not numbered Remove example settings plugin * fix typo * Update .gitignore * Add 36th migration for settings table * Execute migrations just after db connect * Update plugins.php * [WIP] Some work on settings Add hidden settings New method: parse, to parse settings from array Move base html to twig template Remove vocation loading from .xml, instead use predefined voc names * Rename * Fix path * [WIP] More work on settings Move more config to settings (mainly mail_* + some other) Remove mail_admin, wasnt used anywhere Add return type to some functions Add Twig settings(key) function Possibility to save setting to db * Add min, max, step to number field option * Re-enable plugin if disabled and already installed * Add Settings menu, including all plugins with settings One change included in previous commit, due to missclick * Nothing important * Better boolean detection * More detailed error message in settings * Lets call it settings.name instead * Add new function: only_if, to hide fields when they are not enabled [WIP] Not fully finished yet * guild_management: show_if * Hide section title on show_if * Fix: check on page load if radio button is checked * Add: show_if - account_mail_verify * nothing important * Rename team_* variables + add to deprecated * Change variable name * Extract Settings:save function * Add settings.callbacks.get * Move forum config to settings * Move status config to settings * Remove whitespaces * More config to settings: account_types, genders, highscores, admin * Move signature config to settings * Move news config to settings * Rename variable * Save config.php in Settings Egg and hen problem solved :) * Test database connection on save settings -> prevents from making website unusable if connection is wrong * Test server_path -> same There is no config.php anymore, just config.local.php, which can be edited manually and also from admin panel * Remove configs from previous commit * Fix create account, if account_create_character_create is enabled * Add more deprecated configs * Add more info into comment * Update 5-database.php * Fix menu highlighting & opening * Update template.php * Enable script option * Reword email settings + move two new settings * add last_kills_limit + move shop * google_analytics_id * add mail_lost_account_interval * Create character blocked words (by @gpedro), just moved to settings * Fix google_analytics * create character name config moved to settings * Fix for install warning - min/max length * New create character checks configurable: block monsters & spells names * fixes * Improve character npc name check * New setting: donate_column + move donate config to settings * Add super fancy No Refresh saving with a toast * Add new possibility: to deny saving setting if condition is not met * Move database settings to separate category * Fix default value displaying * Add database_hash setting * add last_kills_limit to compat config * Move create character blocked names down * Every setting needs to have default * Move rest of config to settings Remove config.php completely Add new settings category: Game Fix account_login_by_email Min textarea size = 2 + adjusted automatically
599 lines
16 KiB
PHP
599 lines
16 KiB
PHP
<?php
|
|
/**
|
|
* CreateCharacter
|
|
*
|
|
* @package MyAAC
|
|
* @author Slawkens <slawkens@gmail.com>
|
|
* @copyright 2020 MyAAC
|
|
* @link https://my-aac.org
|
|
*/
|
|
|
|
class Settings implements ArrayAccess
|
|
{
|
|
static private $instance;
|
|
private $settingsFile = [];
|
|
private $settingsDatabase = [];
|
|
private $cache = [];
|
|
private $valuesAsked = [];
|
|
private $errors = [];
|
|
|
|
/**
|
|
* @return Settings
|
|
*/
|
|
public static function getInstance(): Settings
|
|
{
|
|
if (!self::$instance) {
|
|
self::$instance = new self();
|
|
}
|
|
|
|
return self::$instance;
|
|
}
|
|
|
|
public function load()
|
|
{
|
|
$cache = Cache::getInstance();
|
|
if ($cache->enabled()) {
|
|
$tmp = '';
|
|
if ($cache->fetch('settings', $tmp)) {
|
|
$this->settingsDatabase = unserialize($tmp);
|
|
return;
|
|
}
|
|
}
|
|
|
|
global $db;
|
|
$settings = $db->query('SELECT * FROM `' . TABLE_PREFIX . 'settings`');
|
|
|
|
if($settings->rowCount() > 0) {
|
|
foreach ($settings->fetchAll(PDO::FETCH_ASSOC) as $setting) {
|
|
$this->settingsDatabase[$setting['name']][$setting['key']] = $setting['value'];
|
|
}
|
|
}
|
|
|
|
if ($cache->enabled()) {
|
|
$cache->set('settings', serialize($this->settingsDatabase), 600);
|
|
}
|
|
}
|
|
|
|
public function save($pluginName, $values) {
|
|
global $db;
|
|
|
|
if (!isset($this->settingsFile[$pluginName])) {
|
|
throw new RuntimeException('Error on save settings: plugin does not exist');
|
|
}
|
|
|
|
$settings = $this->settingsFile[$pluginName];
|
|
if (isset($settings['callbacks']['beforeSave'])) {
|
|
if (!$settings['callbacks']['beforeSave']($settings, $values)) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
$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) {
|
|
$this->errors[] = 'Error while saving setting (' . $pluginName . ' - ' . $key . '): ' . $error->getMessage();
|
|
}
|
|
}
|
|
|
|
$cache = Cache::getInstance();
|
|
if ($cache->enabled()) {
|
|
$cache->delete('settings');
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function updateInDatabase($pluginName, $key, $value)
|
|
{
|
|
global $db;
|
|
$db->update(TABLE_PREFIX . 'settings', ['value' => $value], ['name' => $pluginName, 'key' => $key]);
|
|
}
|
|
|
|
public function deleteFromDatabase($pluginName, $key = null)
|
|
{
|
|
global $db;
|
|
|
|
if (!isset($key)) {
|
|
$db->delete(TABLE_PREFIX . 'settings', ['name' => $pluginName], -1);
|
|
}
|
|
else {
|
|
$db->delete(TABLE_PREFIX . 'settings', ['name' => $pluginName, 'key' => $key]);
|
|
}
|
|
}
|
|
|
|
public static function display($plugin, $settings): array
|
|
{
|
|
global $db;
|
|
|
|
$query = 'SELECT `key`, `value` FROM `' . TABLE_PREFIX . 'settings` WHERE `name` = ' . $db->quote($plugin) . ';';
|
|
$query = $db->query($query);
|
|
|
|
$settingsDb = [];
|
|
if($query->rowCount() > 0) {
|
|
foreach($query->fetchAll(PDO::FETCH_ASSOC) as $value) {
|
|
$settingsDb[$value['key']] = $value['value'];
|
|
}
|
|
}
|
|
|
|
$config = [];
|
|
require BASE . 'config.local.php';
|
|
|
|
foreach ($config as $key => $value) {
|
|
if (is_bool($value)) {
|
|
$settingsDb[$key] = $value ? 'true' : 'false';
|
|
}
|
|
else {
|
|
$settingsDb[$key] = (string)$value;
|
|
}
|
|
}
|
|
|
|
$javascript = '';
|
|
ob_start();
|
|
?>
|
|
<ul class="nav nav-tabs" id="myTab">
|
|
<?php
|
|
$i = 0;
|
|
foreach($settings as $setting) {
|
|
if (isset($setting['script'])) {
|
|
$javascript .= $setting['script'] . PHP_EOL;
|
|
}
|
|
|
|
if ($setting['type'] === 'category') {
|
|
?>
|
|
<li class="nav-item">
|
|
<a class="nav-link<?= ($i === 0 ? ' active' : ''); ?>" id="home-tab-<?= $i++; ?>" data-toggle="tab" href="#tab-<?= str_replace(' ', '', $setting['title']); ?>" type="button"><?= $setting['title']; ?></a>
|
|
</li>
|
|
<?php
|
|
}
|
|
}
|
|
?>
|
|
</ul>
|
|
<div class="tab-content" id="tab-content">
|
|
<?php
|
|
|
|
$checkbox = function ($key, $type, $value) {
|
|
echo '<label><input type="radio" id="' . $key . '_' . ($type ? 'yes' : 'no') . '" name="settings[' . $key . ']" value="' . ($type ? 'true' : 'false') . '" ' . ($value === $type ? 'checked' : '') . '/>' . ($type ? 'Yes' : 'No') . '</label> ';
|
|
};
|
|
|
|
$i = 0;
|
|
$j = 0;
|
|
foreach($settings as $key => $setting) {
|
|
if ($setting['type'] === 'category') {
|
|
if ($j++ !== 0) { // close previous category
|
|
echo '</tbody></table></div>';
|
|
}
|
|
?>
|
|
<div class="tab-pane fade show<?= ($j === 1 ? ' active' : ''); ?>" id="tab-<?= str_replace(' ', '', $setting['title']); ?>">
|
|
<?php
|
|
continue;
|
|
}
|
|
|
|
if ($setting['type'] === 'section') {
|
|
if ($i++ !== 0) { // close previous section
|
|
echo '</tbody></table>';
|
|
}
|
|
?>
|
|
<h3 id="row_<?= $key ?>" style="text-align: center"><strong><?= $setting['title']; ?></strong></h3>
|
|
<table class="table table-bordered table-striped">
|
|
<thead>
|
|
<tr>
|
|
<th style="width: 13%">Name</th>
|
|
<th style="width: 30%">Value</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php
|
|
continue;
|
|
}
|
|
|
|
if (!isset($setting['hidden']) || !$setting['hidden']) {
|
|
?>
|
|
<tr id="row_<?= $key ?>">
|
|
<td><label for="<?= $key ?>" class="control-label"><?= $setting['name'] ?></label></td>
|
|
<td>
|
|
<?php
|
|
}
|
|
if (isset($setting['hidden']) && $setting['hidden']) {
|
|
$value = '';
|
|
if ($setting['type'] === 'boolean') {
|
|
$value = ($setting['default'] ? 'true' : 'false');
|
|
}
|
|
else if (in_array($setting['type'], ['text', 'number', 'email', 'password', 'textarea'])) {
|
|
$value = $setting['default'];
|
|
}
|
|
else if ($setting['type'] === 'options') {
|
|
$value = $setting['options'][$setting['default']];
|
|
}
|
|
|
|
echo '<input type="hidden" name="settings[' . $key . ']" value="' . $value . '" id="' . $key . '"';
|
|
}
|
|
else if ($setting['type'] === 'boolean') {
|
|
if(isset($settingsDb[$key])) {
|
|
if($settingsDb[$key] === 'true') {
|
|
$value = true;
|
|
}
|
|
else {
|
|
$value = false;
|
|
}
|
|
}
|
|
else {
|
|
$value = ($setting['default'] ?? false);
|
|
}
|
|
|
|
$checkbox($key, true, $value);
|
|
$checkbox($key, false, $value);
|
|
}
|
|
|
|
else if (in_array($setting['type'], ['text', 'number', 'email', 'password'])) {
|
|
if ($setting['type'] === 'number') {
|
|
$min = (isset($setting['min']) ? ' min="' . $setting['min'] . '"' : '');
|
|
$max = (isset($setting['max']) ? ' max="' . $setting['max'] . '"' : '');
|
|
$step = (isset($setting['step']) ? ' step="' . $setting['step'] . '"' : '');
|
|
}
|
|
else {
|
|
$min = $max = $step = '';
|
|
}
|
|
|
|
echo '<input class="form-control" type="' . $setting['type'] . '" name="settings[' . $key . ']" value="' . ($settingsDb[$key] ?? ($setting['default'] ?? '')) . '" id="' . $key . '"' . $min . $max . $step . '/>';
|
|
}
|
|
|
|
else if($setting['type'] === 'textarea') {
|
|
$value = ($settingsDb[$key] ?? ($setting['default'] ?? ''));
|
|
$valueWithSpaces = array_map('trim', preg_split('/\r\n|\r|\n/', trim($value)));
|
|
$rows = count($valueWithSpaces);
|
|
if ($rows < 2) {
|
|
$rows = 2; // always min 2 rows for textarea
|
|
}
|
|
echo '<textarea class="form-control" rows="' . $rows . '" name="settings[' . $key . ']" id="' . $key . '">' . $value . '</textarea>';
|
|
}
|
|
|
|
else if ($setting['type'] === 'options') {
|
|
if ($setting['options'] === '$templates') {
|
|
$templates = [];
|
|
foreach (get_templates() as $value) {
|
|
$templates[$value] = $value;
|
|
}
|
|
|
|
$setting['options'] = $templates;
|
|
}
|
|
|
|
else if($setting['options'] === '$clients') {
|
|
$clients = [];
|
|
foreach((array)config('clients') as $client) {
|
|
|
|
$client_version = (string)($client / 100);
|
|
if(strpos($client_version, '.') === false)
|
|
$client_version .= '.0';
|
|
|
|
$clients[$client] = $client_version;
|
|
}
|
|
|
|
$setting['options'] = $clients;
|
|
}
|
|
else if ($setting['options'] == '$timezones') {
|
|
$timezones = [];
|
|
foreach (DateTimeZone::listIdentifiers() as $value) {
|
|
$timezones[$value] = $value;
|
|
}
|
|
|
|
$setting['options'] = $timezones;
|
|
}
|
|
|
|
else {
|
|
if (is_string($setting['options'])) {
|
|
$setting['options'] = explode(',', $setting['options']);
|
|
foreach ($setting['options'] as &$option) {
|
|
$option = trim($option);
|
|
}
|
|
}
|
|
}
|
|
|
|
echo '<select class="form-control" name="settings[' . $key . ']" id="' . $key . '">';
|
|
foreach ($setting['options'] as $value => $option) {
|
|
$compareTo = ($settingsDb[$key] ?? ($setting['default'] ?? ''));
|
|
if($value === 'true') {
|
|
$selected = $compareTo === true;
|
|
}
|
|
else if($value === 'false') {
|
|
$selected = $compareTo === false;
|
|
}
|
|
else {
|
|
$selected = $compareTo == $value;
|
|
}
|
|
|
|
echo '<option value="' . $value . '" ' . ($selected ? 'selected' : '') . '>' . $option . '</option>';
|
|
}
|
|
echo '</select>';
|
|
}
|
|
|
|
if (!isset($setting['hidden']) || !$setting['hidden']) {
|
|
?>
|
|
</td>
|
|
<td>
|
|
<div class="well setting-default"><?php
|
|
echo ($setting['desc'] ?? '');
|
|
echo '<br/>';
|
|
echo '<strong>Default:</strong> ';
|
|
|
|
if ($setting['type'] === 'boolean') {
|
|
echo ($setting['default'] ? 'Yes' : 'No');
|
|
}
|
|
else if (in_array($setting['type'], ['text', 'number', 'email', 'password', 'textarea'])) {
|
|
echo $setting['default'];
|
|
}
|
|
else if ($setting['type'] === 'options') {
|
|
if (!empty($setting['default'])) {
|
|
echo $setting['options'][$setting['default']];
|
|
}
|
|
}
|
|
?></div>
|
|
</td>
|
|
</tr>
|
|
<?php
|
|
}
|
|
}
|
|
?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div class="box-footer">
|
|
<button name="save" type="submit" class="btn btn-primary">Save</button>
|
|
</div>
|
|
<?php
|
|
|
|
return ['content' => ob_get_clean(), 'script' => $javascript];
|
|
}
|
|
|
|
#[\ReturnTypeWillChange]
|
|
public function offsetSet($offset, $value)
|
|
{
|
|
if (is_null($offset)) {
|
|
throw new \RuntimeException("Settings: You cannot set empty offset with value: $value!");
|
|
}
|
|
|
|
$this->loadPlugin($offset);
|
|
|
|
$pluginKeyName = $this->valuesAsked['pluginKeyName'];
|
|
$key = $this->valuesAsked['key'];
|
|
|
|
// remove whole plugin settings
|
|
if (!isset($value)) {
|
|
$this->offsetUnset($offset);
|
|
$this->deleteFromDatabase($pluginKeyName, $key);
|
|
return;
|
|
}
|
|
|
|
$this->settingsDatabase[$pluginKeyName][$key] = $value;
|
|
$this->updateInDatabase($pluginKeyName, $key, $value);
|
|
}
|
|
|
|
#[\ReturnTypeWillChange]
|
|
public function offsetExists($offset): bool
|
|
{
|
|
$this->loadPlugin($offset);
|
|
|
|
$pluginKeyName = $this->valuesAsked['pluginKeyName'];
|
|
$key = $this->valuesAsked['key'];
|
|
|
|
// remove specified plugin settings (all)
|
|
if(is_null($key)) {
|
|
return isset($this->settingsDatabase[$offset]);
|
|
}
|
|
|
|
return isset($this->settingsDatabase[$pluginKeyName][$key]);
|
|
}
|
|
|
|
#[\ReturnTypeWillChange]
|
|
public function offsetUnset($offset)
|
|
{
|
|
$this->loadPlugin($offset);
|
|
|
|
$pluginKeyName = $this->valuesAsked['pluginKeyName'];
|
|
$key = $this->valuesAsked['key'];
|
|
|
|
if (isset($this->cache[$offset])) {
|
|
unset($this->cache[$offset]);
|
|
}
|
|
|
|
// remove specified plugin settings (all)
|
|
if(!isset($key)) {
|
|
unset($this->settingsFile[$pluginKeyName]);
|
|
unset($this->settingsDatabase[$pluginKeyName]);
|
|
$this->deleteFromDatabase($pluginKeyName);
|
|
return;
|
|
}
|
|
|
|
unset($this->settingsFile[$pluginKeyName]['settings'][$key]);
|
|
unset($this->settingsDatabase[$pluginKeyName][$key]);
|
|
$this->deleteFromDatabase($pluginKeyName, $key);
|
|
}
|
|
|
|
/**
|
|
* Get settings
|
|
* Usage: $setting['plugin_name.key']
|
|
* Example: $settings['shop_system.paypal_email']
|
|
*
|
|
* @param mixed $offset
|
|
* @return array|mixed
|
|
*/
|
|
#[\ReturnTypeWillChange]
|
|
public function offsetGet($offset)
|
|
{
|
|
// try cache hit
|
|
if(isset($this->cache[$offset])) {
|
|
return $this->cache[$offset];
|
|
}
|
|
|
|
$this->loadPlugin($offset);
|
|
|
|
$pluginKeyName = $this->valuesAsked['pluginKeyName'];
|
|
$key = $this->valuesAsked['key'];
|
|
|
|
// return specified plugin settings (all)
|
|
if(!isset($key)) {
|
|
if (!isset($this->settingsFile[$pluginKeyName]['settings'])) {
|
|
throw new RuntimeException('Unknown plugin settings: ' . $pluginKeyName);
|
|
}
|
|
return $this->settingsFile[$pluginKeyName]['settings'];
|
|
}
|
|
|
|
$ret = [];
|
|
if(isset($this->settingsFile[$pluginKeyName]['settings'][$key])) {
|
|
$ret = $this->settingsFile[$pluginKeyName]['settings'][$key];
|
|
}
|
|
|
|
if(isset($this->settingsDatabase[$pluginKeyName][$key])) {
|
|
$value = $this->settingsDatabase[$pluginKeyName][$key];
|
|
|
|
$ret['value'] = $value;
|
|
}
|
|
else {
|
|
$ret['value'] = $this->settingsFile[$pluginKeyName]['settings'][$key]['default'];
|
|
}
|
|
|
|
if(isset($ret['type'])) {
|
|
switch($ret['type']) {
|
|
case 'boolean':
|
|
$ret['value'] = getBoolean($ret['value']);
|
|
break;
|
|
|
|
case 'number':
|
|
if (!isset($ret['step']) || (int)$ret['step'] == 1) {
|
|
$ret['value'] = (int)$ret['value'];
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (isset($ret['callbacks']['get'])) {
|
|
$ret['value'] = $ret['callbacks']['get']($ret['value']);
|
|
}
|
|
|
|
$this->cache[$offset] = $ret;
|
|
return $ret;
|
|
}
|
|
|
|
private function updateValuesAsked($offset)
|
|
{
|
|
$pluginKeyName = $offset;
|
|
if (strpos($offset, '.')) {
|
|
$explode = explode('.', $offset, 2);
|
|
|
|
$pluginKeyName = $explode[0];
|
|
$key = $explode[1];
|
|
|
|
$this->valuesAsked = ['pluginKeyName' => $pluginKeyName, 'key' => $key];
|
|
}
|
|
else {
|
|
$this->valuesAsked = ['pluginKeyName' => $pluginKeyName, 'key' => null];
|
|
}
|
|
}
|
|
|
|
private function loadPlugin($offset)
|
|
{
|
|
$this->updateValuesAsked($offset);
|
|
|
|
$pluginKeyName = $this->valuesAsked['pluginKeyName'];
|
|
$key = $this->valuesAsked['key'];
|
|
|
|
if (!isset($this->settingsFile[$pluginKeyName])) {
|
|
if ($pluginKeyName === 'core') {
|
|
$settingsFilePath = SYSTEM . 'settings.php';
|
|
} else {
|
|
//$pluginSettings = Plugins::getPluginSettings($pluginKeyName);
|
|
$settings = Plugins::getAllPluginsSettings();
|
|
if (!isset($settings[$pluginKeyName])) {
|
|
warning("Setting $pluginKeyName does not exist or does not have settings defined.");
|
|
return;
|
|
}
|
|
|
|
$settingsFilePath = BASE . $settings[$pluginKeyName]['settingsFilename'];
|
|
}
|
|
|
|
if (!file_exists($settingsFilePath)) {
|
|
throw new \RuntimeException('Failed to load settings file for plugin: ' . $pluginKeyName);
|
|
}
|
|
|
|
$this->settingsFile[$pluginKeyName] = require $settingsFilePath;
|
|
}
|
|
}
|
|
|
|
public static function saveConfig($config, $filename, &$content = '')
|
|
{
|
|
$content = "<?php" . PHP_EOL .
|
|
"\$config['installed'] = true;" . PHP_EOL;
|
|
|
|
foreach ($config as $key => $value) {
|
|
$content .= "\$config['$key'] = ";
|
|
$content .= var_export($value, true);
|
|
$content .= ';' . PHP_EOL;
|
|
}
|
|
|
|
$success = file_put_contents($filename, $content);
|
|
|
|
// we saved new config.php, need to revalidate cache (only if opcache is enabled)
|
|
if (function_exists('opcache_invalidate')) {
|
|
opcache_invalidate($filename);
|
|
}
|
|
|
|
return $success;
|
|
}
|
|
|
|
public static function testDatabaseConnection($config): bool
|
|
{
|
|
$user = null;
|
|
$password = null;
|
|
$dns = [];
|
|
|
|
if( isset($config['database_name']) ) {
|
|
$dns[] = 'dbname=' . $config['database_name'];
|
|
}
|
|
|
|
if( isset($config['database_user']) ) {
|
|
$user = $config['database_user'];
|
|
}
|
|
|
|
if( isset($config['database_password']) ) {
|
|
$password = $config['database_password'];
|
|
}
|
|
|
|
if( isset($config['database_host']) ) {
|
|
$dns[] = 'host=' . $config['database_host'];
|
|
}
|
|
|
|
if( isset($config['database_port']) ) {
|
|
$dns[] = 'port=' . $config['database_port'];
|
|
}
|
|
|
|
try {
|
|
$connectionTest = new PDO('mysql:' . implode(';', $dns), $user, $password);
|
|
$connectionTest->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
}
|
|
catch(PDOException $error) {
|
|
error('MySQL connection failed. Settings has been reverted.');
|
|
error($error->getMessage());
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function getErrors() {
|
|
return $this->errors;
|
|
}
|
|
}
|