Private
Public Access
1
0

chg: dev: refactor all forms to have Symfony Form Types & Validation Constrainsts - & implement Google ReCapthca v3 #4

This commit is contained in:
2026-04-12 08:49:47 +02:00
parent e2b227ed7a
commit acbe9c7f63
21 changed files with 1253 additions and 351 deletions

View File

@@ -3,118 +3,133 @@
{% block title %} - Register{% endblock %}
{% block body %}
<div class="auth-page">
<div class="auth-page">
{% for email in app.flashes('verify_email') %}
<div class="auth-card auth-card--sent">
<div class="auth-sent-icon"><i class="fa fa-envelope-o"></i></div>
<h2 class="auth-title">Check your inbox</h2>
<p class="auth-sub">We sent an activation link to</p>
<p class="auth-sent-email">{{ email }}</p>
<p class="auth-sent-note">
Click the link in the email to activate your account.<br>
The link expires in <strong>24 hours</strong>.
</p>
<a
href="{{ path('MineSeekerBundle_login') }}"
class="auth-submit"
style="text-decoration:none; margin-top:16px;"
>
Go to Sign In
</a>
</div>
{% else %}
<div class="auth-card">
<h2 class="auth-title">Create Account</h2>
<p class="auth-sub">Join the battle — no subscription required</p>
{% for email in app.flashes('verify_email') %}
<div class="auth-card auth-card--sent">
<div class="auth-sent-icon"><i class="fa fa-envelope-o"></i></div>
<h2 class="auth-title">Check your inbox</h2>
<p class="auth-sub">We sent an activation link to</p>
<p class="auth-sent-email">{{ email }}</p>
<p class="auth-sent-note">
Click the link in the email to activate your account.<br>
The link expires in <strong>24 hours</strong>.
</p>
<a href="{{ path('MineSeekerBundle_login') }}" class="auth-submit" style="text-decoration:none; margin-top:16px;">
Go to Sign In
</a>
</div>
{% else %}
{{ form_start(form, {attr: {class: 'auth-form'}}) }}
<div class="auth-card">
<h2 class="auth-title">Create Account</h2>
<p class="auth-sub">Join the battle — no subscription required</p>
<div class="auth-field">
<label for="{{ form.username.vars.id }}" class="auth-label">Username</label>
<div class="auth-input-wrap">
<i class="fa fa-user auth-input-icon"></i>
{{ form_widget(form.username, {
attr: {
class: 'auth-input' ~ (not form.username.vars.valid ? ' auth-input--error' : ''),
autocomplete: 'username',
autofocus: true,
minlength: '3',
}
}) }}
</div>
{% if not form.username.vars.valid %}
{% for error in form.username.vars.errors %}
<p class="auth-field-error"><i class="fa fa-exclamation-circle"></i> {{ error.message }}</p>
{% endfor %}
{% endif %}
</div>
<form class="auth-form" method="post" action="{{ path('MineSeekerBundle_register') }}">
<div class="auth-field">
<label for="{{ form.email.vars.id }}" class="auth-label">Email</label>
<div class="auth-input-wrap">
<i class="fa fa-envelope auth-input-icon"></i>
{{ form_widget(form.email, {
attr: {
class: 'auth-input' ~ (not form.email.vars.valid ? ' auth-input--error' : ''),
autocomplete: 'email',
}
}) }}
</div>
{% if not form.email.vars.valid %}
{% for error in form.email.vars.errors %}
<p class="auth-field-error"><i class="fa fa-exclamation-circle"></i> {{ error.message }}</p>
{% endfor %}
{% endif %}
</div>
<div class="auth-field">
<label for="username" class="auth-label">Username</label>
<div class="auth-input-wrap">
<i class="fa fa-user auth-input-icon"></i>
<input
type="text"
id="username"
name="_username"
class="auth-input{% if errors.username is defined %} auth-input--error{% endif %}"
value="{{ last_username }}"
autocomplete="username"
autofocus
required
minlength="3"
/>
</div>
{% if errors.username is defined %}
<p class="auth-field-error"><i class="fa fa-exclamation-circle"></i> {{ errors.username }}</p>
{% endif %}
</div>
<div class="auth-field">
<label for="{{ form.plainPassword.first.vars.id }}" class="auth-label">Password</label>
<div class="auth-input-wrap">
<i class="fa fa-lock auth-input-icon"></i>
{{ form_widget(form.plainPassword.first, {
attr: {
class: 'auth-input' ~ (not form.plainPassword.vars.valid ? ' auth-input--error' : ''),
autocomplete: 'new-password',
minlength: '6',
}
}) }}
</div>
{% if not form.plainPassword.vars.valid %}
{% for error in form.plainPassword.vars.errors %}
<p class="auth-field-error"><i class="fa fa-exclamation-circle"></i> {{ error.message }}</p>
{% endfor %}
{% endif %}
</div>
<div class="auth-field">
<label for="email" class="auth-label">Email</label>
<div class="auth-input-wrap">
<i class="fa fa-envelope auth-input-icon"></i>
<input
type="email"
id="email"
name="_email"
class="auth-input{% if errors.email is defined %} auth-input--error{% endif %}"
value="{{ last_email }}"
autocomplete="email"
required
/>
</div>
{% if errors.email is defined %}
<p class="auth-field-error"><i class="fa fa-exclamation-circle"></i> {{ errors.email }}</p>
{% endif %}
</div>
<div class="auth-field">
<label for="{{ form.plainPassword.second.vars.id }}" class="auth-label">Confirm Password</label>
<div class="auth-input-wrap">
<i class="fa fa-lock auth-input-icon"></i>
{{ form_widget(form.plainPassword.second, {
attr: {
class: 'auth-input' ~ (not form.plainPassword.vars.valid ? ' auth-input--error' : ''),
autocomplete: 'new-password',
}
}) }}
</div>
</div>
<div class="auth-field">
<label for="password" class="auth-label">Password</label>
<div class="auth-input-wrap">
<i class="fa fa-lock auth-input-icon"></i>
<input
type="password"
id="password"
name="_password"
class="auth-input{% if errors.password is defined %} auth-input--error{% endif %}"
autocomplete="new-password"
required
minlength="6"
/>
</div>
{% if errors.password is defined %}
<p class="auth-field-error"><i class="fa fa-exclamation-circle"></i> {{ errors.password }}</p>
{% endif %}
</div>
<button type="submit" class="auth-submit">
<i class="fa fa-user-plus"></i> Create Account
</button>
<div class="auth-field">
<label for="password_confirm" class="auth-label">Confirm Password</label>
<div class="auth-input-wrap">
<i class="fa fa-lock auth-input-icon"></i>
<input
type="password"
id="password_confirm"
name="_password_confirm"
class="auth-input{% if errors.password_confirm is defined %} auth-input--error{% endif %}"
autocomplete="new-password"
required
/>
</div>
{% if errors.password_confirm is defined %}
<p class="auth-field-error"><i class="fa fa-exclamation-circle"></i> {{ errors.password_confirm }}</p>
{% endif %}
</div>
{{ form_end(form) }}
<button type="submit" class="auth-submit">
<i class="fa fa-user-plus"></i> Create Account
</button>
</form>
<p class="auth-switch">
Already have an account?
<a href="{{ path('MineSeekerBundle_login') }}">Sign in</a>
</p>
</div>
{% endfor %}
</div>
{% endblock %}
<p class="auth-switch">
Already have an account?
<a href="{{ path('MineSeekerBundle_login') }}">Sign in</a>
</p>
</div>
{% endfor %}
</div>
{% endblock %}
{% block javascripts %}
{{ parent() }}
<script src="https://www.google.com/recaptcha/api.js?render={{ recaptcha_site_key }}" async defer></script>
<script>
(function () {
const form = document.querySelector('.auth-form');
if (!form) return;
form.addEventListener('submit', function (e) {
e.preventDefault();
grecaptcha.ready(function () {
grecaptcha.execute('{{ recaptcha_site_key }}', {action: 'register'}).then(function (token) {
document.getElementById('{{ form.recaptcha.vars.id }}').value = token;
form.submit();
});
});
});
}());
</script>
{% endblock %}