Algo que Joomla! no permite nativamente es el inicio de sesión usando también el E-Mail del usuario, me puse a buscar un poco en el código y encontré una manera simple de hacerlo y que el mismo sistema detecte si es un E-Mail o el Username del usuario en cuestión.
Este hack lo hice en la versión 1.0.15 de Comunidad Joomla!
includes/joomla.php - Línea 1054
$check_username = md5( $user->username . $harden );
Cambiamos por:
// Condiciones para login via E-Mail
if(eregi("@",$username)){
$check_username = md5( $user->email . $harden );
}else{
$check_username = md5( $user->username . $harden );
}
//$check_username = md5( $user->username . $harden );
Línea 1072:
$query = "SELECT id, name, username, password, usertype, block, gid"
. "\n FROM #__users"
. "\n WHERE username = ". $this->_db->Quote( $username );
Cambiamos por:
// Condiciones para login via E-Mail
if(eregi("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@([_a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]{2,200}\.[a-zA-Z]{2,6}$",$username)){
$quer = "\n email = ". $this->_db->Quote( $username );
}else{
$quer = "\n username = ". $this->_db->Quote( $username );
}
$query = "SELECT id, name, username, password, usertype, block, gid"
. "\n FROM #__users"
. "\n WHERE ". $quer
;
Y eso es todo, podemos usar ya el E-Mail o Username del usuario para iniciar sesión.
¿Cómo funciona?
El funcionamiento es simple, el script hace una detección de lo que la cadena
$username contiene, es por eso que uso
eregi, como parámetros pongo una estructura de como debería ser un E-Mail valido, si se detecta que la cadena cumple con esta estructura hace el query con el E-Mail, de lo contrario, hace el query con el Username.
Espero les sea de ayuda este pequeño hack.
Saludos.
Mi vida de desarrollo en la empresa donde trabajo se ha reducido por decirlo de alguna manera a desarrollar bajo Joomla!, no deja de ser PHP, pero hay que adaptarse al entorno que maneja este CMS.
Ayer desarrolle un pequeño modulo que listaba el contenido de un componente que con anterioridad Gustavo Aragon y yo desarrollamos hace un par de semanas.
En este post, les tratare de explicar el desarrollo de un modulo que nos liste usuarios registrados en nuestro sitio.
Paso 1.
Configuracion inicial del modulo
Para hacer que Joomla!, interprete nuestro modulo, debemos hacer un archivo de instalacion.
En este archivo especificaremos la informacion del autor, descripcion del modulo, parametros que se mostraras en el back-end y archivos asociados.
mod_10usuarios.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<mosinstall type="module" version="1.0.0">
<name>Modulo Listado Usuarios</name>
<author>Omar Ramirez</author>
<creationDate>04/09/2008</creationDate>
<copyright>(C) 2007 Open Source Matters. All rights reserved.</copyright>
<license>http://www.gnu.org/copyleft/gpl.html GNU/GPL</license>
<authorEmail>rigtersir{arroba}hotmail{punto}com</authorEmail>
<authorUrl>http://www.rigtersir.com</authorUrl>
<version>0.1</version>
<description>Este modulo lista 10 usuarios registrados.</description>
<files>
<filename module="mod_10usuarios">mod_10usuarios.php</filename>
</files>
<params>
<param name="orden_usuarios" type="list" default="0" label="Orden de lista" description="Selecciona el orden en que seran listados los usuarios.">
<option value="0">Aleatorio</option>
<option value="1">Ascendente</option>
<option value="2">Descendente</option>
</param>
</params>
</mosinstall>
Como podemos ver, la primer parte de este archivo XML, contiene la informacion basica del modulo (nombre del modulo, autor, fecha en que se creo dicho modulo y demas...)
<name>Modulo Listado Usuarios</name>
<author>Omar Ramirez</author>
<creationDate>04/09/2008</creationDate>
<copyright>(C) 2007 Open Source Matters. All rights reserved.</copyright>
<license>http://www.gnu.org/copyleft/gpl.html GNU/GPL</license>
<authorEmail>rigtersir{arroba}hotmail{punto}com</authorEmail>
<authorUrl>http://www.rigtersir.com</authorUrl>
<version>0.1</version>
<description>Este modulo lista 10 usuarios registrados.</description>
El siguiente trozo de codigo hace referencia a los archivos que contendra nuestro modulo, en donde haremos nuestras consultas y demas cosas que se nos ocurra.
<files>
<filename module="mod_10usuarios">mod_10usuarios.php</filename>
</files>
Y finalmente, los parametros, estos parametros nos ayudaran para configurar el comportamiento del modulo.
Dependiendo de los valores de esta parte se nos generara un formulario desde el cual podremos agregar un texto, seleccionar de una lista, etc...
Esto ya depende de como configuremos.
En el caso de este ejemplo, mostraremos solo una lista desplegable, en la cual vamos a elegir el orden de como mostrar nuestros datos.
<params>
<param name="orden_usuarios" type="list" default="0" label="Orden de lista" description="Selecciona el orden en que seran listados los usuarios.">
<option value="0">Aleatorio</option>
<option value="1">Ascendente</option>
<option value="2">Descendente</option>
</param>
</params>
Una vez que terminemos de configurar nuestro archivo
mod_10usuarios.xml, vamos a la parte interesante... las acciones que hara el modulo.
Paso 2.
Consultas y todo lo necesario para hacer funcionar el modulo
Como en el paso anterior, pego el codigo completo y despues explico...
mod_10usuarios.php
<?php
// Modulo Listado de Usuarios
// Version: 0.1
// Coder: Omar Ramirez // rigtersir{arroba}hotmail{punto}com
// Creacion: 4 de Septiembre 2008
defined( '_VALID_MOS' ) or die( 'Restricted access' );
global $database;
$orden = $params->get( 'orden_usuarios', 0 );
switch($orden){
case "1": // Orden Ascendente
$tipo = "username ASC";
break;
case "2": // Orden Descendente
$tipo = "username DESC";
break;
default: // Orden Aleatorio
$tipo = "RAND()";
}
$query = "SELECT username FROM jos_users WHERE usertype='Registered' ORDER by ".$tipo." Limit 10";
$database->setQuery($query);
$rows = $database->loadObjectList();
echo '<div>
<ul>';
foreach($rows as $row){
echo '<li><strong>'.$row->username.'</strong></li>';
}
echo '</ul>
</div>';
?>
Listo, ahora que tenemos el archivo PHP, vamos a explicar.
defined( '_VALID_MOS' ) or die( 'Restricted access' );
Esta linea nos ayuda a que el archivo
mod_10usuarios.php no sea ejecutado directamente, me refiero a que alguien pudiera acceder de la siguiente manera:
http://sitio.com/modules/mod_10usuarios.php, en teoria se podria acceder al archivo desde el navegador, pero al ser ejecutado nos mostraria el mensaje de
Restricted Access y no pasaria a mas.
global $database;
Esta linea nos inicializa la base de datos para comenzar a ejecutar los querys.
$orden = $params->get( 'orden_usuarios', 0 );
Obtenemos el parametro que especificamos dentro de nuestro XML, en este caso dicho parametro se llama
orden_usuarios, que vendria siendo el nombre de la lista desplegable que se generara en el back-end. Joomla!, obtiene ese dato via
GET.
switch($orden){
case "1": // Orden Ascendente
$tipo = "username ASC";
break;
case "2": // Orden Descendente
$tipo = "username DESC";
break;
default: // Orden Aleatorio
$tipo = "RAND()";
}
Definimos los posibles valores que
$orden u orden_usuarios podria tener y asignamos un trozo del query a el.
$query = "SELECT username FROM jos_users WHERE usertype='Registered' ORDER by ".$tipo." Limit 10";
$database->setQuery($query);
$rows = $database->loadObjectList();
Creamos inicialmente nuestra consulta, despues ya con $database inicializada, le hacemos la peticion que comience el query, esto se hace con la funcion
setQuery que Joomla! tiene integrada como parte de su API.
A continuacion usamos la funcion de Joomla!,
loadObjectList, que funciona al estilo de
mysql_fetch_array y se la asignamos a una variable que llamaremos
$rows.
echo '<div>
<ul>';
foreach($rows as $row){
echo '<li><strong>'.$row->username.'</strong></li>';
}
echo '</ul>
</div>';
Generamos nuestra parte de HTML donde se mostraran los datos y mediante un foreach, asignamos los valores que contiene $rows a $row. Para imprimir nuestro dato, lo hacemos de esta manera:
$row->nombrecampo, en el caso de este ejemplo:
$row->username
Ya con todos los ingredientes listos, metemos nuestros 2 archivos a una carpeta llamada
mod_10usuarios,
la comprimimos en un ZIP (si estamos en Windows).
- Vamos a nuestro Administrador de Joomla!
- En el menu de Instaladores, seleccionamos Modulos
- En el apartado Subir paquete, damos click en examinar, buscamos el ZIP que creamos anteriormente y damos click en el boton Subir e Instalar.
Si todo salio bien vamos al menu
Modulos y seleccionamos
Modulos de Sitio. En la lista desplegable del lado derecho que dice
--Selecciona el tipo--, buscamos el que diga
mod_10usuarios, en la parte de abajo nos mostrara nuestro modulo, lo abrimos en modo de edicion y configuramos la posicion, paginas donde sera mostrado y claro el orden en que se mostraran los datos.
Bien, esta es una pequeña explicacion de como crear e instalar un modulo.
Espero les sea de ayuda, tratare de mejorar este post un poco ya que lo hice un poco apurado.
Saludos!
Otra vez habia olvidado que mi blog existia xD, no he tenido mucho tiempo "para mi", con el cambio de trabajo pues tengo que adaptarme a los horarios, la gente, las distancias , la ropa y todo eso.
En este nuevo trabajo generalmente dare soporte a sitios mantenidos bajo Joomla!, pero solo eso, toda la produccion se lleva acabo en Argentina (de donde es originaria la empresa que me contrato).
Tengo un poco de experiencia en el mantenimiento de sitios bajo este CMS, como quien dice soy un poco novato... bueno en la administrada ya no tanto, mas bien en el desarrollo propio.
Como aun no tengo tareas asignadas aqui en la oficina, he leido los manuales oficiales de Joomla!, manuales de usuarios y algunos tutoriales para desarrollo de modulos y componentes.
Hoy termine el desarrollo de mi primer modulo, el cual al configurar los parametros necesarios, nos devuelve la imagen que usamos en Gravatar, nada del otro mundo, pero creo que se le da mas credito por hacerlo bajo Joomla!.

