Creating a page for user registration

Hello,

With the help of the documentation and some shopkit code, I try to create a page for the registration of a user.

My controller works well!
I would like your opinion on the code …
Is it correct?
(The code contains explanations in French.)

Controller:

<?php

return function ($site, $pages, $page) {

	// Ne pas afficher l'écran de connexion aux utilisateurs déjà connectés
	if($site->user()) go('/');

	$error = null;

	if(r::is('post') && get('register')) {
		// Disons au robot que tout va bien
		if(!empty(get('subject'))) {
			go($page->url());
			exit;
		}

		// Le nom d'utilisateur sera l'adresse courriel avec la ponctuation supprimée.
		// Les utilisateurs finaux ne l'utiliseront pas, nous avons juste besoin d'un ID unique pour le compte.
		$username = str::slug(get('email'),'');

		// Vérifie les doublons de comptes
		$duplicateEmail = $site->users()->findBy('email',trim(get('email')));
		$duplicateUsername = $site->users()->findBy('username',$username);

		if(count($duplicateEmail) === 0 and count($duplicateUsername) === 0) {
			try {
				// Mot de passe aléatoire pour la configuration initiale.
				// L'utilisateur va créer son propre mot de passe après la vérification par adresse courriel.
				$password = bin2hex(openssl_random_pseudo_bytes(16));

				// Créer un compte
				$user = $site->users()->create(array(
					'username'  => $username,
					'firstname' => trim(get('firstname')),
					'lastname'  => trim(get('lastname')),
					'email'     => trim(get('email')),
					'password'  => $password,
					'language'  => 'en'
				));

				// Envoyer un email de réinitialisation
				if(resetPassword($user->email(),true)) {
					$success = 'Votre compte vient d\'être créé! Vous allez recevoir un courriel afin de l\'activer.';
				} else {
					$error = 'Nous n\'avons pas réussi à envoyer votre courriel de vérification de compte. Contactez directement le propriétaire du magasin afin d\'activer votre compte.';
				}

			} catch(Exception $e) {
				$error = 'Assurez-vous d\'avoir inscrit toute les infos correctement, y compris votre courriel.';
			}
		} else {
			$error = 'Un compte a déjà été créé avec cette adresse email.';
		}
	}

	// Passer les variables au modèle
	return compact('error', 'success');
};

Template:

<?php snippet('header') ?>

<main class="main" role="main">
	<?php if(isset($success)): ?>
	<div class="alert success">
		<?= $success ?>
	</div>
	<?php endif ?>

	<?php if($error): ?>
	<div class="alert error">
		<p><?= $error ?></p>
	</div>
	<?php endif ?>

	<h1 class="title center"><?= $page->subtitle()->or($page->title()) ?></h1>

	<?php if(!isset($success)): ?>
	<form method="post" class="burger">
		<div class="field">
			<label for="firstname">Prénom</label>
			<input type="text" id="firstname" name="firstname" value="<?= get('firstname') ?>">
		</div>
		<div class="field">
			<label for="lastname">Nom</label>
			<input type="text" id="lastname" name="lastname" value="<?= get('lastname') ?>">
		</div>
		<div class="field">
			<label for="email">Adresse email</label>
			<input type="text" id="email" name="email" value="<?= get('email') ?>">
		</div>
		<div class="field honeypot">
			<label for="subject">Honeypot</label>
			<input type="text" id="subject" name="subject">
			<small class="help">For Robots.</small>
		</div>
		<div class="field">
			<input class="btn" type="submit" name="register" value="Inscription">
			<a class="link" href="<?= url('login') ?>">Se connecter</a>
		</div>
	</form>
	<?php endif ?>

</main>

<?php snippet('footer') ?>
1 Like

run it with debug true and see if it’s working.
don’t forget to adjust your config file for user roles
since users are usually dumb, you’ll also need functions to restore password

I posted a little part of my code…
It’s just to see if my controller is corect.