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:
- Encriptamos la contraseña utilizando la función phpbb_hash [10]. Este paso puede ser modificado por una simple encriptación por MD5 ya que phpbb reconoce ambos métodos de encriptación a la hora de logear usuarios.
- Generamos un código de 13 caracteres a partir de la hora actual encriptada en md5 (esto es para conseguir una clave lo más aleatoria posible) y añadimos los datos en una tabla asociativa.
- Añadimos todos los datos en una tabla asociativa.
- En caso de querer registrar el usuario con su cuenta ya activa, descartaríamos las claves (y sus respectivos valores) “user_actkey” y “user_inactive_time” y la clave “user_type” la pondríamos a 0 en lugar de 1 (1 es usuarios inactivos, 2 BOTs y 0 usuarios activos).
- UTC indica la diferencia horaria con el servidor. Es una constante que he iniciado en las primeras líneas de código y cuya función no es más que restar la diferencia horaria entre el servidor y UTC+0 (phpBB guarda las horas en UTCzero). En mi caso la diferencia horaria es +1, pues el ordenador en el que hago estos códigos es el mío y así que está en UTC+1. Si el servidor estuviera en U.S.A. quizás debierais poner -7 o -8 (como he dicho dependerá de la situación horaria de vuestro servidor…).
- Para terminar, la función user_add [11] devuelve la nueva ID del usuario creado. Con ella y con la clave de activación guardada anteriormente podemos crear un enlace de activación:
<?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: