qry_extra[] = array( 'name' => 'distroid', 'value' => (int)$_REQUEST['distroid'], 'table' => 'setting_distro', ); if (isset($_REQUEST['locationid'])) { $this->qry_extra[] = array( 'name' => 'locationid', 'value' => (int)$_REQUEST['locationid'], 'table' => 'setting_location', ); } } if (isset($_POST['setting']) && is_array($_POST['setting'])) { if (User::hasPermission('superadmin')) { // Build variables for specific sub-settings $qry_insert = ''; $qry_values = ''; foreach ($this->qry_extra as $item) { $qry_insert = ', ' . $item['name']; $qry_values = ', :' . $item['name']; } // Load all existing config options to validate input $res = Database::simpleQuery('SELECT setting, validator FROM setting'); while ($row = $res->fetch(PDO::FETCH_ASSOC)) { $key = $row['setting']; $validator = $row['validator']; $displayValue = (isset($_POST['setting'][$key]) ? $_POST['setting'][$key] : ''); // Validate data first! $mangledValue = Validator::validate($validator, $displayValue); if ($mangledValue === false) { Message::addWarning('main.value-invalid', $key, $displayValue); continue; } // Now put into DB Database::exec("INSERT INTO setting_global (setting, value, displayvalue $qry_insert) VALUES (:key, :value, :displayvalue $qry_values) ON DUPLICATE KEY UPDATE value = :value, displayvalue = :displayvalue", $this->qry_extra + array( 'key' => $key, 'value' => $mangledValue, 'displayvalue' => $displayValue ) ); } Message::addSuccess('settings-updated'); Util::redirect('?do=BaseConfig'); } } } protected function doRender() { if (!User::hasPermission('superadmin')) { Message::addError('main.no-permission'); Util::redirect('?do=Main'); } // Build left joins for specific settings $joins = ''; foreach ($this->qry_extra as $item) { $joins .= " LEFT JOIN {$item['table']} "; } // List global config option $settings = array(); $res = Database::simpleQuery('SELECT cat_setting.catid, setting.setting, setting.defaultvalue, setting.permissions, setting.validator, tbl.displayvalue FROM setting INNER JOIN cat_setting USING (catid) LEFT JOIN setting_global AS tbl USING (setting) ORDER BY cat_setting.sortval ASC, setting.setting ASC'); while ($row = $res->fetch(PDO::FETCH_ASSOC)) { $row['description'] = Util::markup(Dictionary::translateFile('config-variables', $row['setting'])); if (is_null($row['displayvalue'])) $row['displayvalue'] = $row['defaultvalue']; $row['item'] = $this->makeInput($row['validator'], $row['setting'], $row['displayvalue']); $settings[$row['catid']]['settings'][] = $row; if (!isset($settings[$row['catid']]['category_id'])) { $settings[$row['catid']]['category_name'] = Dictionary::translateFile('config-variable-categories', 'cat_' . $row['catid']); $settings[$row['catid']]['category_id'] = $row['catid']; } } Render::addTemplate('_page', array( 'categories' => array_values($settings) )); } /** * Create html snippet for setting, based on given validator * @param type $validator * @return boolean */ private function makeInput($validator, $setting, $current) { $parts = explode(':', $validator, 2); if ($parts[0] === 'list') { $items = explode('|', $parts[1]); $ret = ''; } // Password field guessing if (stripos($validator, 'password') !== false) { $type = Property::getPasswordFieldType(); } else { $type = 'text'; } // Fallback: single line input return ''; } }