The Joomla! Community Magazine™

Usando Joomla para hacer Joomla!. Empezando por JDatabase

Escrito por | Tuesday, 01 April 2014 12:00 | Publicado en Abril 2014
El mes pasado la línea editorial de la revista me pidió que dejara de escribir la serie de artículos para no tecnólogos ya que entendían que ya habían logrado el objetivo que perseguían. Me comprometí a escribir los siguientes artículos pensando en una audiencia más cualificada. Y tras hablarlo en el grupo de la revista en español surgió la idea de ir escribiendo artículos que facilitaran el acceso a los programadores a las clases que nos permiten construir sobre Joomla usando lo que el propio Joomla nos ofrece para ello. Así que voy a intentar escribir para aquellos programadores que sabiendo programar… no conocen aún con la profundidad que desean, todo lo que Joomla les ofrece para hacer más cómodo su trabajo.

Este mes me ha pillado el toro y he pedido ayuda a un compañero, Daniel Hernandez para poder dejar este artículo en algo legible y presentable. Espero que en meses sucesivos sea él el que se anime a escribir directamente y así podáis disfrutar de su conocimiento y buen hacer. 

Pero no nos enrollemos más… hoy vamos a hablar de JDatabase: 

PHP permite distintas formas de conexión e interacción a una BBDD. Joomla! contiene potentes funciones en su API capaces de abstraer la capa de BBDD de los propios desarrollos de terceros, permitiendo ampliar la conectividad a nuevos servidores de BBDD, pero sobre todo dando mayor facilidad y simplicidad al desarrollador para la codificación SQL, evitando así la uso de código que, de realizar algún cambio en la BBDD, con casi total seguridad hubiéramos tenido que cambiar cada uno de los métodos donde se encontrará una instancia a la misma. 

Por ello aconsejamos el uso de la librería JDatabase. Esta librería nos permite instanciar una llamada a la BBDD en pocas líneas, y sin necesitar conocer el nombre de la BBDD, ni el prefijo de las tablas a usar, ya que todos estos valores los recupera la librería del fichero configuration.php: 

$db = JFactory::getDbo();
$query = $db->getQuery(true);

Mientras que si usamos una instancia a una BBDD con PHP, tendríamos que especificar los datos de conexión, el nombre de la BBDD a utilizar, así como el nombre de la tabla completo: 

$host = "host";
$user = "nombre_usuario";
$pass = "contraseña";
$dbname = "nombre_base_datos";
$conexion = mysqli_connect($host,$user,$pass);
mysqli_select_db($dbname,$conexion);

Otra de las mejoras que permite JDatabase es la creación de consultas encadenadas a partir de funciones propias de esta librería que se apoyan unas en otras, permitiendo una mayor legibilidad del código desarrollado, y lo más importante, ocultando la sintaxis de consulta sin comprometer la portabilidad del código. 

// Instanciamos la conexión.
$db = JFactory::getDbo();
// Creamos el objeto de consulta.
$query = $db->getQuery(true);
// Preparamos el nombre de las columnas de nuestra inserción.
$columnas = array('columna1', 'columna2', 'columna3', 'columna4');
// Valores de inserción.
$valores = array('valor1', 'valor2', 'valor3', 'valor4');
// Preparamos la consulta de inserción.
$query
->insert($db->quoteName('#__tabla_sinprefijo'))
->columns($db->quoteName($columnas))
->values(implode(',', $valores));
// Establecemos la consulta con nuestro objeto y ejecutamos la consulta
$db->setQuery($query);
$db->query();

Mientras que si usamos la opción más sencilla, también válida, estaríamos enviando la sintaxis de consulta completa:  

// Instanciamos la conexión.
$db = JFactory::getDbo();
// Creamos el objeto de consulta.
$query = $db->getQuery(true);
// Preparamos el nombre de las columnas de nuestra inserción.
$columnas = array('columna1', 'columna2', 'columna3', 'columna4');
// Valores de inserción.
$valores = array('valor1', 'valor2', 'valor3', 'valor4');
$query = 'INSERT INTO #__tabla_sinprefijo ('. $columnas. ') VALUES('.$valores.')' ;
$db->setQuery($query);
$db->query();

Una de las mejoras más potentes que tenemos a nuestro alcance a partir de Joomla! 3.x, la obtenemos gracias a que se han introducido transacciones de SQL, a través de TransactionStart del JDatabaseDriver, TransactionCommit y transactionRollback, siempre que sean compatibles con el motor de la base de datos. Esto reemplaza el método queryBatch que podíamos usar desde Joomla! 2.5.  

$db = JFactory::getDbo();
try
{
$db->transactionStart();
$query = $db->getQuery(true);
$columnas = array('columna1', 'columna2', 'columna3', 'columna4');
$valores = array('valor1', 'valor2', 'valor3', 'valor4');
$query
->insert($db->quoteName('#__tabla_sinprefijo'))
->columns($db->quoteName($columnas))
->values(implode(',', $valores));
$db->setQuery($query);
$result = $db->execute();
$db->transactionCommit();
}
catch (Exception $e)
{
//Capturamos el error y realizamos un rollback de la ejecución.
$db->transactionRollback();
JErrorPage::render($e);
}

Si se produce una excepción, podemos deshacer los cambios utilizando el método transactionRollback. Lo que nos permite volver la base de datos a su estado original si se produce un problema. 

¡Ah! Sin olvidar que, por ejemplo, podemos hacer nuestra extensión independiente de la tecnología del motor de la base de datos a la que nos conectemos si nos esforzamos un poco más en aprender a trabajar utilizando las clases que Joomla nos ofrece. 

Como muestra el mapa actual de motores de bases de datos soportados por Joomla! en sus diferentes versiones:


Y con estos primeros brochazos sobre el uso de “Joomla para hacer Joomla” espero que os hayamos despertado el interés para que comenceis a descubrir cómo hacer más con menos esfuerzo.

Visto 2730 veces
Etiquetado como Spanish, Desarrollador
Pedro F. Vidal Lopez

Pedro F. Vidal Lopez

Simply... I love Open Source... I love Joomla!

I'm collaborating on projects Open Source since 1988 and with the Joomla community since 2005...

Learning English now;-)

Cambiar de idioma

¡Suscríbase!
Su correo electrónico:
Invalid Input

contribuya-articulo p