<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mundo Geek &#187; joomla</title>
	<atom:link href="http://mundogeek.net/etiqueta/joomla/feed/" rel="self" type="application/rss+xml" />
	<link>http://mundogeek.net</link>
	<description>Mundo geek, bitácora sobre todo lo geek: software, gadgets, tecnología, internet, ...</description>
	<lastBuildDate>Fri, 25 May 2012 14:51:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Creación de componentes para Joomla (II)</title>
		<link>http://mundogeek.net/archivos/2010/02/15/creacion-de-componentes-para-joomla-ii/</link>
		<comments>http://mundogeek.net/archivos/2010/02/15/creacion-de-componentes-para-joomla-ii/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 08:50:42 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[administracion]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=4953</guid>
		<description><![CDATA[Si en el artículo anterior vimos cómo desarrollar la interfaz pública de un componente para Joomla, en esta ocasión veremos cómo crear la interfaz de administración, extendiendo nuestro pequeño componente de ejemplo, que mostraba citas aleatorias de entre las introducidas por los usuarios, y añadiendo opciones para editar y eliminar las citas. Lo primero que [...]]]></description>
			<content:encoded><![CDATA[<p>Si en el artículo anterior vimos cómo <a href="http://mundogeek.net/archivos/2010/02/12/creacion-de-componentes-para-joomla/" title="Creación de componentes para Joomla">desarrollar la interfaz pública de un componente para Joomla</a>, en esta ocasión veremos cómo crear la interfaz de administración, extendiendo nuestro pequeño componente de ejemplo, que mostraba citas aleatorias de entre las introducidas por los usuarios, y añadiendo opciones para editar y eliminar las citas.</p>
<p>Lo primero que tendremos que hacer es editar el archivo XML que contiene la información del componente. Recordaréis que la sección referente a la interfaz de administración (<code>administration</code>) estaba vacía en el ejemplo anterior.<span id="more-4953"></span></p>
<p>Necesitamos añadir una sección <code>files</code>, en la que indicar los archivos que compondrán la parte de administración, y una etiqueta <code>menu</code>, especificando el nombre a mostrar en el menú de Componentes y la página que se cargará al hacer clic sobre él. Algo a tener en cuenta es que <code>file</code> tiene un argumento <code>folder</code> indicando que todos los archivos a los que hacemos referencia se encuentran en una nueva carpeta admin dentro del directorio de nuestro componente.</p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;install type="component" version="1.5"&gt;
  &lt;name&gt;Ejemplo&lt;/name&gt;
  &lt;author&gt;Raul Gonzalez&lt;/author&gt;
  &lt;creationDate&gt;Febrero 2010&lt;/creationDate&gt;
  &lt;copyright&gt;(C) Raul Gonzalez&lt;/copyright&gt;
  &lt;license&gt;GPL&lt;/license&gt;
  &lt;authorUrl&gt;http://mundogeek.net/&lt;/authorUrl&gt;
  &lt;authorEmail&gt;zootropo en gmail&lt;/authorEmail&gt;
  &lt;version&gt;0.1&lt;/version&gt;
  &lt;description&gt;Componente de ejemplo que muestra mensajes aleatorios escritos por los lectores&lt;/description&gt;
  &lt;install&gt;
    &lt;queries&gt;
      &lt;query&gt;CREATE TABLE IF NOT EXISTS jos_mensajes(
          id int NOT NULL auto_increment,
          mensaje varchar(300) NOT NULL, PRIMARY KEY(id));&lt;/query&gt;
      &lt;query&gt;INSERT INTO jos_mensajes(mensaje) VALUES
          ('At your command'),
          ('Hay 10 tipos de personas en el mundo: los que entienden binario y los que no'),
          ('Es mio, solo mio. Miii.... tessssssooooroo'),
          ('Hasta luego, y gracias por el pescado');&lt;/query&gt;
    &lt;/queries&gt;
  &lt;/install&gt;
  &lt;files&gt;
    &lt;file&gt;ejemplo.php&lt;/file&gt;
    &lt;file&gt;ejemplo.xml&lt;/file&gt;
    &lt;folder&gt;controllers&lt;/folder&gt;
    &lt;folder&gt;models&lt;/folder&gt;
    &lt;folder&gt;views&lt;/folder&gt;
  &lt;/files&gt;
  &lt;administration&gt;
    &lt;menu link="option=com_ejemplo"&gt;Ejemplo&lt;/menu&gt;
    &lt;files folder="admin"&gt;
      &lt;file&gt;ejemplo.php&lt;/file&gt;
      &lt;file&gt;controller.php&lt;/file&gt;
      &lt;folder&gt;views&lt;/folder&gt;
    &lt;/files&gt;
  &lt;/administration&gt;
&lt;/install&gt;</pre>
<p>En el tutorial anterior ya comentamos que el punto de entrada al componente, tanto en el caso de la interfaz pública como el de la administración, es un archivo PHP con el nombre del componente, y que este, normalmente, no hará más que cargar el controlador adecuado. En este caso sólo vamos a utilizar un controlador, por lo que el código es mucho más sencillo. Creemos un nuevo archivo ejemplo.php dentro de nuestra nueva carpeta admin, con el siguiente contenido:</p>
<pre name="code" class="php">&lt;?php
defined('_JEXEC') or die('Restricted access');

require_once('controller.php');

$controller = new EjemploController();

$controller->execute($task);
$controller->redirect();</pre>
<p>Como vemos lo único que hace es cargar el código de nuestro único controlador, instanciar la clase, y ejecutar el método adecuado en el objeto dependiendo del parámetro <code>task</code> de la petición.</p>
<p>Creemos ahora el archivo controller.php en la carpeta admin:</p>
<pre name="code" class="php">&lt;?php
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.controller');

class EjemploController extends JController {
  function __construct() {
    parent::__construct();
    $this-&gt;addModelPath(JPATH_COMPONENT_SITE.DS.'models');
  }

  function display() {
    $vista = $this-&gt;getView('ejemplo', 'html');
    $modelo = $this-&gt;getModel('mensaje', 'EjemploModel');
    $vista-&gt;setModel($modelo, true);

    parent::display();
  }

  function edit() {
    $vista = $this-&gt;getView('ejemplo', 'html');
    $modelo = $this-&gt;getModel('mensaje', 'EjemploModel');
    $vista-&gt;setModel($modelo, true);

    $vista-&gt;edit();
  }

  function save() {
    $modelo = $this-&gt;getModel('mensaje', 'EjemploModel');
    $id = JRequest::getVar('id');
    $mensaje = JRequest::getVar('mensaje');

    $correcto = $modelo-&gt;actualizarMensaje($id, $mensaje);

    if($correcto)
      $this-&gt;setRedirect('index.php?option=com_ejemplo', 'Mensaje actualizado con &eacute;xito');
    else
      $this-&gt;setRedirect('index.php?option=com_ejemplo', 'Ocurri&oacute; un error al actualizar el mensaje', 'error');
  }

  function remove() {
    $modelo = $this-&gt;getModel('mensaje', 'EjemploModel');
    $cid = JRequest::getVar('cid', 0, '', 'array');
    $correcto = true;
    foreach($cid as $id) {
      $resultado = $modelo-&gt;eliminarMensaje($id);
      if(!$resultado)
        $correcto = false;
    }

    if($correcto)
      $this-&gt;setRedirect('index.php?option=com_ejemplo', 'Mensajes eliminados con &eacute;xito');
    else
      $this-&gt;setRedirect('index.php?option=com_ejemplo', 'Ocurri&oacute; un error al eliminar los mensajes', 'error');
  }
}</pre>
<p>En esta ocasión sobreescribimos el constructor del controlador para añadir una llamada al método <code>addModelPath</code>. Hacemos uso de este método para que el controlador tenga en cuenta también la carpeta en la que almacenamos el modelo en la interfaz pública. Editaremos ese archivo para añadir los nuevos métodos que necesitemos, en lugar de crear otro archivo de modelo. También podríamos haber almacenado el archivo en la carpeta de la parte de administración y hacer uso del método <code>addModelPath</code> en el controlador de la parte pública.</p>
<p>Si quisiéramos hacer uso de una vista de la parte pública, aunque es algo menos común, podríamos haber hecho uso del método <code>addViewPath</code>.</p>
<p>El resto del código no tiene mayor misterio.</p>
<p>Sólo nos queda crear la vista y las plantillas que vamos a utilizar. Creamos una carpeta views, dentro una carpeta ejemplo, y en ella un archivo view.html.php.</p>
<pre name="code" class="php">&lt;?php
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.view');

class EjemploViewEjemplo extends JView {
  function display($tpl=null) {
    JToolBarHelper::title('Mensajes');
    JToolBarHelper::deleteList();
    JToolBarHelper::editList();

    $mensajes =&#038; $this-&gt;get('Mensajes');
    $this-&gt;assignRef('mensajes', $mensajes);

    parent::display($tpl);
  }

  function edit() {
    JToolBarHelper::title('Editar mensaje');
    JToolBarHelper::save();
    JToolBarHelper::cancel();

    $modelo = $this-&gt;getModel();
    $cid = JRequest::getVar('cid', 0, '', 'array');

    $mensaje = $modelo-&gt;getMensajePorId($cid[0]);
    $this-&gt;assignRef('mensaje', $mensaje);

    parent::display('editar');
  }
}</pre>
<p>En esta ocasión para generar nuestra vista hacemos uso de la clase <code>JToolBarHelper</code>, que contiene métodos para facilitarnos la creación de la barra de herramientas de nuestro componente. Tiene métodos para añadir títulos (<code>title</code>), divisores (<code>divider</code>), espaciadores (<code>spacer</code>), &#8230; botones de ayuda (<code>help</code>), para guardar elementos (<code>save</code>), borrar (<code>trash</code>), publicar (<code>publish</code>), &#8230; Este es el motivo de que haya utilizado palabras inglesas para nombrar los métodos del controlador: al pulsar el botón generado por <code>editList</code>, por ejemplo, se intentará ejecutar por defecto una tarea <code>edit</code>.</p>
<p>Este es el aspecto que tendrá ahora nuestro modelo, una vez editado el archivo correspondiente en la carpeta de la interfaz pública:</p>
<pre name="code" class="php">&lt;?php
defined('_JEXEC') or die('Restricted access');
jimport('joomla.application.component.model');

class EjemploModelMensaje extends JModel {
  function getMensaje() {
    $db =&#038; JFactory::getDBO();
    $query = 'SELECT mensaje FROM #__mensajes ORDER BY RAND() LIMIT 1';
    $db-&gt;setQuery($query);
    return $db-&gt;loadResult();
  }

  function getMensajePorId($id) {
    $db =&#038; JFactory::getDBO();
    $query = "SELECT id, mensaje FROM #__mensajes WHERE id='{$id}'";
    $db-&gt;setQuery($query);
    return $db-&gt;loadObject();
  }

  function eliminarMensaje($id) {
    $db =&#038; JFactory::getDBO();
    $query = "DELETE FROM #__mensajes WHERE id='{$id}'";
    $db-&gt;setQuery($query);
    $db-&gt;query();

    if ($db-&gt;getErrorNum())
      return false;

    return true;
  }

  function actualizarMensaje($id, $mensaje) {
    $db =&#038; JFactory::getDBO();
    $query = "UPDATE #__mensajes SET mensaje='{$mensaje}' WHERE id='{$id}'";
    $db-&gt;setQuery($query);
    $db-&gt;query();

    if ($db-&gt;getErrorNum())
      return false;

    return true;
  }

  function getMensajes() {
    $query = 'SELECT id, mensaje FROM #__mensajes ORDER BY id ASC';
    return $this-&gt;_getList($query);
  }

  function anyadirMensaje($mensaje) {
    $db =&#038; JFactory::getDBO();
    $query = "INSERT INTO #__mensajes(mensaje) VALUES('{$mensaje}')";
    $db-&gt;setQuery($query);
    $db-&gt;query();

    if ($db-&gt;getErrorNum())
      return false;

    return true;
  }
}</pre>
<p>Lo único destacable es el uso del método <code>_getList</code>, que toma una consulta SQL y devuelve una lista con los resultados.</p>
<p>Vamos por último con las plantillas. Creamos la carpeta tmpl en views/ejemplo y en esta un archivo default.php, que será la plantilla que mostrará la lista de los mensajes almacenados en la base de datos.</p>
<pre name="code" class="php">&lt;?php defined('_JEXEC') or die('Restricted access'); ?&gt;

&lt;form action="index.php" method="post" name="adminForm"&gt;
  &lt;table class="adminlist"&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th width="5"&gt;ID&lt;/th&gt;
      &lt;th width="20"&gt;&lt;input type="checkbox" name="toggle" value="" onclick="checkAll(&lt;?php echo count($this-&gt;mensajes); ?&gt;);"/&gt;&lt;/th&gt;
      &lt;th&gt;Mensaje&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;?php
  $i = 0;
  foreach($this-&gt;mensajes as $mensaje) {
  ?&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;?php echo $mensaje-&gt;id; ?&gt;&lt;/td&gt;
      &lt;td&gt;&lt;?php echo JHTML::_('grid.id', $i, $mensaje-&gt;id); ?&gt;&lt;/td&gt;
      &lt;td&gt;&lt;?php echo "&lt;a href='index.php?option=com_ejemplo&#038;task=edit&#038;cid[]={$mensaje-&gt;id}'&gt;{$mensaje-&gt;mensaje}&lt;/a&gt;"; ?&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;?php
    $i++;
  }
  ?&gt;
  &lt;/table&gt;

  &lt;input type="hidden" name="option" value="com_ejemplo" /&gt;
  &lt;input type="hidden" name="task" value="" /&gt;
  &lt;input type="hidden" name="boxchecked" value="0" /&gt;
&lt;/form&gt;</pre>
<p>Aquí hay que tener en cuenta varias convenciones. Por ejemplo, el formulario tiene que tener como valor para el atributo <code>name</code> &#8220;<code>adminForm</code>&#8220;, para que funcione el script que marca todos los checkboxes al marcar el primero, y la tabla tiene que tener como valor para el atributo <code>class</code> &#8220;<code>adminlist</code>&#8220;, si queremos que esta tenga el aspecto definido en la hoja de estilo.</p>
<p>A parte de eso lo único interesante es el uso del método <code>JHTML::_()</code>, que se utiliza para generar código HTML de uso común. Toma como primer parámetro una cadena con formato &#8220;clase.metodo&#8221;, lo que indica que queremos ejecutar el método indicando de la clase <code>JHTML<em>Clase</em></code>. Si no se especifica ninguna clase, se llamará al metodo con ese nombre de la clase <code>JHTML</code>, si existe. Cualquier otro parámetro extra que se le pase a <code>JHTML::_()</code> se pasará como parámetro al método que queremos ejecutar.</p>
<p>Estas clases que agrupan código HTML de uso común son <code>JHTMLBehavior</code>, <code>JHTMLContent</code>, <code>JHTMLEmail</code>, <code>JHTMLForm</code>, <code>JHTMLGrid</code>, <code>JHTMLImage</code>, <code>JHTMLList</code>, <code>JHTMLMenu</code> y <code>JHTMLSelect</code>.</p>
<p>El método <code>id</code> de <code>JHtmlGrid</code>, concretamente, genera un widget de tipo checkbox que sigue las convenciones necesarias para que se utilice para seleccionar un elemento por su identificador.</p>
<p>Por último veamos la plantilla que se encargará de crear el formulario con el que editar el mensaje, default_editar.php. Este formulario es incluso más sencillo, y no requiere de mayores explicaciones.</p>
<pre name="code" class="php">&lt;?php defined('_JEXEC') or die('Restricted access'); ?&gt;

&lt;form action="index.php" method="post" name="adminForm" id="adminForm"&gt;
  &lt;table class="admintable"&gt;
    &lt;tr&gt;
      &lt;td width="100" align="right" class="key"&gt;&lt;label for="mensaje"&gt;Mensaje:&lt;/label&gt;&lt;/td&gt;
      &lt;td&gt;&lt;input type="text" name="mensaje" id="mensaje" maxlength="300" value="&lt;?php echo $this-&gt;mensaje-&gt;mensaje;?&gt;" /&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;

  &lt;input type="hidden" name="option" value="com_ejemplo" /&gt;
  &lt;input type="hidden" name="id" value="&lt;?php echo $this-&gt;mensaje-&gt;id; ?&gt;" /&gt;
  &lt;input type="hidden" name="task" value="" /&gt;
&lt;/form&gt;</pre>
<link type="text/css" rel="stylesheet" href="http://mundogeek.net/sh/css/SyntaxHighlighter.css"></link><script language="javascript" src="http://mundogeek.net/sh/js/shCore.js"></script><script language="javascript" src="http://mundogeek.net/sh/js/shBrushPhp.js"></script><script language="javascript" src="http://mundogeek.net/sh/js/shBrushXml.js"></script><script language="javascript">dp.SyntaxHighlighter.ClipboardSwf = 'http://mundogeek.net/sh//flash/clipboard.swf';dp.SyntaxHighlighter.HighlightAll('code');</script><br />
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2010/02/15/creacion-de-componentes-para-joomla-ii/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Creación de componentes para Joomla</title>
		<link>http://mundogeek.net/archivos/2010/02/12/creacion-de-componentes-para-joomla/</link>
		<comments>http://mundogeek.net/archivos/2010/02/12/creacion-de-componentes-para-joomla/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 09:50:30 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[componentes]]></category>
		<category><![CDATA[desarollo]]></category>
		<category><![CDATA[extensiones]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=4936</guid>
		<description><![CDATA[Siguiendo con nuestra serie de tutoriales sobre Joomla, esta vez hablaremos sobre el desarrollo de componentes, otro de los tipos de extensiones disponibles para este CMS, junto con los plugins, los temas, las traducciones o los módulos. Componentes en Joomla Los componentes son extensiones más complejas que los módulos, y suelen contar con una parte [...]]]></description>
			<content:encoded><![CDATA[<p>Siguiendo con nuestra serie de <a href="http://mundogeek.net/etiqueta/joomla+tutorial/" title="Tutoriales sobre Joomla">tutoriales sobre Joomla</a>, esta vez hablaremos sobre el desarrollo de componentes, otro de los tipos de extensiones disponibles para este CMS, junto con los plugins, los temas, las traducciones o los <a href="http://mundogeek.net/archivos/2010/01/14/creacion-de-modulos-en-joomla/" title="Creación de módulos para Joomla">módulos</a>.<span id="more-4936"></span></p>
<h2>Componentes en Joomla</h2>
<p>Los componentes son extensiones más complejas que los módulos, y suelen contar con una parte pública o frontend y otra de administración o backend.</p>
<p>Sólo puede haber un componente activo por página, y este se determina mediante un argumento <code>option</code> en la petición HTTP, que contendrá el nombre del componente a cargar. Para un componente con nombre <code>com_componente</code>, por ejemplo, la URL para ejecutar el backend sería http://servidor.com/administrator/index.php?option=com_componente y la del frontend, http://servidor.com/index.php?option=com_componente.</p>
<p>Cuando Joomla! se encuentra con una URL de este tipo, con un parámetro <code>option</code> indicando el nombre de un cierto componente, el engine busca y ejecuta el archivo components/com_<em>nombre</em>/<em>nombre</em>.php si se trata del frontend y administrator/components/com_<em>nombre</em>/<em>nombre</em>.php si vamos a cargar el backend.</p>
<p>Aunque podríamos escribir todo el código del componente en estos dos archivos, es conveniente que nuestro código esté algo más estructurado.</p>
<p>De un tiempo a esta parte, afortunadamente, se está tendiendo a utilizar el patrón MVC a la hora de crear componentes para Joomla, por lo que el contenido de estos dos archivos suele consistir simplemente en la instanciación y ejecución de un controlador.</p>
<h3>El patrón MVC en los componentes Joomla</h3>
<p>¿Que qué es un controlador, o el patrón MVC, ya que estamos? MVC es un viejo conocido de los desarrolladores web que propone usar una arquitectura dividida en 3 capas diferenciadas, en pos de reducir el acoplamiento. Estas capas, cuyas siglas dan nombre al patrón son:</p>
<ul>
<li>Modelo: los datos que maneja la aplicación y las reglas de negocio que operan sobre ellos</li>
<li>Vista: genera la interfaz con la que la aplicación interacciona con el usuario</li>
<li>Controlador: comunica la vista y el modelo respondiendo a eventos generados por el usuario en la vista, invocando cambios en el modelo, y proporcionando a la vista la información del modelo necesaria para que pueda generar la respuesta adecuada para el usuario</li>
</ul>
<p>El patrón MVC se implementa en Joomla utilizando 3 clases distintas, una por cada componente del patrón: <code>JModel</code> para el modelo, <code>JView</code> para la vista y <code>JController</code> para el controlador.</p>
<p>Un controlador en Joomla es una clase que extiende <code>JController</code>, con un método para cada tarea con la que el controlador tenga que tratar: mostrar un elemento, crear un elemento, borrar un elemento, etc. En estos métodos el controlador analiza la entrada del usuario y lleva a cabo los pasos necesarios para generar la respuesta (seleccionar el modelo o modelos necesarios y la vista a utilizar y asociarlos, hacer una redirección, generar un error&#8230;)</p>
<p>Un modelo en Joomla es una clase que extiende <code>JModel</code>, con distintos métodos para realizar distintas acciones sobre los datos. No importa la forma que tomen estos datos o la forma en la que trabajemos con ellos: podríamos utilizar <code>JTable</code>, <code>JDatabase</code>, mysqli, las funciones para trabajar con ficheros&#8230;</p>
<p>Una vista en Joomla es una clase que extiende <code>JView</code>, con uno o más métodos para generarar la página HTML, el feed, el PDF, &#8230; que mostrar al usuario como respuesta. Cuando la respuesta es una página HTML, la vista suele hacer uso de plantillas.</p>
<h3>Punto de entrada al componente</h3>
<p>Ahora que ya hemos establecido en qué consiste el patrón MVC, veamos el aspecto que tendrá el archivo que actúa a modo de punto de entrada al componente, y que, como dijimos anteriormente, se ejecuta al cargar la URL http://servidor.com/index.php?option=com_nombre (vamos a centrarnos en este artículo en el frontend)</p>
<p>Recordaréis que este archivo debía instanciar el controlador y ejecutarlo. Eso es lo que hace este fragmento de código:</p>
<pre name="code" class="php">&lt;?php
defined('_JEXEC') or die('Restricted access');

$controller = JRequest::getWord('controller', 'default');
$path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php';

if(file_exists($path)) {
  require_once($path);
  $classname = 'EjemploController'.$controller;
  $controller = new $classname();

  $controller-&gt;execute($task);
  $controller-&gt;redirect();
}</pre>
<p>Es una práctica común el utilizar un controlador por cada tipo de entidad con el que vayamos a trabajar, y utilizar el parámetro <code>controller</code> para indicar el controlador a usar; ese es el motivo de que usemos <code>JRequest</code> para obtener su valor. En caso de que no se haya encontrado ningún parámetro <code>controller</code> en la petición, la variable <code>$controller</code> obtendrá como valor &#8216;<code>default</code>&#8216;.</p>
<p>Una vez sabemos qué controlador cargar (uno especificado en la URL, o <code>default</code>) comprobaremos si realmente existe un archivo PHP con ese nombre en la carpeta controllers de nuestro componente.</p>
<p>Si es el caso, cargaremos el código del componente, instanciaremos la clase, llamaremos a su método <code>execute</code> pasándole como argumento el valor del parámetro <code>task</code> de la URL (que se guarda automáticamente en <code>$task</code>), y llamaremos a su método <code>redirect</code>.</p>
<p>El método <code>execute</code> del controlador es el encargado de llamar a uno u otro de los métodos del controlador para tratar la petición. Normalmente se ejecutará el método que tenga el nombre pasado como parámetro a <code>execute</code>, aunque se puede modificar el mapeo utilizando el método <code>registerTask()</code> (por ejemplo para que el mismo método se encargue de la tarea de editar y crear un nuevo elemento). Si la URL no tiene ningún parámetro <code>task</code>, y por lo tanto se le pasa una cadena vacía a <code>execute</code>, o si el valor no se encuentra en el mapeo, se ejecutará por defecto el método de nombre <code>display</code>.</p>
<p>El método <code>redirect</code> sirve para redirigir el navegador en caso de que en el método ejecutado en el controlador se estableciera una redirección (mediante el método <code>setRedirect</code>).</p>
<h3>Controlador</h3>
<p>Un controlador muy sencillo, que no hace más que ejecutar la vista asociada podría tener este aspecto:</p>
<pre name="code" class="php">&lt;?php
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.controller');

class EjemploController extends JController {
  function display() {
    parent::display();
  }
}</pre>
<p>De hecho, como nuestro método <code>display</code>, que, como ya hemos comentado, es el que se ejecuta si no se pasa ningún argumento a <code>execute</code> en el punto de entrada, sólo llama al método <code>display</code> del objeto padre, no tendríamos si quiera por qué sobre escribirlo:</p>
<pre name="code" class="php">&lt;?php
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.controller');

class EjemploController extends JController {}</pre>
<p>Pero normalmente nuestros controladores no serán tan sencillos. Lo más habitual es encontrarse con 2 tipos de métodos: aquellos en los que sólo queremos mostrar una cierta información al usuario, y otros en los que realizaremos una acción sobre el modelo, y redirigiremos el navegador a otra URL para mostrar el resultado.</p>
<p>En el primer caso sólo tenemos que establecer la vista y la plantilla a utilizar, y ejecutarla.</p>
<pre name="code" class="php">function display() {
  JRequest::setVar('view', 'persona');
  JRequest::setVar('layout', 'default');

  parent::display();
}</pre>
<p>o bien</p>
<pre name="code" class="php">function display() {
  JRequest::setVar('view', 'persona');

  parent::display('default');
}</pre>
<p>dado que default es la plantilla que se carga por defecto, si sólo vamos a usar una plantilla, o bien, si vamos a utilizar la plantilla default, no será necesario indicarlo</p>
<pre name="code" class="php">function display() {
  JRequest::setVar('view', 'persona');

  parent::display();
}</pre>
<p>En el segundo caso tendríamos algo así</p>
<pre name="code" class="php">function guardar() {
  $modelo = $this-&gt;getModel('persona');
  if($modelo-&gt;guardarPersona())
    $this-&gt;setRedirect('index.php?option=com_nombre', 'Persona guardada con exito');
  else
    $this-&gt;setRedirect('index.php?option=com_nombre', 'Error al guardar', 'error');
}</pre>
<h3>Vista</h3>
<p>Como dijimos, las vistas consisten en clases que extienden <code>JView</code>. En estas clases nos interesará sobreescribir el método <code>display</code>, donde asignaremos las variables que la plantilla pueda necesitar con <code>assign</code> o <code>assignRef</code> (el primero asigna una copia del dato y el segundo una referencia) y llamaremos al método <code>display</code> de la clase padre para que renderice la plantilla.</p>
<pre name="code" class="php">class EjemploViewDefault extends JView {
  function display($tpl=null) {
    $this-&gt;assignRef('mensaje', 'Hola mundo');

    parent::display($tpl);
  }
}</pre>
<p>Para obtener datos del modelo en la vista se puede hacer lo siguiente</p>
<pre name="code" class="php">class EjemploViewDefault extends JView {
  function display($tpl=null) {
    $modelo =&#038; $this-&gt;getModel('MiModelo');
    $mensaje = $modelo-&gt;getMensaje();
    $this-&gt;assignRef('mensaje', $mensaje);

    parent::display($tpl);
  }
}</pre>
<p>Si el modelo tiene el mismo nombre que la vista, lo cuál suele ser habitual, porque es práctica común usar una vista y un modelo por entidad, de la misma forma que hacíamos con los controladores, el modelo estará asociado automaticamente con la vista, y bastará con hacer algo así:</p>
<pre name="code" class="php">class EjemploViewDefault extends JView {
  function display($tpl=null) {
    $mensaje =&#038; $this-&gt;get('Mensaje');
    $this-&gt;assignRef('mensaje', $mensaje);

    parent::display($tpl);
  }
}</pre>
<p>Al llamar al método <code>get</code> la vista buscará en el modelo asociado un método con nombre <code>get</code> seguido de la cadena pasada como parámetro (<code>getMensaje</code> en el ejemplo) y lo ejecutará.</p>
<p>Por último, como dijimos, si vamos a usar la plantilla por defecto, default.php, no necesitaremos pasar a <code>display</code> ningún parámetro:</p>
<pre name="code" class="php">class EjemploViewDefault extends JView {
  function display($tpl=null) {
    $mensaje =&#038; $this-&gt;get('Mensaje');
    $this-&gt;assignRef('mensaje', $mensaje);

    parent::display();
  }
}</pre>
<p>Las plantillas son archivos PHP en los que casi todo es HTML, y se usan pequeños snipets PHP para imprimir los valores necesarios en las posiciones adecuadas. Se podría crear el código HTML de la respuesta en la clase de la vista utilizando <code>echo</code>, por ejemplo, pero el uso de plantillas facilitará la vida a los diseñadores, o, si no hay diseñadores, a nosotros, cuando tengamos que reutilizar código o mantener el componente.</p>
<p>En la plantilla se accede a los datos que se han asignado con <code>assign</code> y <code>assignRef</code> usando <code>$this-&gt;dato</code></p>
<pre name="code" class="php">&lt;h1&gt;&lt;?php echo $this-&gt;dato; ?&gt;&lt;/h1&gt;</pre>
<p>En la plantilla también se puede usar <code>$this-&gt;loadTemplate('plantilla');</code> para cargar otra plantilla y tener así un diseño más modular. En el siguiente código se cargaría una plantilla default_cabecera.php, por ejemplo:</p>
<pre name="code" class="php">&lt;?php $this-&gt;loadTemplate('cabecera'); ?&lt;

&lt;h1&gt;&lt;?php echo $this-&gt;dato; ?&gt;&lt;/h1&gt;</pre>
<h3>Modelo</h3>
<p>Por último tenemos el modelo. Estas son las clases más sencillas. Basta extender <code>JModel</code> y crear tantos métodos como queramos, que realizarán las operaciones sobre los datos que necesitemos. Un ejemplo podría ser</p>
<pre name="code" class="php">&lt;?php
defined('_JEXEC') or die('Restricted access');
jimport('joomla.application.component.model');

class ModelEjemplo extends JModel {
  function getMensaje() {
    $db =&#038; JFactory::getDBO();
    $query = 'SELECT mensaje FROM #__mensajes ORDER BY RAND() LIMIT 1';
    $db-&gt;setQuery($query);
    return $db-&gt;loadResult();
  }
}</pre>
<h2>Crear un componente de ejemplo</h2>
<p>Para continuar, vamos a crear un pequeño componente de ejemplo, basado en el típico hola mundo, que mostrará un mensaje aleatorio de entre los almacenados en una tabla de la base de datos.</p>
<p>Lo primero que tenemos que hacer es crear una carpeta en nuestra máquina, com_ejemplo, digamos, en la que almacenaremos los archivos de nuestro nuevo componente. Dentro de esta carpeta crearemos un archivo ejemplo.xml con la información del componente e información de la instalación (puede tener un nombre cualquiera, pero lo habitual es utilizar el nombre del componente, o install.xml):</p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;install type="component" version="1.5"&gt;
  &lt;name&gt;Ejemplo&lt;/name&gt;
  &lt;author&gt;Raul Gonzalez&lt;/author&gt;
  &lt;creationDate&gt;Febrero 2010&lt;/creationDate&gt;
  &lt;copyright&gt;(C) Raul Gonzalez&lt;/copyright&gt;
  &lt;license&gt;GPL&lt;/license&gt;
  &lt;authorUrl&gt;http://mundogeek.net/&lt;/authorUrl&gt;
  &lt;authorEmail&gt;zootropo en gmail&lt;/authorEmail&gt;
  &lt;version&gt;0.1&lt;/version&gt;
  &lt;description&gt;Componente de ejemplo que muestra mensajes aleatorios escritos por los lectores&lt;/description&gt;
  &lt;install&gt;
    &lt;queries&gt;
      &lt;query&gt;CREATE TABLE IF NOT EXISTS jos_mensajes(
              id int NOT NULL auto_increment,
              mensaje varchar(300) NOT NULL, PRIMARY KEY(id));&lt;/query&gt;
      &lt;query&gt;INSERT INTO jos_mensajes(mensaje) VALUES
              ('At your command'),
              ('Hay 10 tipos de personas en el mundo: los que entienden binario y los que no'),
              ('Es mio, solo mio. Miii.... tessssssooooroo'),
              ('Hasta luego, y gracias por el pescado');&lt;/query&gt;
    &lt;/queries&gt;
  &lt;/install&gt;
  &lt;files&gt;
    &lt;file&gt;ejemplo.php&lt;/file&gt;
    &lt;file&gt;ejemplo.xml&lt;/file&gt;
    &lt;folder&gt;controllers&lt;/folder&gt;
    &lt;folder&gt;models&lt;/folder&gt;
    &lt;folder&gt;views&lt;/folder&gt;
  &lt;/files&gt;
  &lt;administration/&gt;
&lt;/install&gt;</pre>
<p>como véis no es muy distinto del archivo de instalación que utilizamos <a href="http://mundogeek.net/archivos/2010/01/14/creacion-de-modulos-en-joomla/" title="Creación de módulos en Joomla">al crear nuestro primer módulo</a>, a excepción de la sección <code>administration</code>, que en este ejemplo está vacía, pero normalmente listará los archivos de la parte de administración, y la sección <code>install</code>, que utilizamos en este caso para crear la tabla que usaremos para almacenar los mensajes, e introducir algunos mensajes iniciales.</p>
<p>El siguiente paso es crear el archivo que sirve de punto de entrada al componente, que, como ya comentamos, tendrá como nombre el mismo del componente sin el com_; es decir, en este caso, ejemplo.php. El contenido del mismo ya lo explicamos anteriormente:</p>
<pre name="code" class="php">&lt;?php
defined('_JEXEC') or die('Restricted access');

$controller = JRequest::getWord('controller', 'mensaje');
$path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php';

if(file_exists($path)) {
  require_once($path);
  $classname = 'EjemploController'.$controller;
  $controller = new $classname();

  $controller-&gt;execute($task);
  $controller-&gt;redirect();
}</pre>
<p>En este ejemplo, que es tan sencillo, no tiene mucho sentido tener más de un controlador, pero utilizaremos este código igualmente para que nuestro componente sea más fácil de extender y para que el ejemplo sea más instructivo.</p>
<p>Ahora tenemos que crear una carpeta controllers (fíjate en el valor de <code>$path</code> en el código anterior) en la que crearemos el archivo de nuestro controlador por defecto, que en este caso, como habréis supuesto por el segundo argumento de <code>JRequest::getWord</code>, será mensaje.php. Como dijimos, es habitual utilizar un controlador por entidad con la que vayamos a tratar, y el nombre del archivo suele ser el de la entidad. El nombre de la clase suele ser el nombre del componente, seguido de &#8216;<code>Controller</code>&#8216; y el nombre de la entidad (<code>EjemploControllerMensaje</code> en este caso).</p>
<p>En este ejemplo sólo necesitamos un método <code>display</code> (mostrar), que, como comentamos, es el que se ejecuta por defecto de no pasarse ningún otro valor al método <code>execute</code>.</p>
<pre name="code" class="php">&lt;?php
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.controller');

class EjemploControllerMensaje extends JController {
  function display() {
    JRequest::setVar('view', 'mensaje');
    parent::display();
  }
}</pre>
<p>Listo. Con algo tan simple ya tenemos nuestro primer controlador. Vayamos con la vista.</p>
<p>Creamos una carpeta views en el directorio del componente. En esta carpeta, para cada vista que vayamos a utilizar tendremos un directorio con el nombre de la vista, que contendrá a su vez un archivo view.html.php si vamos a generar una página HTML, view.feed.php si vamos a generar un feed, view.pdf.php si la salida será un PDF, o view.raw.php para cualquier otra cosa (el CMS sabe qué tipo de salida se debe mostrar al usuario gracias al parámetro <code>format</code> de la URL).</p>
<p>En nuestro ejemplo utilizaremos una vista para la única entidad con la que vamos a trabajar, aunque hay personas que prefieren tener una vista por cada página que vayamos a utilizar en el componente.</p>
<p>Crearemos, por lo tanto, una carpeta &#8216;mensaje&#8217; en views, y un archivo view.html.php en mensaje. El archivo view.html.php contendrá, como dijimos, una clase que extiende <code>JView</code>, y cuyo nombre estará compuesto por el nombre del componente, la palabra <code>View</code>, y el nombre de la vista (el nombre de la entidad). Como vamos a seguir las convenciones de nombres habituales, la vista tendrá asociado el modelo correspondiente, y sólo tenemos que llamar a <code>$this-&gt;get('Mensaje')</code> para que se busque y ejecute el método <code>getMensaje</code> en el modelo, y obtener de esta forma el mensaje a mostrar. Una vez hecho esto basta asignar este valor para que esté disponible para la plantilla.</p>
<pre name="code" class="php">&lt;?php
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.view');

class EjemploViewMensaje extends JView {
  function display($tpl=null) {
    $mensaje =&#038; $this-&gt;get('Mensaje');
    $this-&gt;assign('mensaje', $mensaje);

    parent::display();
  }
}</pre>
<p>Sigamos con la plantilla. En el mismo directorio en que se encuentra view.html.php crearemos una nueva carpeta tmpl para contener las plantillas o templates. Como sólo necesitaremos una plantilla, vamos a llamar a este archivo default.php, que es la plantilla que se carga por defecto de no indicarse otra cosa. Este archivo sólo tiene que hacer una cosa, y es mostrar el mensaje que se ha asignado en la clase de la vista.</p>
<pre name="code" class="php">&lt;h1 style="text-align:center;"&gt;&lt;?php echo $this-&gt;mensaje; ?&gt;&lt;/h1&gt;</pre>
<p>Por último veamos el modelo. Crearemos una nueva carpeta models en el directorio del componente, con un archivo mensaje.php que contendrá una clase cuyo nombre estará formado por el nombre del componente, la palabra &#8216;<code>Model</code>&#8216; y el nombre de la entidad. En este ejemplo sólo utilizamos un método <code>getMensaje</code> para obtener un mensaje aleatorio de la base de datos.</p>
<pre name="code" class="php">&lt;?php
defined('_JEXEC') or die('Restricted access');
jimport('joomla.application.component.model');

class EjemploModelMensaje extends JModel {
  function getMensaje() {
    $db =&#038; JFactory::getDBO();
    $query = 'SELECT mensaje FROM #__mensajes ORDER BY RAND() LIMIT 1';
    $db-&gt;setQuery($query);
    return $db-&gt;loadResult();
  }
}</pre>
<p>Con esto ya tendríamos preparado nuestro componente. Sólo resta comprimir los archivos que lo componen e instalarlo desde Extensiones -&gt; Instalar/Desinstalar. Para ver el resultado, tendremos que introducir en el navegador la URL http://servidor.com/index.php?option=com_ejemplo</p>
<h3>Complicando el componente</h3>
<p>Como puede que el ejemplo anterior os haya sabido a poco, vamos a añadir también la posibilidad de que los usuarios puedan introducir sus propios mensajes, para afianzar conceptos.</p>
<p>Lo primero que tenemos que hacer es editar el controlador, y crear un par de nuevos métodos que traten las nuevas tareas &#8216;<code>anyadir</code>&#8216;, que mostará un formulario con el que introducir el mensaje, y &#8216;<code>anyadido</code>&#8216;, que intentará guardar el mensaje y mostrará un texto u otro dependiendo del resultado.</p>
<pre name="code" class="php">&lt;?php
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.controller');

class EjemploControllerMensaje extends JController {
  function display() {
    JRequest::setVar('view', 'mensaje');
    parent::display();
  }

  function anyadir() {
    $vista = $this-&gt;getView('mensaje', 'html');

    $vista-&gt;anyadir('anyadir');
  }

  function anyadido() {
    $mensaje = JRequest::getVar('mensaje');
    $modelo = $this-&gt;getModel('mensaje');

    if($modelo-&gt;anyadirMensaje($mensaje))
      $this-&gt;setRedirect('index.php?option=com_ejemplo', 'Mensaje a&ntilde;adido con &eacute;xito');
    else
      $this-&gt;setRedirect('index.php?option=com_ejemplo', 'Se produjo un error al guardar el mensaje', 'error');
  }
}</pre>
<p>Lo único destacable respecto de la versión anterior es que ahora necesitamos obtener una instancia de la vista, con el método <code>getView(<em>vista</em>, <em>formato</em>)</code> del controlador, para poder ejecutar un método distinto de <code>display</code> en la vista. Otra alternativa habría sido tener una vista distinta por página.</p>
<p>Un apunte interesante es que con <code>JRequest::get('post')</code> podemos obtener todos los datos de una petición POST, de forma que podríamos haber hecho algo así para guardar todos los datos de un formulario en la base de datos usando <code>JTable</code>:</p>
<pre name="code" class="php">$persona =&#038; JTable::getInstance('persona', 'Table');
if ($persona-&gt;save(JRequest::get('post'))
  $mensaje = 'Guardado';
else
  $mensaje = 'Error: ', $empleado-&gt;getError();  

$this-&gt;setRedirect('index.php?option=com_componente', $mensaje);</pre>
<p>La nueva versión de la vista, con el nuevo método <code>anyadir</code>, tendrá el siguiente aspecto:</p>
<pre name="code" class="php">&lt;?php
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.view');

class EjemploViewMensaje extends JView {
  function display($tpl=null) {
    $mensaje =&#038; $this-&gt;get('Mensaje');
    $this-&gt;assign('mensaje', $mensaje);

    parent::display();
  }

  function anyadir($tpl) {
    parent::display($tpl);
  }
}</pre>
<p>Como vemos lo único que hace es mostrar la plantilla que indicó el controlador como parámetro. En este caso no necesitamos ningún dato del modelo, por lo que no se utiliza <code>assign</code> ni <code>assignRef</code>.</p>
<p>La nueva plantilla, default_anyadir.php, también es muy sencilla. Sólo muestra el formulario que el usuario utilizará para añadir el mensaje.</p>
<pre name="code" class="php">&lt;form action="index.php" method="post"&gt;
  &lt;input type="text" id="mensaje" name="mensaje"/&gt;

  &lt;input type="hidden" name="option" value="com_ejemplo" /&gt;
  &lt;input type="hidden" name="task" value="anyadido" /&gt;

  &lt;input type="submit" value="Registrar mensaje"/&gt;
&lt;/form&gt;</pre>
<p>Fíjate en que hacemos uso de un par de campos ocultos para establecer el valor del parámetro <code>option</code> y el parámetro <code>task</code>, y que la petición va a ser tratada, como siempre, por index.php</p>
<p>Por último sólo nos queda ver la nueva versión del modelo, con el método <code>anyadirMensaje</code> que guardará el mensaje introducido por el usuario</p>
<pre name="code" class="php">&lt;?php
defined('_JEXEC') or die('Restricted access');
jimport('joomla.application.component.model');

class EjemploModelMensaje extends JModel {
  function getMensaje() {
    $db =&#038; JFactory::getDBO();
    $query = 'SELECT mensaje FROM #__mensajes ORDER BY RAND() LIMIT 1';
    $db-&gt;setQuery($query);
    return $db-&gt;loadResult();
  }

  function anyadirMensaje($mensaje) {
    $db =&#038; JFactory::getDBO();
    $query = "INSERT INTO #__mensajes(mensaje) VALUES('{$mensaje}')";
    $db-&gt;setQuery($query);
    $db-&gt;query();

    if ($db-&gt;getErrorNum())
      return false;

      return true;
  }
}</pre>
<p>Desinstalamos la versión anterior del componente, comprimimos los archivos, e instalamos la nueva versión desde Extensiones -&gt; Instalar/Desinstalar. Y listo, hemos terminado de crear nuestro primer componente. En artículos posteriores veremos cómo añadir una interfaz de administración a nuestro componente.</p>
<link type="text/css" rel="stylesheet" href="http://mundogeek.net/sh/css/SyntaxHighlighter.css"></link><script language="javascript" src="http://mundogeek.net/sh/js/shCore.js"></script><script language="javascript" src="http://mundogeek.net/sh/js/shBrushPhp.js"></script><script language="javascript" src="http://mundogeek.net/sh/js/shBrushXml.js"></script><script language="javascript">dp.SyntaxHighlighter.ClipboardSwf = 'http://mundogeek.net/sh//flash/clipboard.swf';dp.SyntaxHighlighter.HighlightAll('code');</script><br />
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2010/02/12/creacion-de-componentes-para-joomla/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>Bases de datos en Joomla!</title>
		<link>http://mundogeek.net/archivos/2010/01/17/bases-de-datos-en-joomla/</link>
		<comments>http://mundogeek.net/archivos/2010/01/17/bases-de-datos-en-joomla/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 18:34:27 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[bases de datos]]></category>
		<category><![CDATA[componentes]]></category>
		<category><![CDATA[extensiones]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[modulos]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=4699</guid>
		<description><![CDATA[Siguiendo con nuestro último tutorial en el que vimos cómo desarrollar módulos para Joomla veremos ahora cómo trabajar con bases de datos al programar para este CMS, bien utilizando sentencias SQL, a través de la clase JDatabase, o bien mediante la clase JTable, haciendo uso de una especie de pequeño ORM (mapeo objeto-relacional) basado en [...]]]></description>
			<content:encoded><![CDATA[<p>Siguiendo con nuestro último tutorial en el que vimos <a href="http://mundogeek.net/archivos/2010/01/14/creacion-de-modulos-en-joomla/" title="Programar módulos para Joomla">cómo desarrollar módulos para Joomla</a> veremos ahora cómo trabajar con bases de datos al programar para este CMS, bien utilizando sentencias SQL, a través de la clase <code>JDatabase</code>, o bien mediante la clase <code>JTable</code>, haciendo uso de una especie de pequeño ORM (mapeo objeto-relacional) basado en el <a href="http://es.wikipedia.org/wiki/Patr%C3%B3n_ActiveRecord">patrón active record</a>.<br />
<span id="more-4699"></span></p>
<h2>JDatabase</h2>
<p>Lo primero que debemos hacer a la hora de usar <code>JDatabase</code>, la clase que representa una conexión a la base de datos en Joomla, es obtener una instancia de la clase. Para ello haremos uso de <code>JFactory</code>, una clase que ofrece varios métodos estáticos para obtener instancias de distintos <a href="http://es.wikipedia.org/wiki/Singleton">singleton</a> del framework, como pueden ser el objeto sesión (<code>getSession</code>), el objeto usuario (<code>getUser</code>) o el propio objeto JDatabase (<code>getDBO</code>).</p>
<pre name="code" class="php">$db =&#038; JFactory::getDBO();</pre>
<p>Para preparar una consulta se utiliza <code>setQuery</code>. Algo a tener en cuenta a la hora de escribir nuestras consultas es que debemos sustituir el prefijo de las tablas de Joomla (<code>jos_</code> normalmente) por <code>#__</code>. De esta forma el usuario podrá utilizar el prefijo que prefiera para las tablas de Joomla, ya que el framework se encargará de sustituir este prefijo por el adecuado antes de ejecutar la consulta.</p>
<pre name="code" class="php">$query = 'CREATE TABLE #__empleado(id INT NOT NULL AUTO_INCREMENT, nombre VARCHAR(20), departamento VARCHAR(20), PRIMARY KEY(id))';
$db->setQuery($query);</pre>
<p>Para ejecutar la consulta se utiliza el método <code>query()</code></p>
<pre name="code" class="php">$db =&#038; JFactory::getDBO();
$query = 'CREATE TABLE #__empleado(id INT NOT NULL AUTO_INCREMENT, nombre VARCHAR(20), departamento VARCHAR(20), PRIMARY KEY(id))';
$db->setQuery($query);
$db->query();</pre>
<p>Si la consulta que vamos a ejecutar es un <code>SELECT</code>, podemos sustituir el método <code>query</code> por uno de los siguientes métodos, dependiendo del tipo de resultado que necesitemos obtener:</p>
<ul>
<li><code>loadResult</code>: un único valor
<pre name="code" class="php">$db =&#038; JFactory::getDBO();
$query = 'SELECT nombre FROM #__empleado LIMIT 1';
$db->setQuery($query);
$nombre = $db->loadResult();
echo $nombre;</pre>
</li>
<li><code>loadResultArray</code>: un array con los valores de las distintas tuplas para un cierto campo
<pre name="code" class="php">$db =&#038; JFactory::getDBO();
$query = 'SELECT nombre FROM #__empleado';
$db->setQuery($query);
$nombres = $db->loadResultArray();

foreach($nombres as $nombre)
  echo $nombre, '&lt;br/&gt;';</pre>
</li>
<li><code>loadAssoc</code>: un array asociativo en el que las claves son los campos de la tupla
<pre name="code" class="php">$db =&#038; JFactory::getDBO();
$query = 'SELECT * FROM #__empleado';
$db->setQuery($query);
$empleado = $db->loadAssoc();

foreach($empleado as $campo => $valor)
  echo $campo, ': ', $valor, '&lt;br/&gt;';</pre>
</li>
<li><code>loadAssocList</code>: una lista con un array asociativo para cada tupla
<pre name="code" class="php">$db =&#038; JFactory::getDBO();
$query = 'SELECT * FROM #__empleado';
$db->setQuery($query);
$empleados = $db->loadAssocList();

foreach($empleados as $empleado) {
  foreach($empleado as $campo => $valor)
    echo $campo, ': ', $valor, '&lt;br/&gt;';
  echo '&lt;hr/&gt;';
}</pre>
</li>
<li><code>loadObject</code>: un objeto en el que las propiedades son los atributos de la tupla
<pre name="code" class="php">$db =&#038; JFactory::getDBO();
$query = 'SELECT * FROM #__empleado LIMIT 1';
$db->setQuery($query);
$empleado = $db->loadObject();

echo 'Nombre: ', $empleado->nombre, '&lt;br/&gt;';
echo 'Departamento: ', $empleado->departamento, '&lt;br/&gt;';</pre>
</li>
<li><code>loadObjectList</code>: una lista de objetos, uno por cada tupla
<pre name="code" class="php">$db =&#038; JFactory::getDBO();
$query = 'SELECT * FROM #__empleado';
$db->setQuery($query);
$empleados = $db->loadObjectList();

foreach($empleados as $empleado) {
  echo 'Nombre: ', $empleado->nombre, '&lt;br/&gt;';
  echo 'Departamento: ', $empleado->departamento, '&lt;br/&gt;';
  echo '&lt;hr/&gt;';
}</pre>
</li>
<li><code>loadRow</code>: devuelve un array con todos los campos de una tupla
<pre name="code" class="php">$db =&#038; JFactory::getDBO();
$query = 'SELECT * FROM #__empleado LIMIT 1';
$db->setQuery($query);
print_r($db->loadRow());</pre>
</li>
<li><code>loadRowList</code>: devuelve una lista en la que cada posición es un array con todos los campos de una tupla
<pre name="code" class="php">$db =&#038; JFactory::getDBO();
$query = 'SELECT * FROM #__empleado';
$db->setQuery($query);
print_r($db->loadRowList());</pre>
</li>
</ul>
<p>Por último para tratar los errores podemos hacer uso de los métodos <code>getErrorNum</code> y <code>getErrorMsg</code>. Supongamos que nos hubieramos equivocado al escribir el <code>SELECT</code>, por ejemplo:</p>
<pre name="code" class="php">$db =&#038; JFactory::getDBO();
$query = 'SELEC * FROM #__empleado';
$db->setQuery($query);
$empleados = $db->loadAssocList();

if ($db->getErrorNum()) {
	echo $db->getErrorMsg();
	return;
}</pre>
<h2>JTable</h2>
<p>Para cada tabla para la que queramos utilizar <code>JTable</code> para llevar a cabo las operaciones de creación, lectura, actualización o borrado tendremos que crear un archivo que contenga una clase que extienda <code>JTable</code>, con un atributo por cada columna de la tabla y un constructor que llamará al de la clase padre pasando como argumentos el nombre de la tabla, la clave primaria y el objeto que representa la conexión con la BBDD. El nombre de la nueva clase será, por convención, Table seguido del nombre de la entidad (TableUsuario, TableEdificio, etc) y el nombre del archivo, el mismo nombre sin el prefijo Table (usuario.php, edificio.php, etc).</p>
<pre name="code" class="php">&lt;?php
defined('_JEXEC') or die('Restricted access');

class TableEmpleado extends JTable {
	var $id = null;
	var $nombre = null;
	var $departamento = null;

	function __construct(&#038;$db) {
		parent::__construct('#__empleado', 'id', $db);
	}
}

?&gt;</pre>
<p>Una vez creada esta clase podemos instanciarla a partir de <code>JTable</code>. Primero le indicaremos dónde buscar las clases de las tablas (en este ejemplo utilizamos las constantes JPATH_BASE, el directorio en el que se instaló Joomla, y DS, el separador de directorios en este sistema operativo) y luego qué clase instanciar:</p>
<pre name="code" class="php">JTable::addIncludePath(JPATH_BASE.DS.'modules'.DS.'mod_ejemplo'.DS.'tables');
$empleado =&#038; JTable::getInstance('empleado', 'Table');</pre>
<p>Una vez hecho esto ya podremos utilizar los métodos de nuestro nuevo objeto. Para traer una tupla de la base de datos usaríamos el método <code>load</code>, al que se le pasa la clave a buscar:</p>
<pre name="code" class="php">$empleado->load(1);
echo $empleado->nombre, ': ', $empleado->departamento;</pre>
<p>Para crear una nueva tupla en la base de datos establecemos los valores para los campos con <code>set</code>, comprobamos que sean válidos con <code>check</code> y los almacenamos con <code>store</code>.</p>
<pre name="code" class="php">$empleado->set('nombre', 'Samuel');
$empleado->set('departamento', 'Recursos humanos');

if (!$empleado->check() or !$empleado->store()) {
  echo 'Ocurrio un error: ', $empleado->getError();
}</pre>
<p>También podemos establecer los valores para los campos mediante un array, con el método <code>bind</code>:</p>
<pre name="code" class="php">$datos = array('nombre' => 'Carlos', 'departamento' => 'Finanzas');

$empleado->bind($datos);

if (!$empleado->check() or !$empleado->store()) {
  echo 'Ocurrio un error: ', $empleado->getError();
}</pre>
<p>O usar el método save, que llama a su vez a <code>bind</code>, <code>check</code> y <code>store</code></p>
<pre name="code" class="php">$datos = array('nombre' => 'Juan', 'departamento' => 'Mantenimiento');

if (!$empleado->save($datos)) {
  echo 'Ocurrio un error: ', $empleado->getError();
}</pre>
<p>Para actualizar una tupla podemos hacer uso de una combinación de <code>load</code> y <code>store</code></p>
<pre name="code" class="php">$empleado->load(1);

$empleado->set('departamento', 'Finanzas');

if (!$empleado->check() or !$empleado->store()) {
  echo 'Ocurrio un error: ', $empleado->getError();
}</pre>
<p>Por último, para borrar una tupla utilizaremos el método <code>delete</code>, al que se le pasa el identificador de la tupla que queremos eliminar:</p>
<pre name="code" class="php">$empleado->delete(1);</pre>
<link type="text/css" rel="stylesheet" href="http://mundogeek.net/sh/css/SyntaxHighlighter.css"></link><script language="javascript" src="http://mundogeek.net/sh/js/shCore.js"></script><script language="javascript" src="http://mundogeek.net/sh/js/shBrushPhp.js"></script><script language="javascript" src="http://mundogeek.net/sh/js/shBrushXml.js"></script><script language="javascript">dp.SyntaxHighlighter.ClipboardSwf = 'http://mundogeek.net/sh//flash/clipboard.swf';dp.SyntaxHighlighter.HighlightAll('code');</script><br />
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2010/01/17/bases-de-datos-en-joomla/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Tipos de parámetros para las extensiones de Joomla!</title>
		<link>http://mundogeek.net/archivos/2010/01/14/tipos-de-parametros-para-las-extensiones-de-joomla/</link>
		<comments>http://mundogeek.net/archivos/2010/01/14/tipos-de-parametros-para-las-extensiones-de-joomla/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 12:03:28 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[extensiones]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[parametros]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=4692</guid>
		<description><![CDATA[Además del tipo text del que ya hablamos en Creación de módulos para Joomla! existen muchos otros tipos de parámetros que podemos utilizar a la hora de desarrollar los distintos tipos de extensiones que existen en Joomla (no solo en los módulos). Estos son: calendar Muestra una caja de texto en la que introducir una [...]]]></description>
			<content:encoded><![CDATA[<p>Además del tipo <code>text</code> del que ya hablamos en <a href="http://mundogeek.net/archivos/2010/01/14/creacion-de-modulos-en-joomla/">Creación de módulos para Joomla!</a> existen muchos otros tipos de parámetros que podemos utilizar a la hora de desarrollar los distintos tipos de extensiones que existen en Joomla (no solo en los módulos). Estos son:<span id="more-4692"></span></p>
<h3>calendar</h3>
<p>Muestra una caja de texto en la que introducir una fecha junto con un icono sobre el que se puede pulsar para mostrar un calendario de tipo pop-up con el que seleccionar la fecha de forma más cómoda. Las distintas opciones disponibles para este tipo son las siguientes:</p>
<ul>
<li>name: nombre del parámetro. Es la cadena que se utiliza a la hora de recuperar el valor del parámetro</li>
<li>label: etiqueta. Es el texto que acompañará al widget en la página de opciones del parámetro</li>
<li>description: descripción del campo. Este texto se muestra al usuario cuando mantiene el cursor del ratón un cierto tiempo sobre el widget</li>
<li>default: valor por defecto</li>
<li>class: clase CSS a utilizar para la etiqueta</li>
<li>format: formato de fecha a utilizar (usando los especificadores de fecha de PHP)</li>
</ul>
<pre name="code" class="php">&lt;param name="calendario" type="calendar" label="Fecha" description="Fecha en la que comienza el evento" format="%d-%m-%Y" /&gt;</pre>
<h3>category</h3>
<p>Muestra una lista con las distintas categorías de una sección. Además de name, label, description, default y class otra opción interesante es section, cuyo valor será el identificador de la sección de la que queremos recuperar las categorías (si no se da ningún valor a este campo se recuperarán todas las categorías de todas las secciones).</p>
<pre name="code" class="php">&lt;param name="categoria" type="category" label="Categoria" description="Categoria a mostrar en el modulo" /&gt;</pre>
<h3>editors</h3>
<p>Muestra una lista con los distintos editores WYSIWYG instalados. Las únicas opciones para este parámetro son name, label, description y default.</p>
<h3>filelist</h3>
<p>Muestra una lista con los archivos contenidos en el directorio especificado. Además de name, label, description y default otras opciones útiles son:</p>
<ul>
<li>directory: directorio para el cuál se listarán los archivos. Si no se especifica ningún valor se asume la raíz de Joomla!</li>
<li>filter: una expresión regular con la que filtrar los archivos mostrados en la lista.</li>
<li>exclude: una expresión regular que especifica archivos a excluir de la lista.</li>
<li>stripext: booleano que indica si deben ocultarse las extensiones de los archivos</li>
<li>hide_none: booleano con el que indicar que no queremos que se muestre la opción &#8216;- No utilizar -&#8217;</li>
<li>hide_default: booleano con el que indicar que no queremos que se muestre la opción &#8216;- Usar el predeterminado -&#8217;</li>
</ul>
<pre name="code" class="php">&lt;param name="archivo" type="filelist" label="Archivo a borrar" directory="directorio"/&gt;</pre>
<h3>folderlist</h3>
<p>Muestra una lista con las distintas carpetas contenidas en el directorio especificado. Cuenta con las mismas opciones que filelist.</p>
<h3>imagelist</h3>
<p>Muestra una lista con las imágenes contenidas en un cierto directorio. Cuenta con las mismas opciones que filelist y folderlist.</p>
<h3>helpsites</h3>
<p>Muestra una lista con los distintos sitios de ayuda de Joomla.</p>
<h3>hidden</h3>
<p>Crea un campo oculto.</p>
<h3>languages</h3>
<p>Muestra una lista con los idiomas instalados para una cierta aplicación.</p>
<h3>list</h3>
<p>Muestra una lista con distintas opciones entre las que elegir. Esta etiqueta contendrá una o más etiquetas option con las opciones.</p>
<pre name="code" class="php">&lt;param name="ssoo" type="list" label="Sistema operativo"&gt;
  &lt;option value="windows"&gt;Windows&lt;/option&gt;
  &lt;option value="linux"&gt;Linux&lt;/option&gt;
  &lt;option value="mac"&gt;Mac OS&lt;/option&gt;
&lt;/param&gt;</pre>
<h3>menu</h3>
<p>Muestra una lista con los distintos menús disponibles en el sitio web.</p>
<h3>menuitem</h3>
<p>Muestra una lista con las distintas entradas de menú disponibles en el sitio web.</p>
<h3>password</h3>
<p>Muestra una caja de texto en la que se puede introducir una contraseña.</p>
<h3>radio</h3>
<p>Muestra un grupo de botones de opción. Como list, esta etiqueta contendrá una o más etiquetas option con las opciones.</p>
<pre name="code" class="php">&lt;param name="ssoo" type="radio" label="Sistema operativo"&gt;
  &lt;option value="windows"&gt;Windows&lt;/option&gt;
  &lt;option value="linux"&gt;Linux&lt;/option&gt;
  &lt;option value="mac"&gt;Mac OS&lt;/option&gt;
&lt;/param&gt;</pre>
<h3>section</h3>
<p>Muestra una lista con las secciones disponibles en el sitio web.</p>
<h3>spacer</h3>
<p>Muestra un separador. Por defecto esto se traducirá en un &lt;hr /&gt;. Si se da algún valor a default se mostrará este texto.</p>
<h3>sql</h3>
<p>Muestra una lista con los valores obtenidos al ejecutar una consulta SQL sobre la base de datos de Joomla. La consulta irá en la opción query y debe devolver un par de valores por tupla, uno con el texto a mostrar en la lista (con nombre title) y otro con el valor de la opción (con nombre value)</p>
<pre name="code" class="php">&lt;param name="usuario" type="sql" default="Administrator" label="Selecciona el usuario" query="SELECT name AS title, username AS value FROM #__users" /&gt;</pre>
<h3>text</h3>
<p>Muestra un campo de texto. Con la opción size se puede limitar el ancho del widget.</p>
<h3>textarea</h3>
<p>Muestra un área de texto. Las opciones cols y rows determinan, respectivamente, el número de columnas y filas de caracteres que ocupará el widget.</p>
<h3>timezones</h3>
<p>Muestra una lista de zonas horarias.</p>
<h3>usergroup</h3>
<p>Muestra una lista con los grupos de usuarios del sitio.</p>
<link type="text/css" rel="stylesheet" href="http://mundogeek.net/sh/css/SyntaxHighlighter.css"></link><script language="javascript" src="http://mundogeek.net/sh/js/shCore.js"></script><script language="javascript" src="http://mundogeek.net/sh/js/shBrushPhp.js"></script><script language="javascript" src="http://mundogeek.net/sh/js/shBrushXml.js"></script><script language="javascript">dp.SyntaxHighlighter.ClipboardSwf = 'http://mundogeek.net/sh//flash/clipboard.swf';dp.SyntaxHighlighter.HighlightAll('code');</script><br />
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2010/01/14/tipos-de-parametros-para-las-extensiones-de-joomla/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Creación de módulos en Joomla!</title>
		<link>http://mundogeek.net/archivos/2010/01/14/creacion-de-modulos-en-joomla/</link>
		<comments>http://mundogeek.net/archivos/2010/01/14/creacion-de-modulos-en-joomla/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 10:59:03 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[modulos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://mundogeek.net/?p=4687</guid>
		<description><![CDATA[Existen 5 tipos de extensiones distintas en Joomla: módulos, componentes, plugins, plantillas y lenguajes. Los módulos, de cuya creación hablaremos en este pequeño tutorial, son uno de los tipos más sencillos: se trata de pequeñas aplicaciones cuya salida puede mostrarse en cualquier posición de entre las definidas en la plantilla, y de las cuales podemos [...]]]></description>
			<content:encoded><![CDATA[<p>Existen 5 tipos de extensiones distintas en Joomla: módulos, componentes, plugins, plantillas y lenguajes. Los módulos, de cuya creación hablaremos en este pequeño tutorial, son uno de los tipos más sencillos: se trata de pequeñas aplicaciones cuya salida puede mostrarse en cualquier posición de entre las definidas en la plantilla, y de las cuales podemos tener un número cualquiera por página.</p>
<p>Un módulo en su forma más básica consiste sólo en un par de archivos, un archivo XML con información sobre el módulo y su instalación y un archivo PHP con el código del módulo en sí.<span id="more-4687"></span></p>
<p>A modo de ejemplo vamos a ver cómo crear un pequeño módulo &#8220;Hola Mundo&#8221;.</p>
<p>Primero crearemos una carpeta mod_holamundo para contener nuestros archivos. En esta carpeta crearemos un archivo mod_holamundo.xml con el siguiente contenido</p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;install type="module" version="1.5"&gt;
  &lt;name&gt;Hola Mundo&lt;/name&gt;
  &lt;author&gt;Raul Gonzalez&lt;/author&gt;
  &lt;creationDate&gt;Enero 2010&lt;/creationDate&gt;
  &lt;copyright&gt;(C) Raul Gonzalez&lt;/copyright&gt;
  &lt;license&gt;GPL&lt;/license&gt;
  &lt;authorUrl&gt;http://mundogeek.net/&lt;/authorUrl&gt;
  &lt;authorEmail&gt;zootropo en gmail&lt;/authorEmail&gt;
  &lt;version&gt;0.1&lt;/version&gt;
  &lt;description&gt;Nuestro modulo de ejemplo&lt;/description&gt;
  &lt;files&gt;
    &lt;filename module="mod_holamundo"&gt;mod_holamundo.php&lt;/filename&gt;
  &lt;/files&gt;
&lt;/install&gt;</pre>
<p>como vemos en este archivo podemos indicar el nombre del módulo, el autor, la fecha de creación, la versión, la descripción de la funcionalidad del módulo, o los archivos que conforman el módulo, entre otros (he evitado el uso de acentos para ahorrarnos complicaciones con la codificación de caracteres).</p>
<p>Veamos ahora el código del archivo mod_holamundo.php. Este código podría ser tan sencillo como</p>
<pre name="code" class="php">&lt;?php echo 'Hola mundo'; ?&gt;</pre>
<p>Sin embargo, es una buena práctica evitar que se pueda ejecutar el módulo directamente, como si de un script independiente de Joomla! se tratase. Esto se hace comprobando si está definida la constante <code>_JEXEC</code>, y en caso contrario deteniendo la ejecución del script.</p>
<pre name="code" class="php">&lt;?php
  defined('_JEXEC') or die('Este script no se puede ejecutar de forma independiente.');
  echo 'Hola mundo';
?&gt;</pre>
<p>Ahora sí, ya tenemos listo nuestro módulo. Una vez hecho esto basta crear un archivo ZIP que contenga nuestro archivo XML y PHP usando, por ejemplo, WinZip o WinRAR, y ya podremos instalarlo desde la interfaz de administración de Joomla, dirigiéndonos a Extensiones -&gt; Instalar/Desinstalar y seleccionando nuestro archivo .zip en la carpeta en la que se encuentre. Al instalar el módulo se habrá creado una nueva carpeta mod_holamundo en la carpeta modules de Joomla.</p>
<p>Si seleccionamos ahora Extensiones -&gt; Administrador de módulos y ordenamos por ID veremos nuestro nuevo módulo Hola Mundo, listo para usarse. Basta marcarlo como Publicado y seleccionar la posición en la que queremos que se muestre en las opciones del módulo, a las que se puede acceder haciendo clic sobre su nombre.</p>
<h2>Añadir opciones al módulo</h2>
<p>Vamos a complicar un poco la cosa permitiendo al administrador del sitio elegir a quién quiere saludar. Es decir, vamos a modificar el módulo de forma que en esta ocasión se imprima &#8220;Hola&#8221; seguido de un texto que el administrador pueda especificar en las opciones del módulo.</p>
<p>Lo primero que tenemos que hacer es modificar el archivo XML y añadir una nueva etiqueta <code>params</code>. Dentro de esta etiqueta tendremos una etiqueta <code>param</code> por cada opción de configuración que requiera el módulo. En nuestro caso sólo necesitaremos un parámetro, de tipo <code>text</code> (una caja de texto) para más señas. Podéis consultar el resto de tipos disponibles en <a href="http://mundogeek.net/archivos/2010/01/14/tipos-de-parametros-para-las-extensiones-de-joomla/">Parámetros para las extensiones de Joomla!</a>.</p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;install type="module" version="1.5"&gt;
  &lt;name&gt;Hola Mundo&lt;/name&gt;
  &lt;author&gt;Raul Gonzalez&lt;/author&gt;
  &lt;creationDate&gt;Enero 2010&lt;/creationDate&gt;
  &lt;authorUrl&gt;http://mundogeek.net/&lt;/authorUrl&gt;
  &lt;version&gt;0.1&lt;/version&gt;
  &lt;description&gt;Nuestro modulo de ejemplo&lt;/description&gt;
  &lt;files&gt;
    &lt;filename module="mod_holamundo"&gt;mod_holamundo.php&lt;/filename&gt;
  &lt;/files&gt;
  &lt;params&gt;
    &lt;param name="quien" type="text" size="20" default="mundo"
           label="¿A quien quieres saludar?" description="Persona, animal u objeto a quien quieres saludar" /&gt;
  &lt;/params&gt;
&lt;/install&gt;</pre>
<p>El valor de esta opción de configuración se podrá obtener en el código del módulo haciendo uso del método <code>get</code> del objeto <code>$params</code>, al que se le pasa el nombre del parámetro y, opcionalmente, el valor a utilizar por defecto si el usuario no ha introducido ningún valor para este campo. De esta forma, el código de nuestro módulo quedaría tal que así:</p>
<pre name="code" class="php">&lt;?php
  defined('_JEXEC') or die('Este script no se puede ejecutar de forma independiente.');
  echo 'Hola ', $params-&gt;get('quien', 'mundo');
?&gt;</pre>
<p>Y listo. Desinstala el módulo anterior, comprime ambos archivos, e instala la nueva versión del módulo para disfrutar de nuestra pequeña gran joya.</p>
<link type="text/css" rel="stylesheet" href="http://mundogeek.net/sh/css/SyntaxHighlighter.css"></link><script language="javascript" src="http://mundogeek.net/sh/js/shCore.js"></script><script language="javascript" src="http://mundogeek.net/sh/js/shBrushPhp.js"></script><script language="javascript" src="http://mundogeek.net/sh/js/shBrushXml.js"></script><script language="javascript">dp.SyntaxHighlighter.ClipboardSwf = 'http://mundogeek.net/sh//flash/clipboard.swf';dp.SyntaxHighlighter.HighlightAll('code');</script><br />
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2010/01/14/creacion-de-modulos-en-joomla/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Dreamhost: Actualización de aplicaciones, WordPress 2.5 la semana que viene y consulta del estado vía Twitter, SMS, Jabber y AIM</title>
		<link>http://mundogeek.net/archivos/2008/03/24/dreamhost-actualizacion-de-aplicaciones-wordpress-25-la-semana-que-viene-y-consulta-del-estado-via-twitter-sms-jabber-y-aim/</link>
		<comments>http://mundogeek.net/archivos/2008/03/24/dreamhost-actualizacion-de-aplicaciones-wordpress-25-la-semana-que-viene-y-consulta-del-estado-via-twitter-sms-jabber-y-aim/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 09:50:31 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[alojamiento]]></category>
		<category><![CDATA[dreamhost]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[mediawiki]]></category>
		<category><![CDATA[moodle]]></category>
		<category><![CDATA[pligg]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[zencart]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2008/03/24/dreamhost-actualizacion-de-aplicaciones-wordpress-25-la-semana-que-viene-y-consulta-del-estado-via-twitter-sms-jabber-y-aim/</guid>
		<description><![CDATA[En Dreamhost han actualizado su sistema de instalación de aplicaciones web con un solo clic con las últimas versiones de las siguientes aplicaciones: ZenCart 1.3.8: aplicación para montar tiendas de comercio electrónico. Pligg 9.9.0: CMS para montar clones de Digg / menéame. Moodle 1.9: aplicación para crear comunidades de aprendizaje online. Joomla 1.5.1: Uno de [...]]]></description>
			<content:encoded><![CDATA[<p>En <a href="http://mundogeek.net/archivos/2007/12/12/alojamiento-con-500gb-de-espacio-y-5000gb-de-ancho-de-banda-por-4-euros-al-mes/" title="El mejor alojamiento web">Dreamhost</a> han actualizado su sistema de instalación de aplicaciones web con un solo clic con las últimas versiones de las siguientes aplicaciones:</p>
<ul>
<li><strong>ZenCart</strong> 1.3.8: aplicación para montar tiendas de comercio electrónico.</li>
<li><strong>Pligg</strong> 9.9.0: CMS para montar clones de Digg / menéame.</li>
<li><strong>Moodle</strong> 1.9: aplicación para crear comunidades de aprendizaje online.</li>
<li><strong>Joomla</strong> 1.5.1: Uno de los CMS de código abierto más conocidos.</li>
<li><strong>MediaWiki</strong> 1.12.0: Aplicación para la creación de Wikis. Es el sistema creado y utilizado por la Wikipedia.</li>
</ul>
<p>También informan de que actualizarán su sistema de instalación con un solo clic con la versión 2.5 de WordPress tan pronto como esté disponible, en una semana más o menos.</p>
<p>Por último nos comentan que han creado <a href="http://twitter.com/dhstatus">una cuenta en Twitter</a> mediante la que mantenerse informado de las novedades en <a href="http://mundogeek.net/archivos/2007/12/12/alojamiento-con-500gb-de-espacio-y-5000gb-de-ancho-de-banda-por-4-euros-al-mes/" title="El mejor alojamiento web">Dreamhost</a> y el estado de los servidores vía SMS, Jabber o AIM.</p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2008/03/24/dreamhost-actualizacion-de-aplicaciones-wordpress-25-la-semana-que-viene-y-consulta-del-estado-via-twitter-sms-jabber-y-aim/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

