- Racó tècnic - http://www.racotecnic.com -

Registro de usuarios externo a phpBB 3.x

Nota: Si lo que buscas es integrar phpBB 3.x con CakePHP, ésta es tu entrada [1].

El otro día expliqué cómo registrar usuarios en nuestro WordPress desde un formulario de login externo [2]. Como ya expliqué he estado haciendo un formulario de registro global para varios scripts para mi página web [3] (WordPress [4], phpBB [5], MediaWiki [6]) y quiero poder aliviaros esfuerzo si llegado el caso tenéis que hacerlo 😉

Al igual que con el anterior tutorial voy a dar por hecho que sabéis hacer un formulario y enviar y recibir datos vía GET y POST [7]. Así pues, ¡vayamos al grano!


Primero de todo cargamos ficheros necesarios e inicializamos la constante “IN_PHPBB”:

// Iniciamos la constante IN_PHPBB
define('IN_PHPBB', true);
// Indicamos la carpeta donde se encuentra nuestro phpBB3
$phpbb_root_path = '../forums/';
// Extension de los ficheros a cargar
$phpEx = substr(strrchr(__FILE__, '.'), 1);
// Cargamos fichero common.php
require_once($phpbb_root_path . 'common.' . $phpEx);
// Cargamos fichero functions_user.php (éste es el que contiene
// las funciones para añadir usuarios)
require_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
// Definimos la diferencia horaria con el servidor (explicado más adelante)
define ("UTC",1);

Ya tenemos lo más importante. Ahora pasaremos a hacer un par de comprobaciones: validar la existencia del usuario y verificar el e-mail. Ambas verificaciones serán llevadas a cabo con funciones de phpBB (cargadas en las líneas anteriores).

// Variables recogidas del formulario
$nick = $_POST['nombre_de_usuario'];
$email = $_POST['email'];
$pass = $_POST['contrasenya'];
$error = false;
// Comprobamos si el nombre de usuario existe
if (validate_username($nick)){
	echo "El nombre de usuario especificado ya existe";
	$error = true;
}
// Comprovamos el e-mail
if (validate_email($email)){
	switch(validate_email($email)){
		case DOMAIN_NO_MX_RECORD:
			echo "El dominio de la cuenta e-mail especificada no existe<br />";
			break;
		case EMAIL_TAKEN:
			echo "Existe un usuario registrado con el mismo e-mail<br />";
			break;
		case EMAIL_INVALID:
			echo "El e-mail especificado no es válido<br />";
			break;
	}
	$error = true;
}
// En caso de error ejecutamos el código que queramos
if ($error){
	// En mi caso vuelvo a mostrar el formulario de registro
	$form->display();
	// y finalizo la ejecución
	exit;
}

La función validate_username [8] retorna una cadena si el nombre de usuario ya existe o false en caso de que no exista. Lo que no he logrado averiguar es si hay distintas frases o solo una “USERNAME_TAKEN” (si alguien sabe de alguna otra le agradeceré que me lo indique), por eso mismo lo trato como true o false.

Por otro lado, la función validate_email [9] retorna tres cadenas distintas, según si el dominio o el e-mail son válidos o si el e-mail está cogido.

Pasemos al propio registro del usuario. Antes de hacerlo debéis saber que os mostraré cómo hacer para registrar a un usuario inactivo. Si queréis registrar al usuario activado directamente, simplemente omitid las líneas que os indique.

// Encriptamos la contraseña
$hash = phpbb_hash($pass);
// Generamos un código de activación para la cuenta
$actkey = substr(md5(time()), 0, 13);
// Añadimos los datos de usuario en una tabla
$dades_forum = array("username"=>$nick, // Nombre de usuario
				 "user_password"=>$hash, // Contraseña encriptada
				 "group_id"=>5, // Grupo al que pertenece
				 "user_email"=>$email,
				 "user_type"=>1, //** Tipo de usuario
				 "user_actkey"=>$actkey, //** Clave de activación de cuenta
				 "user_lang"=>"ca", // Idioma (catalán en este caso)
				 "user_timezone"=>$utc, // Diferencia horaria del cliente
				 "user_inactive_reason"=>1, // Motivo por el cual su cuenta está inactiva
				 "user_inactive_time"=>time()-UTC*3600, //** Hora en que se "inactiva" su cuenta
				 "user_regdate"=>time()-UTC*3600); // Hora de registro (menos la diferencia horaria con el servidor)
// Añadimos el usuario
if (!$user_id = user_add($dades_forum))
  die("Error inesperado al registrarte");
echo "Usuario registrado correctamente! Tu ID de usuario es " . $user_id . " y tu clave de activación " . $actkey;

Las líneas comentadas con dos asteriscos (//**) son aquellas que se descartan o varían cuando queremos registrar un usuario con la cuenta ya activa (explicado más adelante).

Ahora, por pasos:

<?php
echo "<a href='../forums/ucp.php?mode=activate&u=" . $user_id . "&k=" . $actkey . "'>Haz clic aquí para activar tu cuenta</a>";

Una vez terminado el registro podemos enviar este enlace al usuario vía e-mail para que active su cuenta.

Página de referencia: