2 namespace wcf\data\user
;
3 use wcf\data\user\group\UserGroup
;
4 use wcf\data\DatabaseObjectEditor
;
5 use wcf\data\IEditableCachedObject
;
6 use wcf\system\clipboard\ClipboardHandler
;
7 use wcf\system\language\LanguageFactory
;
8 use wcf\system\session\SessionHandler
;
10 use wcf\util\PasswordUtil
;
11 use wcf\util\StringUtil
;
14 * Provides functions to edit users.
16 * @author Alexander Ebert
17 * @copyright 2001-2012 WoltLab GmbH
18 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
19 * @package com.woltlab.wcf
20 * @subpackage data.user
21 * @category Community Framework
23 class UserEditor
extends DatabaseObjectEditor
implements IEditableCachedObject
{
25 * @see wcf\data\DatabaseObjectDecorator::$baseClass
27 protected static $baseClass = 'wcf\data\user\User';
30 * @see wcf\data\IEditableObject::create()
32 public static function create(array $parameters = array()) {
33 // create salt and password hash
34 $parameters['password'] = PasswordUtil
::getDoubleSaltedHash($parameters['password']);
36 // create accessToken for AbstractAuthedPage
37 $parameters['accessToken'] = StringUtil
::getRandomID();
39 // handle registration date
40 if (!isset($parameters['registrationDate'])) $parameters['registrationDate'] = TIME_NOW
;
42 $user = parent
::create($parameters);
44 // create default values for user options
45 self
::createUserOptions($user->userID
);
51 * @see wcf\data\IEditableObject::deleteAll()
53 public static function deleteAll(array $objectIDs = array()) {
55 ClipboardHandler
::getInstance()->unmark($objectIDs, ClipboardHandler
::getInstance()->getObjectTypeID('com.woltlab.wcf.user'));
57 return parent
::deleteAll($objectIDs);
61 * @see wcf\data\DatabaseObjectEditor::update()
63 public function update(array $parameters = array()) {
64 // update salt and create new password hash
65 if (isset($parameters['password']) && $parameters['password'] !== '') {
66 $parameters['password'] = PasswordUtil
::getDoubleSaltedHash($parameters['password']);
67 $parameters['accessToken'] = StringUtil
::getRandomID();
70 $this->accessToken
= $parameters['accessToken'];
73 unset($parameters['password'], $parameters['accessToken']);
76 parent
::update($parameters);
80 * Inserts default options.
82 * @param integer $userID
84 protected static function createUserOptions($userID) {
85 $userOptions = array();
87 // fetch default values
88 $sql = "SELECT optionID, defaultValue
89 FROM wcf".WCF_N
."_user_option";
90 $statement = WCF
::getDB()->prepareStatement($sql);
91 $statement->execute();
92 while ($row = $statement->fetchArray()) {
93 if (!empty($row['defaultValue'])) {
94 $userOptions[$row['optionID']] = $row['defaultValue'];
98 // insert default values
100 $statementParameters = array($userID);
101 foreach ($userOptions as $optionID => $optionValue) {
102 $keys .= ', userOption'.$optionID;
104 $statementParameters[] = $optionValue;
107 $sql = "INSERT INTO wcf".WCF_N
."_user_option_value
109 VALUES (?".$values.")";
110 $statement = WCF
::getDB()->prepareStatement($sql);
111 $statement->execute($statementParameters);
115 * Updates user options.
117 * @param array $userOptions
119 public function updateUserOptions(array $userOptions = array()) {
121 $statementParameters = array();
122 foreach ($userOptions as $optionID => $optionValue) {
123 if (!empty($updateSQL)) $updateSQL .= ',';
125 $updateSQL .= 'userOption'.$optionID.' = ?';
126 $statementParameters[] = $optionValue;
128 $statementParameters[] = $this->userID
;
130 if (!empty($updateSQL)) {
131 $sql = "UPDATE wcf".WCF_N
."_user_option_value
134 $statement = WCF
::getDB()->prepareStatement($sql);
135 $statement->execute($statementParameters);
140 * Adds a user to the groups he should be in.
142 * @param array $groups
143 * @param boolean $deleteOldGroups
144 * @param boolean $addDefaultGroups
146 public function addToGroups(array $groupIDs, $deleteOldGroups = true, $addDefaultGroups = true) {
147 // add default groups
148 if ($addDefaultGroups) {
149 $groupIDs = array_merge($groupIDs, UserGroup
::getGroupIDsByType(array(UserGroup
::EVERYONE
, UserGroup
::USERS
)));
150 $groupIDs = array_unique($groupIDs);
154 if ($deleteOldGroups) {
155 $sql = "DELETE FROM wcf".WCF_N
."_user_to_group
157 $statement = WCF
::getDB()->prepareStatement($sql);
158 $statement->execute(array($this->userID
));
162 if (!empty($groupIDs)) {
163 $sql = "INSERT IGNORE INTO wcf".WCF_N
."_user_to_group
166 $statement = WCF
::getDB()->prepareStatement($sql);
167 foreach ($groupIDs as $groupID) {
168 $statement->execute(array($this->userID
, $groupID));
174 * Adds a user to a user group.
176 * @param integer $groupID
178 public function addToGroup($groupID) {
179 $sql = "INSERT IGNORE INTO wcf".WCF_N
."_user_to_group
182 $statement = WCF
::getDB()->prepareStatement($sql);
183 $statement->execute(array($this->userID
, $groupID));
187 * Removes a user from a user group.
189 * @param integer $groupID
191 public function removeFromGroup($groupID) {
192 $sql = "DELETE FROM wcf".WCF_N
."_user_to_group
195 $statement = WCF
::getDB()->prepareStatement($sql);
196 $statement->execute(array($this->userID
, $groupID));
200 * Removes a user from multiple user groups.
202 * @param array $groupIDs
204 public function removeFromGroups(array $groupIDs) {
205 $sql = "DELETE FROM wcf".WCF_N
."_user_to_group
208 $statement = WCF
::getDB()->prepareStatement($sql);
209 foreach ($groupIDs as $groupID) {
210 $statement->execute(array(
218 * Saves the visible languages of a user.
220 * @param array $languageIDs
222 public function addToLanguages(array $languageIDs) {
223 // remove previous languages
224 $sql = "DELETE FROM wcf".WCF_N
."_user_to_language
226 $statement = WCF
::getDB()->prepareStatement($sql);
227 $statement->execute(array($this->userID
));
229 // insert language ids
230 $sql = "INSERT INTO wcf".WCF_N
."_user_to_language
233 $statement = WCF
::getDB()->prepareStatement($sql);
235 if (!empty($languageIDs)) {
236 WCF
::getDB()->beginTransaction();
237 foreach ($languageIDs as $languageID) {
238 $statement->execute(array(
243 WCF
::getDB()->commitTransaction();
246 // no language id given, use default language id instead
247 $statement->execute(array(
249 LanguageFactory
::getInstance()->getDefaultLanguageID()
255 * @see wcf\data\IEditableCachedObject::resetCache()
257 public static function resetCache() {
258 SessionHandler
::resetSessions();