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

El otro día expliqué cómo registrar usuarios en nuestro Wordpress desde un formulario de login externo. Como ya expliqué he estado haciendo un formulario de registro global para varios scripts para mi página web (Wordpress, phpBB, MediaWiki) 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. Así pues, ¡vayamos al grano!

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

1
2
3
4
5
6
7
8
9
10
11
12
13
// 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).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 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';
            break;
        case EMAIL_TAKEN:
            echo 'Existe un usuario registrado con el mismo e-mail';
            break;
        case EMAIL_INVALID:
            echo 'El e-mail especificado no es válido';
            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 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 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 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. 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 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:
1
2
<?php
echo '<a href="../forums/ucp.php?mode=activate&amp;u=' . $user_id . '&amp;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:

Hace poco expliqué cómo cambiar la máquina virtual de Java que utiliza Eclipse al ejecutarse. Hoy explicaré cómo hacerlo en Aptana.

Aptana necesita Sun Java v. 1.5 ó superior para funcionar correctamente y, al igual que eclipse en Linux, por defecto no suele detectar la máquina virtual de Java correctamente. Para solucionarlo no tenéis más que añadirle el parámetro “-vm” (virtual machine) con la ruta a vuestra máquina virtual preferida al ejecutar aptana:

1
user@host:~$ /usr/local/aptana/AptanaStudio -vm /usr/lib/jvm/java-6-sun-1.6.0.10/jre/bin/java

Cambiad la carpeta “/java-6-sun-1.6.0.10/” por la que corresponda en vuestro sistema.

Recordad que para ver cuáles tenéis disponibles podéis hacerlo desde consola mostrando el contenido de la carpeta jvm:

1
user@host:~$ ls /usr/lib/jvm/

En la página web de Aptana explican cómo cambiar la máquina virtual añadiendo una línea “export” a vuestro fichero ejecutable:

1
2
3
export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.10/bin/java
export MOZILLA_FIVE_HOME=/usr/lib/xulrunner
/usr/local/aptana/AptanaStudio

Pero no funciona, o al menos a mi no me funciona. Si alguien sabe el porqué agradeceré que me lo comente ;)

Para que no os salgan tan caros los dominios este año ;)

  • OYH3 - $2.50 off / $7.45 any .COM (renewals too)
  • BTPS7 - 20% any order of $50 or more
  • BTPS255 - 25% off any order of $100 or more
  • OYH1 - 10% off whatever
  • OYH2 - $5 off a $30 purchase
  • BTPS4 - 10% off anything
  • chill1 - 10% off
  • chill2 - $5 off $30
  • chill3 - $7.45 .coms
  • hash1 - 10% off
  • hash2 - $5 off $30
  • hash3 - $7.45 .com registration
  • gdd1101c - 10% off any order of $40 or more
Fuente y más descuentos:

Quan vaig començar amb les meves primeres webs penjades a Internet (dic penjades a Internet perquè les primeres que vaig fer les vaig fer a la meva màquina i mai van sortir d’allà xD) vaig descobrir una pàgina que oferia 1GB de capacitat amb servei FTP, bases de dades MySQL i PHP.

El problema és que per aquella època anava bastant malament, sovint no et podies connectar a la pàgina i vaig acabar desistint.

Ara fa poc hi vaig tornar a entrar i han millorat considerablement el seu servei. A part de que sembla que no falla com ho feia (m’hi he registrat i he estat fent proves sense problemes) ara ofereixen moltes més coses:

  • 5500 MB d’espai
  • 200 GB de transferència mensual
  • Compte FTP amb gestor de fitxers online
  • Tauler de control amb instal·lador automàtic d’scripts (Fantastico)
  • Suport amb PHP
  • Suport amb MySQL (fins a 50 bases de dades) amb phpMyAdmin
  • Suport tècnic gratuït
  • Addon domains, Parked Domains i Subdominis (fins a 50 tots tres)
  • Comptes d’e-mail (il·limitats amb webmail i records MX personals)
  • Servei d’estadístiques
  • Sense publicitat

L’instal·lador automàtic d’scripts ens permet instal·lar scripts com ara Wordpress, phpBB, Joomla… en pocs clics i sense tenir que pujar els fitxers al servidor via FTP.

A més ens permeten escollir entre diferents dominis per a generar el nostre domini principal i també registren un compte amb el teu nom d’usuari.co.cc (per exemple “booletaire.co.cc”) i en vinculen automàticament les DNS amb el subdomini de byethost (que podria ser “booletaire.byethost22.com” [segons el domini principal que haguem escollit]).

