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: