/** * Write the given user prefs to the user's record * * @param array $a_user_prefs User prefs to save * @param bool $no_session Simplified language/preferences handling * * @return boolean True on success, False on failure */ function save_prefs($a_user_prefs, $no_session = false) { if (!$this->ID) { return false; } $plugin = $this->rc->plugins->exec_hook('preferences_update', array('userid' => $this->ID, 'prefs' => $a_user_prefs, 'old' => (array) $this->get_prefs())); if (!empty($plugin['abort'])) { return; } $a_user_prefs = $plugin['prefs']; $old_prefs = $plugin['old']; $config = $this->rc->config; // merge (partial) prefs array with existing settings $save_prefs = $a_user_prefs + $old_prefs; unset($save_prefs['language']); // don't save prefs with default values if they haven't been changed yet foreach ($a_user_prefs as $key => $value) { if ($value === null || !isset($old_prefs[$key]) && $value == $config->get($key)) { unset($save_prefs[$key]); } } $save_prefs = serialize($save_prefs); if (!$no_session) { $this->language = $_SESSION['language']; } $this->db->query("UPDATE " . $this->db->table_name('users') . " SET preferences = ?" . ", language = ?" . " WHERE user_id = ?", $save_prefs, $this->language, $this->ID); // Update success if ($this->db->affected_rows() !== false) { $this->data['preferences'] = $save_prefs; if (!$no_session) { $config->set_user_prefs($a_user_prefs); if (isset($_SESSION['preferences'])) { $this->rc->session->remove('preferences'); $this->rc->session->remove('preferences_time'); } } return true; } else { if (!$no_session && $this->db->is_replicated() && $config->get('session_storage', 'db') != 'db') { $_SESSION['preferences'] = $save_prefs; $_SESSION['preferences_time'] = time(); $config->set_user_prefs($a_user_prefs); $this->data['preferences'] = $save_prefs; } } return false; }