redes sociales drupal

Comparar y buscar perfiles de usuarios en Drupal

Drupal tiene varios módulos bastante buenos que permiten crear perfiles de usuarios a base de crear nodos (o contenidos) y asociarlos a tu perfil.

El módulo que se suele usar para esto en Drupal 6 en Content Profile, aunque en Drupal 7 ha cambiado un poco la cosa, es algo más compleja a primera vista, pero en general los cambios son a mejor mediante el uso de "Entities" y el módulo Profile2.

Puedes montarte, por poner un ejemplo inocente, una red social en la que los usuarios tienen su propio muro, información de su perfil, gustos, viajes hechos, el vino que les gusta, fecha de nacimento, ... lo que se os ocurra.

Genial, verdad? Ahora imaginaros que en esa red social "imaginaria" vamos a querer cruzar datos para, "por ejemplo", buscar amigos. Muy útil en una red social, verdad? Verdad que sería interesante no sólo mostrar usuarios sin más, sino mostrar únicamente aquellos usuarios que tengan coincidencias con tu perfil?

Con Drupal y el módulo views pueden hacerse maravillas sin tener que tocar una sólo linea de mysql y/o php... ahora bien, si queremos hacer algo más complejo, como lo es precisamente el cruzar datos de un perfil y encontrar coincidencias en otro... Drupal es fantástico pero no hace magia... todavía ;-).

Bien, solución? Muy "simple", expresiones regulares + mysql + tipos de contenido. Las expresiones regulares son algo así como la navaja suiza del programador, no entiendes su potencia hasta que realmente no te pones a trabajar con ellas.

La opción de usar un tipo de contenido es porque podemos crear un nodo específico para cada usuario en el que metamos un código php específico para ese tipo de nodos, y con rules, por ejemplo, hagamos que cuando un usuario se registra en la red ese nodo se crea automáticamente.

El contenido de dicho nodo como decía lo dirigiremos desde el node-TIPODECONTENIDO.tpl.php. La magia está simplemente en cargar desde la plantilla los datos del usuario "owner" usando el campo $node->uid). Con esos datos haremos ahora consultas sobre sobre los campos "nodeprofile" que pertenecen a dicho usuario, almacenamos los datos que nos interesen en un campo de texto, y lanzamos una consulta contra todos los usuarios obteniendo los mismos datos, pero de cada usuario.

Con esos datos en variables distintas "sólo" queda jugar con expresiones regulares, e ir almacenando, por ejemplo en un Array, los usuarios cuya coincidencia sea la que estamos buscando.

La coincidencia de la que os hablo puede ser exacta, lo que en la mayoría de los casos no tiene sentido, o "parcial". Ahora queda jugar con expresiones regulares en php para encontrar esa "coincidencia parcial" en los perfiles de usuario.

Usar de esta forma los tipos de contenido y los templates .tpl.php de Drupal es probablemente una aberración, pero es una solución rápida sin necesidad de tener que programar un módulo, cosa que por otra parte es muy sencillo.

Mucha teoría, verdad? Los próximos días pondré algún ejemplo en forma de código... y si habéis sido buenos probablemente en forma de módulo :-).