LinuxParty
6- Uso de la base de datos
Los componentes suelen gestionar sus contenidos utilizando la base de datos. Durante la fase de instalación o desinstalación o actualización de un componente, se pueden ejecutar consultas SQL a través del uso de archivos de texto SQL.
Coge tu editor favorito, crea dos archivos llamados admin/sql/install.mysql.utf8.sql y admin/sql/updates/mysql/0.0.6.sql . Ambos deberán tener el contenido siguiente:
DROP TABLE IF EXISTS `#__helloworld`;
CREATE TABLE `#__helloworld` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`greeting` VARCHAR(25) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
INSERT INTO `#__helloworld` (`greeting`) VALUES
('Hello World!'),
('Good bye World!');
El archivo admin/sql/install.mysql.utf8.sql se ejecuta al instalar el componente. El archivo 0.0.6.sql se ejecuta al actualizar el componente.
Nota: Cuando el componente está instalado, los archivos de la carpeta SQL correspondientes a las actualizaciones del componente (por ejemplo admin/sql/updates/mysql) se leen y el nombre del último archivo (alfabéticamente) se utiliza para rellenar el número de la versión del componente en la tabla #__schemas. Este valor debe estar con un orden (en este caso alfabético) en la tabla, para que la actualización automática ejecute los archivos de actualización de SQL para futuras versiones. Por esta razón, es una buena práctica crear un archivo de actualización SQL para cada versión (incluso si está vacío o sólo tiene un comentario). De esta manera la versión #__schemas siempre coincidirá con la versión de los componentes.
Para que esto se ejecute nuestro archivo helloworld.xml tiene que ser modificado para agregar las líneas correspondientes. De paso, agrego todas las otras modificaciones que verán más abajo:
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="2.5.0" method="upgrade">
<name>Hello World!</name>
<!-- Los siguientes elementos son opcionales y sin restricciones de formato -->
<creationDate>Octubre 2012</creationDate>
<author>Carlos R</author>
<authorEmail>email</authorEmail>
<authorUrl>https://www.ejemplo.org</authorUrl>
<copyright>Copyright Info</copyright>
<license>Licencia Info</license>
<!-- La versión de desarrollo del componente se registra en la tabla del mismo -->
<version>0.0.6</version>
<!-- La descripción es opcional. Por defecto se introduce el nombre del componente -->
<description>Descripción del Componente Hello World!...</description>
<install> <!-- Se ejecuta en la instalación -->
<sql>
<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
</sql>
</install>
<uninstall> <!-- Se ejecuta en la desinstalación -->
<sql>
<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
</sql>
</uninstall>
<update> <!-- Se ejecuta en la actualización; Nuevo en 2.5 -->
<schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath>
</schemas>
</update>
<!-- Archivos pertenecientes a la interfaz de usuario -->
<!-- Nota el atributo de la carpeta: Este atributo describe hacia dónde
y de donde van a ser copiados los archivos del paquete de instalación.-->
<files folder="site">
<filename>index.html</filename>
<filename>helloworld.php</filename>
<filename>controller.php</filename>
<folder>views</folder>
<folder>models</folder>
</files>
<administration>
<!-- Menú de la sección de Administración -->
<menu>Hello World!</menu>
<!-- Archivos pertenecientes a la administración -->
<!-- Nota el atributo de la carpeta: Este atributo describe hacia donde
y de donde van a ser copiados los archivos del paquete de instalación. -->
<files folder="admin">
<!-- Archivos principales de la carpeta admin -->
<filename>index.html</filename>
<filename>helloworld.php</filename>
<!-- Archivos de la sección de SQL -->
<folder>sql</folder>
<!-- Archivos de la Sección de las Tablas -->
<folder>tables</folder>
<!-- Archivos de la Sección de los Modelos -->
<folder>models</folder>
</files>
</administration>
</extension>
Hacemos lo mismo con el archivo de desinstalación. Con su editor favorito, cree el archivo admin/sql/uninstall.mysql.utf8.sql que contenga:
DROP TABLE IF EXISTS `#__helloworld`;
Añadir un nuevo tipo de campo
Por el momento, se ha utilizado un tipo de campo codificado para los mensajes. El objetivo es utilizar nuestra base de datos para elegir el mensaje. Para esto modificamos el archivo site/views/helloworld/tmpl/default.xml y le agregamos estas líneas:
<?xml version="1.0" encoding="utf-8"?>
<metadata>
<layout title="COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_TITLE">
<message>COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_DESC</message>
</layout>
<fields
name="request"
addfieldpath="/administrator/components/com_helloworld/models/fields"
>
<fieldset name="request">
<field
name="id"
type="helloworld"
label="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL"
description="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC"
/>
</fieldset>
</fields>
</metadata
Esta parte introduce un nuevo tipo de campo y le dice a Joomla! que debe buscar la definición del campo en la carpeta /administrator/components/com_helloworld/models/fields.
Con tu editor favorito crea el archivo admin/models/fields/helloworld.php que contenga lo siguiente:
<?php // No permitir el acceso directo al archivo defined('_JEXEC') or die('Restricted access'); // Importar biblioteca modelitem de Joomla // jimport('joomla.application.component.modelitem'); jimport('joomla.form.helper'); JFormHelper::loadFieldClass('list'); class JFormFieldHelloWorld extends JFormFieldList { /** * The field type. * * @varstring */ protected $type = 'HelloWorld'; /** * Method to get a list of options for a list input. * * @return array An array of JHtml options. */ protected function getOptions() { $db = JFactory::getDBO(); $query = $db->getQuery(true); $query->select('id,greeting'); $query->from('#__helloworld'); $db->setQuery((string)$query); $messages = $db->loadObjectList(); $options = array(); if ($messages) { foreach($messages as $message) { $options[] = JHtml::_('select.option', $message->id, $message->greeting); } } $options = array_merge(parent::getOptions(), $options); return $options; } }
El nuevo tipo de campo muestra una lista desplegable de mensajes para elegir. Usted puede ver el resultado de este cambio, en el gestor de menú en la administración de su sitio para el elemento
HelloWorld (Figura 7).
Muestra el mensaje seleccionado
Cuando un elemento de menú del componente, se cree o se actualice, Joomla! almacena el identificador del mensaje. El modelo HelloWorldModelHelloWorld tiene ahora para calcular el mensaje de acuerdo a este identificador y los datos son almacenados en la base de datos. De acuerdo a esto, necesitamos entonces modificar el archivo site/models/helloworld.php :
<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted access');
// importar la biblioteca de Joomla modelitem
jimport('joomla.application.component.modelitem');
/**
* Modelo HelloWorld
*/
class HelloWorldModelHelloWorld extends JModelItem
{
/**
* @var array demensajes
*/
protected $messages;
/**
* Devuelve una referencia al objeto Tabla, siempre creando
*
* @param type El tipo de tabla para crear una instancia
* @param string Un prefijo para el nombre de la clase de la tabla. Opcional
* @param array Configuración del array del Modelo. Opcional
* @return JTable Un objeto de tipo Base de Datos
* @since 2.5
*/
public function getTable($type = 'HelloWorld', $prefix = 'HelloWorldTable', $config = array())
{
return JTable::getInstance($type, $prefix, $config);
}
/**
* Obtener el mensaje
* @param int Recuperar el ID del mensaje corrrespondiente
* @return string El mensaje que se le muestra al usuario
*/
public function getMsg($id = 1)
{
if (!is_array($this->messages))
{
$this->messages = array();
}
if (!isset($this->messages[$id]))
{
//solicitar el ID seleccionado
$id = JRequest::getInt('id');
// Obtener una instancia de TableHelloWorld
$table = $this->getTable();
// Cargar el mensaje
$table->load($id);
// Asignar el mensaje
$this->messages[$id] = $table->greeting;
}
return $this->messages[$id];
}
}
El modelo ahora le pide a TableHelloWorld hacer llegar el mensaje. Esta clase tiene que ser definida en el archivo admin/tables/helloworld.php :
<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted access');
// Importar la librería table de Joomla
jimport('joomla.database.table');
/**
* Clase Hello Table
*/
class HelloWorldTableHelloWorld extends JTable
{
/**
* Constructor
*
* @param object Database connector object
*/
function __construct(&$db)
{
parent::__construct('#__helloworld', 'id', $db);
}
}
No debes ver ninguna diferencia, pero si se accede a la base de datos debería ver una tabla denominada jos_helloworld con dos columnas: id y greeting. Y dos entradas: Hello World! y Good bye World! (Figura 10).
Figura 10
Para probar los cambios ya sabes que hacer, tan sólo tienes que empaquetar e instalar. Pero primero hagamos un recuento del contenido que tenemos que tener en nuestro directorio:
- helloworld.xml
- site/index.html
- site/helloworld.php
- site/controller.php
- site/views/index.html
- site/views/helloworld/index.html
- site/views/helloworld/view.html.php
- site/views/helloworld/tmpl/index.html
- site/views/helloworld/tmpl/default.xml
- site/views/helloworld/tmpl/default.php
- site/models/index.html
- site/models/helloworld.php
- admin/index.html
- admin/helloworld.php
- admin/sql/index.html
- admin/sql/install.mysql.utf8.sql
- admin/sql/uninstall.mysql.utf8.sql
- admin/sql/updates/index.html
- admin/sql/updates/mysql/index.html
- admin/sql/updates/mysql/0.0.1.sql
- admin/sql/updates/mysql/0.0.6.sql
- admin/models/index.html
- admin/models/fields/index.html
- admin/models/fields/helloworld.php
- admin/tables/index.html
- admin/tables/helloworld.php
También puedes descargar el archivo directamente, pero necesitas antes de instalarlo copiar el código de los archivo site/models/helloworld.php y admin/models/fields/helloworld.php antes expuesto, ya que no viene incluido en el paquete.
7- Administración Básica
Diseñar la parte de Administración nos lleva a crear al menos el tríptico Modelo-Vista-Controlador. Tenemos que modificar el punto de entrada de la administración de nuestro componente, el archivo ha ser modificado sería admin/helloworld.php :
<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted access');
// Importar la biblioteca controller de jomla
jimport('joomla.application.component.controller');
// Obtener una instancia del controlador prefijado por HelloWorld
$controller = JController::getInstance('HelloWorld');
// Realice la tarea solicitada
$controller->execute(JRequest::getCmd('task'));
// Redirigir si se define por el controlador
$controller->redirect();
Crear el controlador general
Ahora, el punto de entrada recibe una instancia del controlador prefijado por HelloWorld. Creemos un controlador básico para la parte de la administración: admin/controller.php
<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted access');
// Importar la biblioteca controller de jomla
jimport('joomla.application.component.controller');
/**
* General Controller of HelloWorld component
*/
class HelloWorldController extends JController
{
/**
* Mostrar la tarea
*
* @return void
*/
function display($cachable = false)
{
// programar una vista por defecto si no se establece
JRequest::setVar('view', JRequest::getCmd('view', 'HelloWorlds'));
// call parent behavior
parent::display($cachable);
}
}
Este controlador mostrará la vista HelloWorlds por defecto.
Crear la vista
Con tu gestor y editor de archivos favorito, crea un archivo admin/views/helloworlds/view.html.php que contenga:
<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted access');
// Importar la biblioteca view de Joomla
jimport('joomla.application.component.view');
/**
* Vista HelloWorlds */
class HelloWorldViewHelloWorlds extends JView
{
/**
*Métodoo para mostrar la vista HelloWorlds
* @return void
*/
function display($tpl = null)
{
// Obtener los datos desde el modelo
$items = $this->get('Items');
$pagination = $this->get('Pagination');
// Verificar existencia de errores.
if (count($errors = $this->get('Errors')))
{
JError::raiseError(500, implode('<br />', $errors));
return false;
}
// Asignar los datos a la vista
$this->items = $items;
$this->pagination = $pagination;
// Mostrar la plantilla
parent::display($tpl);
}
}
En Joomla!, las vistas muestran los datos usando un diseño. Con tu gestor y editor de archivos favorito, pon el archivo admin/views/helloworlds/tmpl/default.php que contenga:
<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted Access');
// Cargar el comportamiento tooltip
JHtml::_('behavior.tooltip');
?>
<form action="<?php echo JRoute::_('index.php?option=com_helloworld'); ?>" method="post" name="adminForm">
<table class="adminlist">
<thead><?php echo $this->loadTemplate('head');?></thead>
<tfoot><?php echo $this->loadTemplate('foot');?></tfoot>
<tbody><?php echo $this->loadTemplate('body');?></tbody>
</table>
</form>
Este diseño llama a varios sub-diseños (head, foot y body). Cada uno de ellos corresponde a un archivo prefijado por el nombre del diseño principal (default), y un guión bajo.
Pon un archivo llamado admin/views/helloworlds/tmpl/default_head.php que contenga:
<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted Access');
?>
<tr>
<th width="5">
<?php echo JText::_('COM_HELLOWORLD_HELLOWORLD_HEADING_ID'); ?>
</th>
<th width="20">
<input type="checkbox" name="toggle" value="" onclick="checkAll(<?php echo count($this->items); ?>);" />
</th>
<th>
<?php echo JText::_('COM_HELLOWORLD_HELLOWORLD_HEADING_GREETING'); ?>
</th>
</tr>
CheckAll es una función JavaScript definida en el core de Joomla!, capaz de comprobar todos los elementos.
Pon un archivo llamado admin/views/helloworlds/tmpl/default_body.php que contenga:
<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted Access');
?>
<?php foreach($this->items as $i => $item): ?>
<tr class="row<?php echo $i % 2; ?>">
<td>
<?php echo $item->id; ?>
</td>
<td>
<?php echo JHtml::_('grid.id', $i, $item->id); ?>
</td>
<td>
<?php echo $item->greeting; ?>
</td>
</tr>
<?php endforeach; ?>
JHtml::_ es una función de ayuda que muestra varias salidas HTML. En este caso mostrará una casilla de verificación para el elemento.
Pon un archivo llamado admin/views/helloworlds/tmpl/default_foot.php que contenga:
<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted Access');
?>
<tr>
<td colspan="3"><?php echo $this->pagination->getListFooter(); ?></td>
</tr>
JPagination es una clase de Joomla! que maneja y controla objetos de paginación.
Crear el modelo
La vista HelloWorlds le pide los datos al modelo. En Joomla!, hay una clase que maneja una lista de datos: JModelList. La clase JModelList y las clases heredadas sólo necesitan un método:
- getListQuery que construye una sentencia SQL
Y dos estados:
- list.start para determinar la compensación de la lista
- list.limit para determinar la longitud de la lista
Los métodos getItems y getPagination se definen en la clase JModelList. No necesitan ser definidos en la clase HelloWorldModelHelloWorlds. Modificando el archivo admin/models/helloworlds.php quedaría:
<?php
// No permitir el acceso directo al archivo
defined('_JEXEC') or die('Restricted access');
// Importar biblioteca modellist de Joomla
jimport('joomla.application.component.modellist');
/**
* HelloWorldList Model
*/
class HelloWorldModelHelloWorlds extends JModelList
{
/**
* Método para crear una consulta SQL para cargar los datos de la lista.
*
* @return string Una consulta SQL
*/
protected function getListQuery()
{
// Cree un objeto de consulta nueva.
$db = JFactory::getDBO();
$query = $db->getQuery(true);
// Seleccione algunos campos
$query->select('id,greeting');
// De la tabla hello
$query->from('#__helloworld');
return $query;
}
}
El método _populateState es (por defecto) llamado automáticamente cuando un estado es leído por el método getState.
Luego de este paso el contenido del directorio se ha incrementado:
- helloworld.xml
- site/index.html
- site/helloworld.php
- site/controller.php
- site/views/index.html
- site/views/helloworld/index.html
- site/views/helloworld/view.html.php
- site/views/helloworld/tmpl/index.html
- site/views/helloworld/tmpl/default.xml
- site/views/helloworld/tmpl/default.php
- site/models/index.html
- site/models/helloworld.php
- admin/index.html
- admin/helloworld.php
- admin/controller.php
- admin/sql/index.html
- admin/sql/install.mysql.utf8.sql
- admin/sql/uninstall.mysql.utf8.sql
- admin/sql/updates/index.html
- admin/sql/updates/mysql/index.html
- admin/sql/updates/mysql/0.0.1.sql
- admin/sql/updates/mysql/0.0.6.sql
- admin/models/index.html
- admin/models/fields/index.html
- admin/models/fields/helloworld.php
- admin/models/helloworlds.php
- admin/views/index.html
- admin/views/helloworlds/index.html
- admin/views/helloworlds/view.html.php
- admin/views/helloworlds/tmpl/index.html
- admin/views/helloworlds/tmpl/default.php
- admin/views/helloworlds/tmpl/default_head.php
- admin/views/helloworlds/tmpl/default_body.php
- admin/views/helloworlds/tmpl/default_foot.php
- admin/tables/index.html
- admin/tables/helloworld.php
Crea un archivo comprimido de este directorio o descárga directamente el archivo e instálalo utilizando el gestor de extensiones de Joomla!. Recuerda también que hay que modificar el archivo helloworld.xml :
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="2.5.0" method="upgrade">
<name>Hello World!</name>
<creationDate>Octubre 2012</creationDate>
<author>Carlos R & Andoitz Brit</author>
<authorEmail>email</authorEmail>
<authorUrl>https://www.ejemplo.org</authorUrl>
<copyright>Copyright Info</copyright>
<license>Licencia Info</license>
<version>0.0.7</version>
<description>Descripción del Componente Hello World!...</description>
<install> <!-- Se ejecuta en la instalación-->
<sql>
<file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
</sql>
</install>
<uninstall> <!-- Se ejecuta en la desintalación -->
<sql>
<file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
</sql>
</uninstall>
<update> <!-- Se ejecuta en la actualización; Nuevo en 2.5 -->
<schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath>
</schemas>
</update>
<files folder="site">
<filename>index.html</filename>
<filename>helloworld.php</filename>
<filename>controller.php</filename>
<folder>views</folder>
<folder>models</folder>
</files>
<administration>
<menu>Hello World!</menu>
<files folder="admin">
<filename>index.html</filename>
<filename>helloworld.php</filename>
<filename>controller.php</filename>
<folder>sql</folder>
<folder>tables</folder>
<folder>models</folder>
<!-- Sección para los archivos de las vistas -->
<folder>views</folder>
</files>
</administration>
</extension>
Desarrollo de componentes en Joomla 2.5 (2 de 8) | Desarrollo de componentes en Joomla 2.5 (4 de 8)
Escribir un comentario
2- Configuración Modelo-Vista-Controlador (MVC)
En el Framework de Joomla! 2.5, los autores de los componentes dividen el código en 3 partes principales:
- models (Modelo): Gestionar los datos
- views (Vista): Mostrará el contenido de acuerdo al tipo (error, feed, html, json, raw, xml) y el diseño elegido por los controladores
- controllers (Controlador): Llevan a cabo las tareas, establecen y obtienen el estado del modelo y preguntan qué vista es la que hay que mostrar.
Configuración del Controlador
En el código del núcleo de Joomla, hay una clase capaz de gestionar los controladores: JController.
Esta clase tiene que ser extendida para ser usada en nuestro componente. En el archivo site/helloworld.php (punto de entrada de nuestro componente Hello World!) ubicamos estas líneas:
<?php
// No permitir el acceso directo a este archivo
defined('_JEXEC') or die('Restricted access');
// Importar la biblioteca del controlador de Joomla
jimport('joomla.application.component.controller');
// Obtener una instancia del controlador prefijado por HelloWorld
$controller = JController::getInstance('HelloWorld');
// Lleva a cabo la tarea solicitada
$input = JFactory::getApplication()->input;
$controller->execute($input->getCmd('task'));
// Redirigir si se define por el controlador
$controller->redirect();
El método estático getInstance de la clase JController creará un controlador. En el código anterior, se creará una instancia del objeto del controlador de una clase llamada HelloWorldController. Joomla! buscará la declaración de esa clase en un archivo llamado exactamente controller.php (es un comportamiento por defecto).
Ahora, controller.php es necesario crearlo y HelloWorldController debe ser declarado y definido. Así que con tu gestor de archivos y editor favorito , creamos el archivo site/controller.php que contenga lo siguiente:
<?php
// No permitir el acceso directo a este archivo
defined('_JEXEC') or die('Restricted access');
// Importar la biblioteca del controlador de Joomla
jimport('joomla.application.component.controller');
/**
* Controlador del Componente Hello World!
*/
class HelloWorldController extends JController
{
}
Cuando no hay ninguna tarea dada en las variables de petición, la tarea por defecto se ejecutará. Dicha tarea la contiene la clase JController, que ejecuta la tarea de visualización por defecto. En nuestro ejemplo, se mostrará una vista denominada HelloWorld.
Configuración de la Vista
Cuando la clase JController decide mostrar una vista, va en busca de los archivos que están en la carpeta component/com_[nombre_componente]/views/[nombre_vista]/ .
El nombre de la carpeta, de la vista por defecto, es el nombre del propio componente. En nuestro caso la ruta es component/com_helloworld/views/helloworld/.
El archivo que contiene el código de la vista se denomina view.[modo_vista].php. El modo de la vista por defecto, y probablemente el único que tenga un componente es el modo html. Así que esto nos da nuestro nombre del archivo, que es view.html.php.
Con el gestor de archivos y editor favorito, crea el archivo site/views/helloworld/view.html.php que será nuestra vista predeterminada, conteniendo lo siguiente:
<?php
// No permitir el acceso directo a este archivo
defined('_JEXEC') or die('Restricted access');
// Importar la biblioteca del controlador de Joomla
jimport('joomla.application.component.view');
/**
* HTML clase View para el componente HelloWorld */
class HelloWorldViewHelloWorld extends JView
{
// Sobrescribir visualización del método JView
function display($tpl = null)
{
// Asignar datos a la vista
$this->msg = 'Hello World';
// Visualiza la vista
parent::display($tpl);
}
}
El método de visualización de la clase JView se llama con la tarea de visualización de la clase JController. En nuestro caso, este método mostrará los datos utilizando el archivo tmpl/default.php.
Con el gestor de archivos y editor favorito , crea el archivo site/views/helloworld/tmpl/default.php que contenga lo siguiente:
<?php
// No permitir el acceso directo a este archivo
defined('_JEXEC') or die('Restricted access');
?>
<h1><?php echo $this->msg; ?></h1>
Este archivo de plantilla se incluirán en la clase JView. Por lo tanto, aquí, $this se refiere a la clase HelloWorldViewHelloWorld.
Haciendo un recuento de lo que hemos creado hasta ahora, deberíamos de tener el siguiente directorio:
- helloworld.xml
- site/index.html
- site/helloworld.php
- site/controller.php
- site/views/index.html
- site/views/helloworld/index.html
- site/views/helloworld/view.html.php
- site/views/helloworld/tmpl/index.html
- site/views/helloworld/tmpl/default.php
- admin/index.html
- admin/helloworld.php
- admin/sql/index.html
- admin/sql/updates/index.html
- admin/sql/updates/mysql/index.html
- admin/sql/updates/mysql/0.0.1.sql
Luego de rectificar esto, actualizamos el archivo helloworld.xml para añadir los cambios pertinentes:
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="2.5.0" method="upgrade">
<name>Hello World!</name>
<!-- Los siguientes elementos son opcionales y sin restricciones de formato -->
<creationDate>October 2012</creationDate>
<author>Carlos R & Andoitz Brit</author>
<authorEmail>email</authorEmail>
<authorUrl>https://www.ejemplo.org</authorUrl>
<copyright>Copyright Info</copyright>
<license>Licencia Info</license>
<!-- La versión de desarrollo del componente se registra en la tabla del mismo -->
<version>0.0.2</version>
<!-- The description is optional and defaults to the name -->
<description>Descripción del Componente Hello World...</description>
<!-- Para las actualizaciones; Nuevo en 2.5 -->
<update>
<schemas>
<schemapath type="mysql">sql/updates/mysql</schemapath>
</schemas>
</update>
<!-- Archivos pertenecientes a la interfaz de usuario -->
<!-- Nota el atributo de la carpeta: Este atributo describe hacia donde y
de donde van a ser copiados los archivos del paquete de instalación.-->
<files folder="site">
<filename>index.html</filename>
<filename>helloworld.php</filename>
<filename>controller.php</filename>
<folder>views</folder>
</files>
<administration>
<!-- Menú de la sección de Administración -->
<menu>Hello World!</menu>
<!-- Archivos pertenecientes a la administración -->
<!-- Nota el atributo de la carpeta: Este atributo describe hacia donde y de donde van a ser copiados los archivos del paquete de instalación. -->
<files folder="admin">
<!-- Archivos principales de la carpeta admin -->
<filename>index.html</filename>
<filename>helloworld.php</filename>
<!-- Archivos de la sección de SQL -->
<folder>sql</folder>
</files>
</administration>
</extension>
Si deseas probar los cambios, solo sigue los mismos pasos para empaquetar el directorio o descarga el archivo que brinda la sección para los desarrolladores en la documentación de Joomla! e instálalo mediante el gestor de extensiones de Joomla!. Luego ingresa tusitio/index.php?option=com_helloworld en tu navegador y verás por defecto el mensaje contenido en la variable $this->msg en el archivo view.html.php (Figura 4).
Figura 4
3- Añadir un tipo de elemento de Menú
En el Framework de Joomla!, los componentes se ejecutan utilizando elementos del menú. Si vas al gestor de menú en la administración de tu sitio, verás que aún no existe ningún tipo de elemento de Menú correspondiente a nuestro componente Helloworld (Figura 5).
Figura 5
Para lograr esto, es muy sencillo en Joomla!, simplemente añadimos el archivo site/views/helloworld/tmpl/default.xml que contenga lo siguiente:
<?xml version="1.0" encoding="utf-8"?>
<metadata>
<layout title="COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_TITLE">
<message>
<![CDATA[COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_DESC]]>
</message>
</layout>
</metadata>
Por el momento las cadenas no serán traducidas, ya que más adelante lo veremos con más detalles.
Ahora modificamos nuestro archivo helloworld.xml para añadir una nueva versión, ya que fue modificado el componente. Exactamente la línea que buscamos en el archivo es esta:
[….]
<!-- La versión de desarrollo del componente se registra en la tabla del mismo -->
<version>0.0.3</version>
[….]
Si empaquetamos nuestro directorio y luego lo instalamos, veremos que ya tenemos un elemento de menú nuevo (Figura 6). También puedes descargarte el archivo brindado en la documentación de Joomla! para desarrolladores.
Figura 6
4- Añadir el Modelo
En el Framework de Joomla!, los modelos son responsables de la gestión de los datos. La primera función que tiene que ser escrita para un modelo es la función get. Su objetivo es devolver los datos una vez haya sido llamada. En nuestro caso la que llama a esta función es la vista HelloWorldViewHelloWorld. Por defecto, el modelo llamado HelloWorldModelHelloWorld es el modelo principal asociado a esta vista. Para implementar esto, coge el gestor de archivos y editor favorito y crea el siguiente archivo site/models/helloworld.php, el cual contendrá lo siguiente:
<?php
// No permitir el acceso directo a este archivo
defined('_JEXEC') or die('Restricted access');
// Importar la biblioteca del controlador de Joomla
jimport('joomla.application.component.modelitem');
/**
* Modelo HelloWorld
*/
class HelloWorldModelHelloWorld extends JModelItem
{
/**
* @var string msg
*/
protected $msg;
/**
* Obtener el mensaje
* @return string El mensaje que se muestra al usuario
*/
public function getMsg()
{
if (!isset($this->msg))
{
$this->msg = 'Hello World!';
}
return $this->msg;
}
}
Como sabemos la clase HelloWorldViewHelloWorld es la que le pregunta al modelo por los datos utilizando el método get de la clase JView. Modificando el archivo site/views/helloworld/view.html.php quedaría de la siguiente forma:
<?php
// No permitir el acceso directo a este archivo
defined('_JEXEC') or die('Restricted access');
// Importar la biblioteca del controlador de Joomla
jimport('joomla.application.component.view');
/**
* HTML clase View para el componente HelloWorld
*/
class HelloWorldViewHelloWorld extends JView
{
// Sobrescribir visualización del método JView
function display($tpl = null)
{
// Asignar datos a la vista
$this->msg = $this->get('Msg');
// Comprueba si hay errores.
if (count($errors = $this->get('Errors')))
{
JError::raiseError(500, implode('<br />', $errors));
return false;
}
// Visualiza la vista
parent::display($tpl);
}
}
Nota: $this->get() es un miembro de JView::get que es un proxy para (get*) obtener los métodos por defecto del modelo, donde * se rellena con el valor del primer parámetro pasado a get().
Nota: La clase JError está obsoleta, utiliza la clase JLog o PHP Exception en su lugar.
Un cambio, una nueva versión para nuestro componente. Por tanto, modificamos la línea correspondiente en el archivo helloworld.xml, para añadir la nueva versión y la carpeta correspondiente a los modelos. Exactamente serían estas líneas:
[….]
<!-- La versión de desarrollo del componente se registra en la tabla del mismo -->
<version>0.0.4</version>
[….]
<!-- Archivos pertenecientes a la interfaz de usuario -->
<!-- Nota el atributo de la carpeta: Este atributo describe hacia dónde
y de donde van a ser copiados los archivos del paquete de instalación.-->
<files folder="site">
<filename>index.html</filename>
<filename>helloworld.php</filename>
<filename>controller.php</filename>
<folder>views</folder>
<folder>models</folder>
</files>
[….]
5- Adición de una petición de variable en el tipo de menú
Por el momento, el mensaje que siempre aparece es Hello World!. Joomla! 2.5 ofrece la posibilidad de agregar parámetros a los tipos de menú (Figura 7).
Figura 7
En nuestro caso, esto se hace en el archivo site/views/helloworld/tmpl/default.xml :
<?xml version="1.0" encoding="utf-8"?>
<metadata>
<layout title="COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_TITLE">
<message>COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_DESC</message>
</layout>
<fields name="request">
<fieldset name="request">
<field
name="id"
type="list"
label="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL"
description="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC"
default="1"
>
<option value="1">Hello World!</option>
<option value="2">Good bye World!</option>
</field>
</fieldset>
</fields>
</metadata>
Dos cosas importantes a tener en cuenta:
- El grupo de campos (fields) de solicitud (request) indica los campos obligatorios
- El valor del atributo se pasa al componente en la dirección URL. En este caso, ?option=com_helloworld&id=1 indicaría que se ha elegido la opción “1”
El modelo tiene que ser modificado con el fin de cambiar entre los dos mensajes diferentes (que es elegido por el usuario con el campo definido anteriormente). Entonces el archivo site/models/helloworld.php quedaría:
<?php
// No permitir el acceso directo a este archivo
defined('_JEXEC') or die('Restricted access');
// Importar la biblioteca del controlador de Joomla
jimport('joomla.application.component.modelitem');
/**
* Modelo HelloWorld
*/
class HelloWorldModelHelloWorld extends JModelItem
{
/**
* @varstringmsg
*/
protected $msg;
/**
* Obtener el mensaje
* @return string El mensaje que se muestra al usuario
*/
public function getMsg()
{
if (!isset($this->msg))
{
$id = JRequest::getInt('id');
switch ($id)
{
case 2:
$this->msg = 'Good bye World!';
break;
default:
case 1:
$this->msg = 'Hello World!';
break;
}
}
return $this->msg;
}
}
Otro cambio, otra versión para nuestro componente. Ya sería la 0.0.5 . Para ver en funcionamiento lo anteriormente explicado, solo tienes que escribir en tu navegador index.php?option=com_helloworld&id=1 para la primera opción (Figura 8) o index.php?option=com_helloworld&id=2 para la segunda (figura 9). Esto claro, después de haber empaquetado e instalado su nueva versión del componente. También puedes descargar el archivo que brinda la sección para desarrolladores en la documentación de Joomla.
Figura 8
Figura 9
Desarrollo de componentes en Joomla 2.5 (1 de 8) | Desarrollo de componentes en Joomla 2.5 (3 de 8)
Creación de Componentes en Joomla
Ejemplo componente HelloWorld.
Si has utilizado Joomla! antes de leer este tutorial, habrás notado que las extensiones se instalan mediante un archivo comprimido que contiene todas las cosas que son necesarias para la instalación y desinstalación de ellas.
Joomla! se divide en dos interfaces principales, la interfaz de usuario (site) y la de administración (admin). Por tanto, nuestro componente tiene que tener esa misma distribución.
Con el gestor de archivos favorito, crea un directorio (fuera de tu directorio de instalación de Joomla!) que contenga:
- helloworld.xml
- site/helloworld.php
- site/index.html
- admin/index.html
- admin/helloworld.php
- admin/sql/index.html
- admin/sql/updates/index.html
- admin/sql/updates/mysql/index.html
- admin/sql/updates/mysql/0.0.1.sql
El fichero 0.0.1.sql es un archivo vacío que permite inicializar la versión del schema (esquema) del componente com_helloworld.
Los archivos helloworld.php de las dos carpetas (admin y site) por el momento estarán en blanco. Para identificarlos escribimos en uno “Hello World” y al otro “Hello World Administración” respectivamente.
Los archivos index.html van a ser comunes para todas las carpetas durante el proceso de desarrollo del componente y tan solo contendrán esta línea:
<html><body bgcolor="#FFFFFF"></body></html>
El archivo helloworld.xml contendrá toda la distribución de carpetas y archivos que iremos añadiendo a lo largo de este artículo, necesarios para el funcionamiento del componente. Es el archivo clave de nuestro componente, ya que es la única manera que Joomla! tiene para interpretar lo que queremos lograr. El archivo inicialmente contendrá lo siguiente:
Eclipse es uno de los entornos de desarrollo integrados más populares (IDE) en la actualidad. El IDE compatible con una amplia variedad de plugins, que puede ser añadido a la misma. A través de ellas, los desarrolladores pueden ampliar las capacidades de Eclipse y personalizar el IDE para satisfacer sus necesidades particulares. La siguiente es una lista de los mejores 12 de estos plugins que pueden hacer que el desarrollo de aplicaciones una brisa.
Te interesa: Cómo instalar Eclipse en Windows, Linux o Mac.
«Actualmente hay un movimiento global liderado principalmente por Code.org y CodeAcademy que promueve la enseñanza de la programación informática en las escuelas, poniendo el foco en las excelentes posibilidades laborales que se presentan para los jóvenes que sepan programar. Sin embargo, en Programamos nos gusta poner el énfasis en otros beneficios que se obtienen al desarrollar el pensamiento computacional a través de la programación en la edad escolar, y en este artículo presentamos las evidencias que se han encontrado en multitud de estudios científicos en todo el mundo que han evaluado las capacidades, destrezas y competencias desarrolladas por estudiantes al aprender a programar. Si estás buscando regalo de reyes para tus hijos, ¿se te ocurre algo mejor que enseñarles a programar? O mejor aún, ¿por qué no aprendéis juntos a programar videojuegos?.»
Tan grande debía de ser el síndrome de abstinencia de Luis Múzquiz, historiador que por azar terminó trabajando como informático durante un cuarto de su vida, que se ha pasado la última década bajo una montaña de documentos para programar, por su cuenta, una herramienta que se postula como el Google Maps de la Historia. Aunque todavía goza de una visibilidad relativamente pequeña, con una media de 3.000 visitas al día, GeaCron, disponible de forma gratuita en siete idiomas, se ha convertido en el mayor atlas histórico de internet.
Si desea iniciarse en la programación de Joomla, es ideal comenzar por la programación de módulos. En este artículo veremos como realizar un módulo para mostrar los usuarios conectados.
Partiremos de una instalación limpia de Joomla 2.5.
Archivos del módulo
- mod_logedusers.xml (archivo de instalación)
- mod_logedusers.php (punto de entrada del módulo)
- index.html (evita mostrar contenido de directorio)
- helper.php (archivo con funciones de ayuda para nuestro módulo)
- tmpl/default.php (template del módulo)
- tmpl/index.html (evita mostrar contenido de directorio)
Convenciones que usa el framework de Joomla.
- El nombre del archivo de entrada php debe tener el formato “mod_nombremodulo.php”
- El nombre del archivo de instalación debe tener el formato “mod_nombremodulo.xml”
- El template del modulo debe ubicarse en “tmpl/default.php”
- En cada directorio debe incluirse el archivo index.html, con esto se evita que se pueda ver el contenido del directorio.
la tecnología de código abierto está a la orden del día y se está convirtiendo en una delicia para los desarrolladores. Te presentamos 15 aplicaciones de código abierto que pueden hacer que la vida de los desarrolladores sea si cabe, todavía algo más fácil.
La 4º edición del evento tendrá lugar el 26 y 27 de octubre
DrupalCamp es el evento anual dirigido a los seguidores del Software Libre y en concreto de Drupal. Este año, Cáceres acogerá la reunión los días 26 y 27 de octubre en el Complejo Cultural San Francisco. Se contará con la participación de ponentes reconocidos dentro de la comunidad de desarrolladores y la escena empresarial del desarrollo web.
DrupalCamp Spain 2013 es un evento no comercial, organizado por voluntarios cuyo trabajo ha supuesto un gran éxito en las pasadas ediciones del evento en Madrid, Sevilla y Barcelona, tanto a nivel mediático como organizativo.
QuickBASIC, el compilador, que no QBasic, ese Basic que se regalaba con las últimas versiones de MS-DOS fue durante al menos un lustro o una década, mi favorito lenguaje de programación, estructurado, modular que podía hacer llamadas a subrutinas de C/C++, Ensamblador (y otros lenguajes) previamente linkadas en librerías.
El 18 de agosto de 1985, Microsoft lanza la primera versión de QuickBASIC, el software fue vendido en un único disquete de 360KB 5.25".
QBasic fue creado con el objeto de reemplazar al BASICA y GW-BASIC como un lenguaje de programación para el usuario final. QBasic es un entorno de desarrollo integrado y un Intérprete para una variante del lenguaje de programación BASIC basada en el compilador QuickBASIC. El código introducido en el IDE es compilado a una forma intermedia, y ésta es inmediatamente interpretada en demanda dentro del IDE.