chg: dev: add consent checkbox to user's registration - and fix the sharing pics #4
All checks were successful
Deploy to Production / deploy (push) Successful in 15s
All checks were successful
Deploy to Production / deploy (push) Successful in 15s
This commit is contained in:
@@ -78,6 +78,9 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, TotpTwo
|
||||
#[Column(length: 255, nullable: true)]
|
||||
private ?string $avatarPath = null;
|
||||
|
||||
#[Column(nullable: true)]
|
||||
private ?bool $consentGiven = null;
|
||||
|
||||
|
||||
public function getId(): ?int
|
||||
{
|
||||
@@ -243,4 +246,15 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface, TotpTwo
|
||||
$this->backupCodes = $backupCodes;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function isConsentGiven(): ?bool
|
||||
{
|
||||
return $this->consentGiven;
|
||||
}
|
||||
|
||||
public function setConsentGiven(?bool $consentGiven): self
|
||||
{
|
||||
$this->consentGiven = $consentGiven;
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ namespace App\Form;
|
||||
|
||||
use App\Entity\User;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\EmailType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
|
||||
@@ -19,6 +20,7 @@ use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
use Symfony\Component\Validator\Constraints\Email;
|
||||
use Symfony\Component\Validator\Constraints\IsTrue;
|
||||
use Symfony\Component\Validator\Constraints\Length;
|
||||
use Symfony\Component\Validator\Constraints\NotBlank;
|
||||
|
||||
@@ -68,6 +70,13 @@ class RegistrationFormType extends AbstractType
|
||||
),
|
||||
],
|
||||
])
|
||||
->add('consentGiven', CheckboxType::class, [
|
||||
'label' => 'I have read the Privacy and Data Processing Policy and I consent to the processing of my data.',
|
||||
'mapped' => true,
|
||||
'constraints' => [
|
||||
new IsTrue(message: 'You must agree to the privacy policy to create an account.'),
|
||||
],
|
||||
])
|
||||
->add('recaptcha', RecaptchaType::class);
|
||||
}
|
||||
|
||||
|
||||
42
src/Migrations/2026/04/Version20260416094849.php
Normal file
42
src/Migrations/2026/04/Version20260416094849.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?php declare(strict_types=1);
|
||||
/**
|
||||
* This file is part of the SplendidBear Websites' projects.
|
||||
*
|
||||
* Copyright (c) 2026 @ www.splendidbear.org
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace App\Migrations;
|
||||
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
use Doctrine\Migrations\AbstractMigration;
|
||||
|
||||
/**
|
||||
* Class Version20260416094849
|
||||
*
|
||||
* @package App\Migrations
|
||||
* @author Lang <https://www.splendidbear.org>
|
||||
* @category Class
|
||||
* @license https://www.gnu.org/licenses/lgpl-3.0.en.html GNU Lesser General Public License
|
||||
* @link www.splendidbear.org
|
||||
* @since 2026. 04. 16.
|
||||
*/
|
||||
final class Version20260416094849 extends AbstractMigration
|
||||
{
|
||||
public function getDescription(): string
|
||||
{
|
||||
return 'Add consent property to user entity for GDPR compliance';
|
||||
}
|
||||
|
||||
public function up(Schema $schema): void
|
||||
{
|
||||
$this->addSql('ALTER TABLE app_user ADD consent_given BOOLEAN DEFAULT NULL');
|
||||
}
|
||||
|
||||
public function down(Schema $schema): void
|
||||
{
|
||||
$this->addSql('ALTER TABLE app_user DROP consent_given');
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block title %} - The Game{% endblock %}
|
||||
|
||||
{% block metas %}
|
||||
{%- set _ogImage = app.request.getSchemeAndHttpHost() ~ asset('images/mine-1600x627.png') -%}
|
||||
{%- set _ogImage = 'https://' ~ app.request.host ~ asset('/images/mine-1600x627.png') -%}
|
||||
<meta property="og:url" content="{{ url('MineSeekerBundle_homepage') | replace({'http://': 'https://'}) }}"/>
|
||||
<meta property="og:type" content="website"/>
|
||||
<meta property="og:site_name" content="MineSeeker"/>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<meta property="og:title" content="Your friend challenges YOU!"/>
|
||||
<meta property="og:description" content="Do you accept the challenge?"/>
|
||||
<meta property="og:image"
|
||||
content="{{ app.request.getSchemeAndHttpHost() }}{{ asset('/images/mine-1600x627.png') }}"/>
|
||||
content="https://{{ app.request.host }}{{ asset('/images/mine-1600x627.png') }}"/>
|
||||
{% endblock %}
|
||||
|
||||
{% block stylesheets %}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block title %} - Contact{% endblock %}
|
||||
|
||||
{% block metas %}
|
||||
{%- set _ogImage = app.request.getSchemeAndHttpHost() ~ asset('images/mine-1600x627.png') -%}
|
||||
{%- set _ogImage = 'https://' ~ app.request.host ~ asset('/images/mine-1600x627.png') -%}
|
||||
<meta property="og:url" content="{{ url('MineSeekerBundle_contact') | replace({'http://': 'https://'}) }}"/>
|
||||
<meta property="og:type" content="website"/>
|
||||
<meta property="og:site_name" content="MineSeeker"/>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block title %} - Privacy Policy{% endblock %}
|
||||
|
||||
{% block metas %}
|
||||
{%- set _ogImage = app.request.getSchemeAndHttpHost() ~ asset('images/mine-1600x627.png') -%}
|
||||
{%- set _ogImage = 'https://' ~ app.request.host ~ asset('/images/mine-1600x627.png') -%}
|
||||
<meta property="og:url" content="{{ url('MineSeekerBundle_privacy') | replace({'http://': 'https://'}) }}"/>
|
||||
<meta property="og:type" content="website"/>
|
||||
<meta property="og:site_name" content="MineSeeker"/>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block title %} - Terms of Service{% endblock %}
|
||||
|
||||
{% block metas %}
|
||||
{%- set _ogImage = app.request.getSchemeAndHttpHost() ~ asset('images/mine-1600x627.png') -%}
|
||||
{%- set _ogImage = 'https://' ~ app.request.host ~ asset('/images/mine-1600x627.png') -%}
|
||||
<meta property="og:url" content="{{ url('MineSeekerBundle_terms') | replace({'http://': 'https://'}) }}"/>
|
||||
<meta property="og:type" content="website"/>
|
||||
<meta property="og:site_name" content="MineSeeker"/>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block title %} - Forgot Password{% endblock %}
|
||||
|
||||
{% block metas %}
|
||||
{%- set _ogImage = app.request.getSchemeAndHttpHost() ~ asset('images/mine-1600x627.png') -%}
|
||||
{%- set _ogImage = 'https://' ~ app.request.host ~ asset('/images/mine-1600x627.png') -%}
|
||||
<meta name="robots" content="noindex,nofollow"/>
|
||||
<meta property="og:url" content="{{ app.request.uri }}"/>
|
||||
<meta property="og:type" content="website"/>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block title %} - Sign In{% endblock %}
|
||||
|
||||
{% block metas %}
|
||||
{%- set _ogImage = app.request.getSchemeAndHttpHost() ~ asset('images/mine-1600x627.png') -%}
|
||||
{%- set _ogImage = 'https://' ~ app.request.host ~ asset('/images/mine-1600x627.png') -%}
|
||||
<meta name="robots" content="noindex,nofollow"/>
|
||||
<meta property="og:url" content="{{ app.request.uri }}"/>
|
||||
<meta property="og:type" content="website"/>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block title %} - Profile{% endblock %}
|
||||
|
||||
{% block metas %}
|
||||
{%- set _ogImage = app.request.getSchemeAndHttpHost() ~ asset('images/mine-1600x627.png') -%}
|
||||
{%- set _ogImage = 'https://' ~ app.request.host ~ asset('/images/mine-1600x627.png') -%}
|
||||
<meta name="robots" content="noindex,nofollow"/>
|
||||
<meta property="og:url" content="{{ url('MineSeekerBundle_profile') | replace({'http://': 'https://'}) }}"/>
|
||||
<meta property="og:type" content="profile"/>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block title %} - Security Settings{% endblock %}
|
||||
|
||||
{% block metas %}
|
||||
{%- set _ogImage = app.request.getSchemeAndHttpHost() ~ asset('images/mine-1600x627.png') -%}
|
||||
{%- set _ogImage = 'https://' ~ app.request.host ~ asset('/images/mine-1600x627.png') -%}
|
||||
<meta name="robots" content="noindex,nofollow"/>
|
||||
<meta property="og:url" content="{{ url('MineSeekerBundle_profile_security') | replace({'http://': 'https://'}) }}"/>
|
||||
<meta property="og:type" content="website"/>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block title %} - Register{% endblock %}
|
||||
|
||||
{% block metas %}
|
||||
{%- set _ogImage = app.request.getSchemeAndHttpHost() ~ asset('images/mine-1600x627.png') -%}
|
||||
{%- set _ogImage = 'https://' ~ app.request.host ~ asset('/images/mine-1600x627.png') -%}
|
||||
<meta property="og:url" content="{{ app.request.uri }}"/>
|
||||
<meta property="og:type" content="website"/>
|
||||
<meta property="og:site_name" content="MineSeeker"/>
|
||||
@@ -117,6 +117,25 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="auth-field">
|
||||
<label class="auth-checkbox-label" style="display: flex; align-items: flex-start; cursor: pointer; user-select: none;">
|
||||
{{ form_widget(form.consentGiven, {
|
||||
attr: {
|
||||
class: 'auth-checkbox',
|
||||
style: 'margin-right: 10px; margin-top: 3px;'
|
||||
}
|
||||
}) }}
|
||||
<span style="flex: 1; font-size: 14px; line-height: 1.5; color: #666;">
|
||||
I have read the <a href="{{ path('MineSeekerBundle_privacy') }}" target="_blank" style="color: #667eea; text-decoration: none;">Privacy and Data Processing Policy</a> and I consent to the processing of my data. *
|
||||
</span>
|
||||
</label>
|
||||
{% if not form.consentGiven.vars.valid %}
|
||||
{% for error in form.consentGiven.vars.errors %}
|
||||
<p class="auth-field-error"><i class="fas fa-circle-exclamation"></i> {{ error.message }}</p>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<button type="submit" class="auth-submit">
|
||||
<i class="fas fa-user-plus"></i> Create Account
|
||||
</button>
|
||||
|
||||
Reference in New Issue
Block a user