Improved registration logic, localized registration page.

This commit is contained in:
Exynox 2024-12-31 20:07:28 +02:00
parent 00e2a43015
commit 561ab7ea97
5 changed files with 149 additions and 32 deletions

View File

@ -35,8 +35,9 @@ protected function validator(array $data): \Illuminate\Validation\Validator
/** /**
* Create a new user instance after a valid registration. * Create a new user instance after a valid registration.
* *
* @param array $data * @param array $data
* @return Account * @return Account
* @throws \Throwable
*/ */
protected function create(array $data): Account protected function create(array $data): Account
{ {
@ -50,6 +51,35 @@ protected function create(array $data): Account
return $account; return $account;
} }
/**
* Executes the registration logic on a validator input
*
* @param \Illuminate\Validation\Validator $validator
* @return RedirectResponse
* @throws ValidationException
* @throws \Throwable
*/
protected function runRegistrationLogic(\Illuminate\Validation\Validator $validator): RedirectResponse
{
// Validate the input
if ($validator->fails()) {
return redirect('user/register')
->withErrors($validator)
->withInput($validator->getData());
}
// Retrieve the validated input
$validated = $validator->validated();
// Attempt to create the account and emit the event
event(new Registered($user = $this->create($validated)));
// Authenticate the user
Auth::guard()->login($user);
return redirect('user/verification/notice');
}
/** /**
* Show the application registration form. * Show the application registration form.
* *
@ -65,16 +95,31 @@ public function showRegistrationForm(): View
* *
* @param Request $request * @param Request $request
* @return RedirectResponse * @return RedirectResponse
* @throws ValidationException * @throws \Throwable
*/ */
public function register(Request $request) public function register(Request $request): RedirectResponse
{ {
$this->validator($request->all())->validate(); $validator = $this->validator($request->all());
return $this->runRegistrationLogic($validator);
}
event(new Registered($user = $this->create($request->all()))); /**
* Handle a registration request for the application.
*
* @param Request $request
* @return RedirectResponse
* @throws \Throwable
*/
public function registerFromHeader(Request $request): RedirectResponse
{
$requestData = $request->all();
$validator = $this->validator([
'login' => $requestData['header-form-login'] ?? null,
'email' => $requestData['header-form-email'] ?? null,
'password' => $requestData['header-form-password'] ?? null,
'tac' => $requestData['header-form-tac'] ?? null,
]);
Auth::guard()->login($user); return $this->runRegistrationLogic($validator);
return redirect('user/verification/notice');
} }
} }

31
lang/en/app/register.php Normal file
View File

@ -0,0 +1,31 @@
<?php
return [
'title' => 'Register',
'subtitle' => 'Create an account',
'progress-texts.register' => 'Register',
'progress-texts.activate-download' => 'Activate and download',
'progress-texts.install-play' => 'Install and play',
'to-login' => 'or Login',
'form.username' => 'Username',
'form.email' => 'Email',
'form.password' => 'Password',
'form.password-requirements' => 'Requirements',
'form.terms-and-conditions' => 'I have read the [**Terms and Conditions**](:termsUrl) and the [**Privacy Policy**](:privacyUrl) and accept them.',
'form.password-info.header' => 'A safe password must contain',
'form.password-info.rule-1' => 'between 5 and 16 characters',
'form.password-info.rule-2' => 'or at least one lowercase letter',
'form.password-info.rule-3' => 'at least one uppercase letter',
'form.password-info.rule-4' => 'at least one digit',
'form.password-info.rule-5' => 'at least one special character',
'form.password-info.special-chars' => 'Allowed special characters',
'form.password-security' => "Your password's security level",
'form.required' => '* is required',
'form.register-btn' => 'Register',
];

31
lang/ro/app/register.php Normal file
View File

@ -0,0 +1,31 @@
<?php
return [
'title' => 'Înregistrare',
'subtitle' => 'Creează un cont',
'progress-texts.register' => 'Înregistrare',
'progress-texts.activate-download' => 'Activează și descarcă',
'progress-texts.install-play' => 'Instalează și joacă-te',
'to-login' => 'sau Autentifică-te',
'form.username' => 'Nume de utilizator',
'form.email' => 'Email',
'form.password' => 'Parola',
'form.password-requirements' => 'Reguli parolă',
'form.terms-and-conditions' => 'Am citit [**Termenii și Condițiile**](:termsUrl) și [**Politica de Confidențialitate**](:privacyUrl), și le accept.',
'form.password-info.header' => 'O parolă sigură conține',
'form.password-info.rule-1' => 'între 5 și 16 caractere',
'form.password-info.rule-2' => 'sau cel puțin o literă mică',
'form.password-info.rule-3' => 'cel puțin o literă mare',
'form.password-info.rule-4' => 'cel puțin o cifră',
'form.password-info.rule-5' => 'cel puțin un caracter special',
'form.password-info.special-chars' => 'Caractere speciale permise',
'form.password-security' => 'Nivelul de securitate al parolei tale',
'form.required' => '* este necesar',
'form.register-btn' => 'Înregistrare',
];

View File

@ -1,8 +1,8 @@
<div id="progressTracker"> <div id="progressTracker">
@php($progressTexts = [ @php($progressTexts = [
1 => 'Înregistrare', 1 => __('app/register.progress-texts.register'),
2 => 'Activează și descarcă', 2 => __('app/register.progress-texts.activate-download'),
3 => 'Instalează și joacă-te', 3 => __('app/register.progress-texts.install-play'),
]) ])
@for ($i = 1; $i <= 3; $i++) @for ($i = 1; $i <= 3; $i++)

View File

