19 import(
'lib.pkp.classes.form.Form');
39 parent::__construct(
'frontend/pages/userRegister.tpl');
44 $this->
addCheck(
new FormValidator($this,
'username',
'required',
'user.profile.form.usernameRequired'));
47 $this->
addCheck(
new FormValidatorLength($this,
'password',
'required',
'user.register.form.passwordLengthRestriction',
'>=', $site->getMinPasswordLength()));
48 $this->
addCheck(
new FormValidatorCustom($this,
'password',
'required',
'user.register.form.passwordsDoNotMatch',
function($password) use ($form) {
49 return $password == $form->getData(
'password2');
52 $this->
addCheck(
new FormValidator($this,
'givenName',
'required',
'user.profile.form.givenNameRequired'));
54 $this->
addCheck(
new FormValidator($this,
'country',
'required',
'user.profile.form.countryRequired'));
61 if ($this->captchaEnabled) {
63 $this->
addCheck(
new FormValidatorReCaptcha($this, $request->getRemoteAddr(),
'common.captcha.error.invalid-input-response', $request->getServerHost()));
67 $this->defaultAuth = $authDao->getDefaultPlugin();
68 if (isset($this->defaultAuth)) {
70 $this->
addCheck(
new FormValidatorCustom($this,
'username',
'required',
'user.register.form.usernameExists',
function($username) use ($form, $auth) {
71 return (!$auth->userExists($username) || $auth->authenticate($username, $form->getData(
'password')));
76 if ($context && $context->getData(
'privacyStatement')) {
77 $this->
addCheck(
new FormValidator($this,
'privacyConsent',
'required',
'user.profile.form.privacyConsentRequired'));
87 function fetch($request, $template =
null, $display =
false) {
89 $site = $request->getSite();
90 $context = $request->getContext();
92 if ($this->captchaEnabled) {
94 $reCaptchaHtml =
'<div class="g-recaptcha" data-sitekey="' . $publicKey .
'"></div>';
95 $templateMgr->assign(array(
96 'reCaptchaHtml' => $reCaptchaHtml,
97 'captchaEnabled' =>
true,
101 $isoCodes = new \Sokil\IsoCodes\IsoCodesFactory();
102 $countries = array();
103 foreach ($isoCodes->getCountries() as $country) {
104 $countries[$country->getAlpha2()] = $country->getLocalName();
107 $templateMgr->assign(
'countries', $countries);
109 import(
'lib.pkp.classes.user.form.UserFormHelper');
111 $userFormHelper->assignRoleContent($templateMgr, $request);
113 $templateMgr->assign(array(
114 'source' =>$request->getUserVar(
'source'),
115 'minPasswordLength' => $site->getMinPasswordLength(),
116 'enableSiteWidePrivacyStatement' =>
Config::getVar(
'general',
'sitewide_privacy_statement'),
117 'siteWidePrivacyStatement' => $site->getData(
'privacyStatement'),
120 return parent::fetch($request, $template, $display);
127 $this->_data = array(
128 'userLocales' => array(),
129 'userGroupIds' => array(),
137 parent::readInputData();
155 if ($this->captchaEnabled) {
157 'g-recaptcha-response',
162 $this->
setData(
'userGroupIds', array_merge(
163 array_keys((array) $this->
getData(
'readerGroup')),
164 array_keys((array) $this->
getData(
'reviewerGroup'))
171 function validate($callHooks =
true) {
176 if (!$request->getContext()) {
178 if ($request->getSite()->getData(
'privacyStatement')) {
179 $privacyConsent = $this->
getData(
'privacyConsent');
180 if (!is_array($privacyConsent) || !array_key_exists(CONTEXT_ID_NONE, $privacyConsent)) {
181 $this->
addError(
'privacyConsent[' . CONTEXT_ID_NONE .
']', __(
'user.register.form.missingSiteConsent'));
187 $contextIds = array();
188 foreach ($this->
getData(
'userGroupIds') as $userGroupId) {
189 $userGroup = $userGroupDao->getById($userGroupId);
190 $contextIds[] = $userGroup->getContextId();
193 $contextIds = array_unique($contextIds);
194 if (!empty($contextIds)) {
195 $contextDao = Application::getContextDao();
196 $privacyConsent = (array) $this->
getData(
'privacyConsent');
197 foreach ($contextIds as $contextId) {
198 $context = $contextDao->getById($contextId);
199 if ($context->getData(
'privacyStatement') && !array_key_exists($contextId, $privacyConsent)) {
200 $this->
addError(
'privacyConsent[' . $contextId .
']', __(
'user.register.form.missingContextConsent'));
208 return parent::validate($callHooks);
215 function execute(...$functionArgs) {
216 $requireValidation =
Config::getVar(
'email',
'require_validation');
220 $this->user =
$user = $userDao->newDataObject();
227 $site = $request->getSite();
228 $sitePrimaryLocale = $site->getPrimaryLocale();
232 $user->setGivenName($this->
getData(
'givenName'), $currentLocale);
233 $user->setFamilyName($this->
getData(
'familyName'), $currentLocale);
235 $user->setCountry($this->
getData(
'country'));
236 $user->setAffiliation($this->
getData(
'affiliation'), $currentLocale);
238 if ($sitePrimaryLocale != $currentLocale) {
239 $user->setGivenName($this->
getData(
'givenName'), $sitePrimaryLocale);
240 $user->setFamilyName($this->
getData(
'familyName'), $sitePrimaryLocale);
241 $user->setAffiliation($this->
getData(
'affiliation'), $sitePrimaryLocale);
245 $user->setInlineHelp(1);
247 if (isset($this->defaultAuth)) {
250 $this->defaultAuth->doCreateUser(
$user);
251 $user->setAuthId($this->defaultAuth->authId);
255 if ($requireValidation) {
258 $user->setDisabled(
true);
259 $user->setDisabledReason(__(
'user.login.accountNotValidated', array(
'email' => $this->
getData(
'email'))));
262 parent::execute(...$functionArgs);
264 $userDao->insertObject(
$user);
265 $userId =
$user->getId();
272 $session = $sessionManager->getUserSession();
273 $session->setSessionVar(
'username',
$user->getUsername());
276 if ($request->getContext() && !$this->getData(
'reviewerGroup')) {
278 $defaultReaderGroup = $userGroupDao->getDefaultByRoleId($request->getContext()->getId(), ROLE_ID_READER);
279 if ($defaultReaderGroup) $userGroupDao->assignUserToGroup(
$user->getId(), $defaultReaderGroup->getId(), $request->getContext()->getId());
281 import(
'lib.pkp.classes.user.form.UserFormHelper');
283 $userFormHelper->saveRoleContent($this,
$user);
287 if ($request->getContext() && !$this->getData(
'emailConsent')) {
290 import(
'classes.notification.form.NotificationSettingsForm');
292 $notificationCategories = $notificationSettingsForm->getNotificationSettingCategories();
293 foreach ($notificationCategories as $notificationCategory) {
294 if ($notificationCategory[
'categoryKey'] ===
'notification.type.public') {
295 $publicNotifications = $notificationCategory[
'settings'];
298 if (isset($publicNotifications)) {
299 $notificationSubscriptionSettingsDao =
DAORegistry::getDAO(
'NotificationSubscriptionSettingsDAO');
300 $notificationSubscriptionSettingsDao->updateNotificationSubscriptionSettings(
301 'blocked_emailed_notification',
302 $publicNotifications,
304 $request->getContext()->getId()
310 import(
'lib.pkp.classes.user.InterestManager');
312 $interestManager->setInterestsForUser(
$user, $this->
getData(
'interests'));
314 import(
'lib.pkp.classes.mail.MailTemplate');
315 if ($requireValidation) {
317 import(
'lib.pkp.classes.security.AccessKeyManager');
319 $accessKey = $accessKeyManager->createKey(
'RegisterContext',
$user->getId(),
null,
Config::getVar(
'email',
'validation_timeout'));
324 $context = $request->getContext();
325 $contextPath = $context ? $context->getPath() :
null;
326 $mail->assignParams(array(
327 'userFullName' =>
$user->getFullName(),
328 'contextName' => $context ? $context->getLocalizedName() : $site->getLocalizedTitle(),
329 'activateUrl' => $request->url($contextPath,
'user',
'activateUser', array($this->
getData(
'username'), $accessKey))
331 $mail->addRecipient(
$user->getEmail(),
$user->getFullName());
332 if (!$mail->send()) {
333 import(
'classes.notification.NotificationManager');
335 $notificationMgr->createTrivialNotification(
$user->getId(), NOTIFICATION_TYPE_ERROR, array(
'contents' => __(
'email.compose.error')));
348 $site = $request->getSite();
349 $context = $request->getContext();
352 if ($context && $context->getData(
'supportEmail')) {
353 $mail->setReplyTo($context->getData(
'supportEmail'), $context->getData(
'supportName'));
355 $mail->setReplyTo($site->getLocalizedContactEmail(), $site->getLocalizedContactName());