/** * @see \wcf\system\importer\IImporter::import() */ public function import($oldID, array $data, array $additionalData = array()) { // whether to perform a merge $performMerge = false; // fetch user with same username $conflictingUser = User::getUserByUsername($data['username']); switch (ImportHandler::getInstance()->getUserMergeMode()) { case self::MERGE_MODE_USERNAME_OR_EMAIL: // merge target will be the conflicting user $targetUser = $conflictingUser; // check whether user exists if ($targetUser->userID) { $performMerge = true; break; } case self::MERGE_MODE_EMAIL: // fetch merge target $targetUser = User::getUserByEmail($data['email']); // if it exists: perform a merge if ($targetUser->userID) { $performMerge = true; } break; } // merge should be performed if ($performMerge) { ImportHandler::getInstance()->saveNewID('com.woltlab.wcf.user', $oldID, $targetUser->userID); return 0; } // a conflict arose, but no merge was performed, resolve if ($conflictingUser->userID) { // rename user $data['username'] = self::resolveDuplicate($data['username']); } // check existing user id if (is_numeric($oldID)) { $user = new User($oldID); if (!$user->userID) { $data['userID'] = $oldID; } } // handle user options $userOptions = array(); if (isset($additionalData['options'])) { foreach ($additionalData['options'] as $optionName => $optionValue) { if (is_int($optionName)) { $optionID = ImportHandler::getInstance()->getNewID('com.woltlab.wcf.user.option', $optionName); } else { $optionID = User::getUserOptionID($optionName); } if ($optionID) { $userOptions[$optionID] = $optionValue; } } // fix option values foreach ($userOptions as $optionID => &$optionValue) { switch ($this->userOptions[$optionID]->optionType) { case 'boolean': if ($optionValue) { $optionValue = 1; } else { $optionValue = 0; } break; case 'integer': $optionValue = intval($optionValue); if ($optionValue > 2147483647) { $optionValue = 2147483647; } break; case 'float': $optionValue = floatval($optionValue); break; case 'textarea': if (strlen($optionValue) > 16777215) { $optionValue = substr($optionValue, 0, 16777215); } break; case 'birthday': case 'date': if (!preg_match('/^\\d{4}\\-\\d{2}\\-\\d{2}$/', $optionValue)) { $optionValue = '0000-00-00'; } break; default: if (strlen($optionValue) > 65535) { $optionValue = substr($optionValue, 0, 65535); } } } } $languageIDs = array(); if (isset($additionalData['languages'])) { foreach ($additionalData['languages'] as $languageCode) { $language = LanguageFactory::getInstance()->getLanguageByCode($languageCode); if ($language !== null) { $languageIDs[] = $language->languageID; } } } if (empty($languageIDs)) { $languageIDs[] = LanguageFactory::getInstance()->getDefaultLanguageID(); } // assign an interface language $data['languageID'] = reset($languageIDs); // create user $user = UserEditor::create($data); $userEditor = new UserEditor($user); // updates user options $userEditor->updateUserOptions($userOptions); // save user groups $groupIDs = array(); if (isset($additionalData['groupIDs'])) { foreach ($additionalData['groupIDs'] as $oldGroupID) { $newGroupID = ImportHandler::getInstance()->getNewID('com.woltlab.wcf.user.group', $oldGroupID); if ($newGroupID) { $groupIDs[] = $newGroupID; } } } if (!$user->activationCode) { $defaultGroupIDs = UserGroup::getGroupIDsByType(array(UserGroup::EVERYONE, UserGroup::USERS)); } else { $defaultGroupIDs = UserGroup::getGroupIDsByType(array(UserGroup::EVERYONE, UserGroup::GUESTS)); } $groupIDs = array_merge($groupIDs, $defaultGroupIDs); $sql = "INSERT IGNORE INTO\twcf" . WCF_N . "_user_to_group\n\t\t\t\t\t\t(userID, groupID)\n\t\t\tVALUES\t\t\t(?, ?)"; $statement = WCF::getDB()->prepareStatement($sql); foreach ($groupIDs as $groupID) { $statement->execute(array($user->userID, $groupID)); } // save languages $sql = "INSERT IGNORE INTO\twcf" . WCF_N . "_user_to_language\n\t\t\t\t\t\t(userID, languageID)\n\t\t\tVALUES\t\t\t(?, ?)"; $statement = WCF::getDB()->prepareStatement($sql); foreach ($languageIDs as $languageID) { $statement->execute(array($user->userID, $languageID)); } // save default user events $sql = "INSERT IGNORE INTO\twcf" . WCF_N . "_user_notification_event_to_user\n\t\t\t\t\t\t(userID, eventID)\n\t\t\tVALUES\t\t\t(?, ?)"; $statement = WCF::getDB()->prepareStatement($sql); foreach ($this->eventIDs as $eventID) { $statement->execute(array($user->userID, $eventID)); } // save mapping ImportHandler::getInstance()->saveNewID('com.woltlab.wcf.user', $oldID, $user->userID); return $user->userID; }