@ -6,36 +6,42 @@
<div class="content content-last"> <div class="content content-last">
<div class="content-bg"> <div class="content-bg">
<div class="content-bg-bottom"> <div class="content-bg-bottom">
<h2>Înregistrarea</h2> <h2>{{ __('app/register.title') }}</h2>
<x-registration.progress :step="1" /> <x-registration.progress :step="1" />
<div class="inner-form-border"> <div class="inner-form-border">
<div class="inner-form-box"> <div class="inner-form-box">
<h3><a id="toLogin" href="{{ url('user/login') }}" title="sau la autentificare">sau la autentificare</a>Creează un cont</h3> <h3>
<a id="toLogin" href="{{ url('user/login') }}" title="{{ __('app/register.to-login') }}">{{ __('app/register.to-login') }}</a>
{{ __('app/register.title') }}
</h3>
<div class="trenner"></div> <div class="trenner"></div>
<form name="registerForm" id="registerForm" method="post" action="{{ url('user/register') }}"> <form name="registerForm" id="registerForm" method="post" action="{{ url('user/register') }}">
@csrf @csrf
<div> <div>
<label for="username">Nume de utilizator: *</label> <label for="username">{{ __('app/register.form.username') }}: *</label>
<input type="text" class="validate[required,custom[noSpecialCharacters],length[5,16]]" id="username" name="login" title="" value="" maxlength="16"/> <input type="text" class="validate[required,custom[noSpecialCharacters],length[5,16]]" id="username" name="login" title="" value="{{ old('login') }}" maxlength="16" />
</div> </div>
<div> <div>
<label for="email">Email: *</label> <label for="email">{{ __('app/register.form.email') }}: *</label>
<input type="text" class="validate[required,custom[email]]" id="email" name="email" maxlength="64" title="" value=""/> <input type="text" class="validate[required,custom[email]]" id="email" name="email" maxlength="64" title="" value="{{ old('email') }}" />
</div> </div>
<div id="pwField"> <div id="pwField">
<div id="pwInfo"> <div id="pwInfo">
<h3><img src="{{ asset('assets/main/img/help.gif') }}" alt="Reguli parolă" title="Reguli parolă"/> O parolă sigură conţină:</h3> <h3>
<img src="{{ asset('assets/main/img/help.gif') }}" alt="{{ __('app/register.form.password-requirements') }}" title="{{ __('app/register.form.password-requirements') }}"/>
{{ __('app/register.form.password-info.header') }}:
</h3>
<ul> <ul>
<li>între 5 și 16 caractere</li> <li>{{ __('app/register.form.password-info.rule-1') }}</li>
<li>sau cel puțin o literă mică</li> <li>{{ __('app/register.form.password-info.rule-2') }}</li>
<li>cel puțin o literă mare</li> <li>{{ __('app/register.form.password-info.rule-3') }}</li>
<li>cel puțin un număr</li> <li>{{ __('app/register.form.password-info.rule-4') }}</li>
<li>cel puțin un caracter special</li> <li>{{ __('app/register.form.password-info.rule-5') }}</li>
</ul> </ul>
<p><strong>Caractere speciale permise</strong>:<br/> <p><strong>{{ __('app/register.form.password-info.special-chars') }}</strong>:<br/>
@ ! # $ % &amp; ( ) { } * + ,<br/> @ ! # $ % &amp; ( ) { } * + ,<br/>
- . / : ; &lt; &gt; = ? [ ] ^ _ | ~ - . / : ; &lt; &gt; = ? [ ] ^ _ | ~
</p> </p>
@ -53,13 +59,15 @@
}); });
</script> </script>
</div> </div>
<label for="password">Parola: * <label for="password">{{ __('app/register.form.password') }}: *
<span id="toPwInfo" title="Reguli parolă">Reguli parolă <img src="{{ asset('assets/main/img/help.gif') }}" alt="Reguli parolă" title="Reguli parolă"/> <span id="toPwInfo" title="{{ __('app/register.form.password-requirements') }}">
</span> {{ __('app/register.form.password-requirements') }}
<img src="{{ asset('assets/main/img/help.gif') }}" alt="{{ __('app/register.form.password-requirements') }}" title="{{ __('app/register.form.password-requirements') }}" />
</span>
</label> </label>
<input type="password" class="validate[required,custom[onlyValidPasswordCharacters],length[5,16]]" id="password" name="password" maxlength="16" value=""/> <input type="password" class="validate[required,custom[onlyValidPasswordCharacters],length[5,16]]" id="password" name="password" maxlength="16" value="" />
<div id="securePwd"> <div id="securePwd">
<p>Nivelul de securitate al parolei voastre:</p> <p>{{ __('app/register.form.password-security') }}:</p>
<div class="valid-icon invalid"></div> <div class="valid-icon invalid"></div>
<div class="securePwdBarBox"> <div class="securePwdBarBox">
<div id="securePwdBar"></div> <div id="securePwdBar"></div>
@ -69,9 +77,11 @@
</div> </div>
<div id="checkerror"> <div id="checkerror">
<input type="checkbox" class="validate[required]" id="tac" name="tac" value="tac"/> <input type="checkbox" class="validate[required]" id="tac" name="tac" value="tac"/>
<span>Am citit <a href="{{ url('legal/terms') }}" target="_blank"><strong>Termenii și Condițiile</strong></a> și <a href="{{ url('legal/privacy') }}" target="_blank"><strong>Declarația privind protecția datelor</strong></a>. *</span> <span>
{!! Str::inlineMarkdown(__('app/register.form.terms-and-conditions', ['termsUrl' => url('legal/terms'), 'privacyUrl' => url('legal/privacy')])) !!} *
</span>
</div> </div>
<input id="submitBtn" type="submit" name="SubmitRegisterForm" value="Înregistrare" class="btn-big"/> <input id="submitBtn" type="submit" value="{{ __('app/register.form.register-btn') }}" class="btn-big"/>
<script type="text/javascript"> <script type="text/javascript">
@error('login') @error('login')
@ -88,7 +98,7 @@
@enderror @enderror
</script> </script>
</form> </form>
<p id="regLegend">* este necesar</p> <p id="regLegend">{{ __('app/register.form.required') }}</p>
</div> </div>
</div> </div>
</div> </div>