En definitiva, trobo que és una bona alternativa si esteu buscant hosting gratuït ;)

Nota: Esta entrada se refiere a la versión de Wordpress 2.6.x. Es posible que estos métodos esten obsoletos —y por ello no funcione— en versiones más recientes de WP.

Estos días me estoy dedicando (entre otras cosas…) a unificar el registro de usuarios de la página www.underave.net debido a que utilizamos distintas plataformas PHP (phpBB, Wordpress y MediaWiki).

En este post explicaré cómo registrar usuarios desde un formulario externo a WordPress.

Pero explicaré lo justo y necesario (es decir, únicamente el código requerido para registrar los usuarios tras mandar los datos vía POST desde un formulario), como siempre, todo lo demás lo podéis encontrar fácilmente utilizando google.

Empecemos…

Como he dicho doy por hecho que sabéis hacer un formulario de envío de datos POST. Por si acaso aquí tenéis una útil ayuda:

Enviando y recibiendo datos con GET y POST utilizando HTML y PHP

Primero de todo debemos cargar los ficheros necesarios para utilizar las funciones de wordpress:

1
2
require_once('../blog/wp-config.php');
require_once('../blog/wp-includes/registration.php');

Donde “../blog/” corresponde a la ruta relativa de vuestro WordPress.

Una vez añadidos los ficheros necesarios (wp-config.php carga las variables de WordPress y algunos ficheros necesarios y el fichero registration.php nos permite utilizar las funciones de registro de usuarios) tan solo tenemos que llamar a la función para registrar usuarios. Tenemos dos opciones: la sencilla (wp_create_user) con sólo dos parámetros y la compleja (wp_insert_user) dónde le podemos pasar todos los detalles del usuario en un array asociativo.

Simple:

1
wp_create_user($_POST['usuario'], $_POST['contrasenya'], $_POST['email']);

Compleja (podéis ver todas las variables posibles en el Codex de WordPress):

1
2
3
4
5
6
7
8
9
10
11
12
13
// Rellenamos un array con los datos que queramos añadir
$datos = array(
    'user_login'   => $_POST['nick'], // Nombre de usuario para login
    'user_pass'    => $_POST['pass'], // Contraseña
    'user_url'     => $_POST['url'], // Website del usuario
    'user_email'   => $_POST['email'], // E-mail
    'display_name' => $_POST['nick'], // Nombre a mostrar del usuario en comentarios y mensajes
    'first_name '  => $_POST['nombre'], // Nombre del usuario
    'last_name'    => $_POST['apellidos'], // Apellidos
    'role'         => 'contributor'
);
// Insertamos los datos
wp_insert_user($datos);

Fijaros en la propiedad “role”. Es para designar los permisos del usuario (que podéis consultar en esta página). Si no la ponéis pondrá la que tengáis por defecto configurada en el blog.

Ambas funciones retornan el ID resultante al registrar al usuario, lo que nos puede servir para enviar una activación por e-mail de la cuenta (por ejemplo…).

Pues ya lo tenéis, vuestro sistema de registro de usuarios de WordPress. Seguramente dentro de poco me anime a publicar un post para hacer vuestro propio sistema de login. También publicaré un post para registrar usuarios en phpBB.

A continuación os dejo el código completo para ambas funciones (para hacer copy paste más rápido ;) ):

Simple..

1
2
3
4
5
6
// Añadimos los ficheros necesarios
require_once('../blog/wp-config.php');
require_once('../blog/wp-includes/registration.php');
// Insertamos los datos
wp_create_user($_POST['usuario'], $_POST['contrasenya'], $_POST['email']);
// $id_usuario = wp_create_user($_POST['usuario'], $_POST['contrasenya'], $_POST['email']);

Compleja..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Añadimos los ficheros necesarios
require_once('../blog/wp-config.php');
require_once('../blog/wp-includes/registration.php');
// Rellenamos un array con los datos que queramos añadir
$datos = array(
    'user_login'   => $_POST['nick'], // Nombre de usuario para login
    'user_pass'    => $_POST['pass'], // Contraseña
    'user_url'     => $_POST['url'], // Website del usuario
    'user_email'   => $_POST['email'], // E-mail
    'display_name' => $_POST['nick'], // Nombre a mostrar del usuario en comentarios y mensajes
    'first_name '  => $_POST['nombre'], // Nombre del usuario
    'last_name'    => $_POST['apellidos'], // Apellidos
    'role'         => 'contributor'
);
// Insertamos los datos
wp_insert_user($datos);
// $id_usuario = wp_insert_user($datos)

Páginas de referencia: