- Inscription sans redirection HelloAsso (acte volontaire séparé) - Génération automatique d'identifiant AlpID (prenom.code mnémotechnique) - Profil en tuiles : identité, compte, mot de passe, OTP, adhésion, adresse, connexions - Double authentification : activation/suppression OTP via Keycloak - Page d'accueil contextuelle (bienvenue si connecté, CTA adhésion si non adhérent) - Historique des connexions avec statistiques et graphiques Chart.js - Géocodage Nominatim + lien OpenStreetMap pour l'adresse - HelloAsso : checkout intent, validation paiement, mise à jour Dolibarr Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
135 lines
4.7 KiB
PHP
135 lines
4.7 KiB
PHP
<?php
|
|
require_once __DIR__ . '/inc/config.php';
|
|
require_once __DIR__ . '/inc/auth.php';
|
|
require_once __DIR__ . '/inc/keycloak.php';
|
|
|
|
session_start_safe();
|
|
|
|
if (current_user()) {
|
|
header('Location: /profile.php');
|
|
exit;
|
|
}
|
|
|
|
$errors = [];
|
|
$form = ['email' => '', 'first_name' => '', 'last_name' => ''];
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$form = [
|
|
'email' => trim($_POST['email'] ?? ''),
|
|
'first_name' => trim($_POST['first_name'] ?? ''),
|
|
'last_name' => trim($_POST['last_name'] ?? ''),
|
|
];
|
|
$password = $_POST['password'] ?? '';
|
|
$password2 = $_POST['password2'] ?? '';
|
|
|
|
if (!$form['email'] || !$form['first_name'] || !$form['last_name'] || !$password) {
|
|
$errors[] = 'Tous les champs sont obligatoires.';
|
|
}
|
|
if ($password !== $password2) {
|
|
$errors[] = 'Les mots de passe ne correspondent pas.';
|
|
}
|
|
if (strlen($password) < 8) {
|
|
$errors[] = 'Le mot de passe doit contenir au moins 8 caractères.';
|
|
}
|
|
if (!filter_var($form['email'], FILTER_VALIDATE_EMAIL)) {
|
|
$errors[] = 'Adresse email invalide.';
|
|
}
|
|
|
|
if (!$errors) {
|
|
try {
|
|
$username = kc_generate_username($form['last_name'], $form['first_name']);
|
|
kc_create_user($username, $form['email'], $form['first_name'], $form['last_name'], $password);
|
|
set_flash('success', "Compte créé. Votre identifiant AlpID est : $username");
|
|
header('Location: /auth/login.php');
|
|
exit;
|
|
} catch (KcUserExistsException $e) {
|
|
$errors[] = $e->getMessage();
|
|
} catch (Exception $e) {
|
|
$errors[] = 'Erreur : ' . $e->getMessage();
|
|
}
|
|
}
|
|
}
|
|
|
|
$title = 'Inscription';
|
|
require __DIR__ . '/views/layout.php';
|
|
?>
|
|
|
|
<div class="card">
|
|
<h1>Créer mon compte AlpID</h1>
|
|
<p class="subtitle">Créez votre compte pour accéder aux services Alpinux. L'adhésion se fait ensuite volontairement depuis votre profil.</p>
|
|
|
|
<?php if ($errors): ?>
|
|
<div class="alert alert-error">
|
|
<ul><?php foreach ($errors as $e): ?><li><?= htmlspecialchars($e) ?></li><?php endforeach; ?></ul>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<form method="post" novalidate>
|
|
<div class="form-row">
|
|
<div class="form-group">
|
|
<label for="first_name">Prénom</label>
|
|
<input type="text" id="first_name" name="first_name" required autofocus
|
|
value="<?= htmlspecialchars($form['first_name']) ?>">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="last_name">Nom</label>
|
|
<input type="text" id="last_name" name="last_name" required
|
|
value="<?= htmlspecialchars($form['last_name']) ?>">
|
|
</div>
|
|
</div>
|
|
<div id="username-hint" class="username-hint" style="display:none">
|
|
Votre identifiant AlpID sera : <strong id="username-preview"></strong>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="email">Email</label>
|
|
<input type="email" id="email" name="email" required autocomplete="email"
|
|
value="<?= htmlspecialchars($form['email']) ?>">
|
|
</div>
|
|
<div class="form-row">
|
|
<div class="form-group">
|
|
<label for="password">Mot de passe</label>
|
|
<input type="password" id="password" name="password" required autocomplete="new-password" minlength="8">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="password2">Confirmer</label>
|
|
<input type="password" id="password2" name="password2" required autocomplete="new-password">
|
|
</div>
|
|
</div>
|
|
<button type="submit" class="btn-primary btn-full">Créer mon compte</button>
|
|
</form>
|
|
|
|
<p class="form-footer">Déjà inscrit ? <a href="/auth/login.php">Se connecter</a></p>
|
|
</div>
|
|
|
|
<script>
|
|
function normalizeStr(s) {
|
|
return s.normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/[^a-zA-Z]/g, '');
|
|
}
|
|
function encodeLastname(ln) {
|
|
const n = normalizeStr(ln).toLowerCase();
|
|
if (n.length <= 2) return n;
|
|
return n[0] + (n.length - 2) + n[n.length - 1];
|
|
}
|
|
function buildUsername(fn, ln) {
|
|
const first = normalizeStr(fn).toLowerCase();
|
|
const code = encodeLastname(ln);
|
|
if (!first && !code) return '';
|
|
if (!first) return code;
|
|
if (!code) return first;
|
|
return first + '.' + code;
|
|
}
|
|
function updatePreview() {
|
|
const u = buildUsername(
|
|
document.getElementById('first_name').value.trim(),
|
|
document.getElementById('last_name').value.trim()
|
|
);
|
|
const hint = document.getElementById('username-hint');
|
|
if (!u) { hint.style.display = 'none'; return; }
|
|
document.getElementById('username-preview').textContent = u;
|
|
hint.style.display = 'block';
|
|
}
|
|
document.getElementById('last_name').addEventListener('input', updatePreview);
|
|
document.getElementById('first_name').addEventListener('input', updatePreview);
|
|
</script>
|
|
|
|
<?php require __DIR__ . '/views/layout_end.php'; ?>
|