Desarrollando un componente MVC : Usando la base de datos

  1. Desarrollando un componente MVC : Introducción
  2. Desarrollando un componente MVC: Desarrollando un componente básico
  3. Desarrollando un componente MVC: Añadiendo una vista en el frontend
  4. Desarrollando un componente MVC: Añadiendo un tipo de menu al frontend
  5. Desarrollando un componente MVC: Añadiendo un modelo al frontend
  6. Desarrollando un componente MVC : Añadiendo una variable request en el tipo de menu
  7. Desarrollando un componente MVC : Usando la base de datos
  8. Desarrollando un componente MVC : Basic backend
  9. Desarrollando un componente MVC : Añadiendo gestión de idioma
  10. Desarrollando un componente MVC : Añadiendo acciones backend
  11. Desarrollando un componente MVC : Añadiendo adornos al backend
  12. Desarrollando un componente MVC : Añadiendo verificaciones
  13. Desarrollando un componente MVC : Añadiendo categorías
  14. Desarrollando un componente MVC : Añadiendo configuración
  15. Desarrollando un componente MVC : Añadiendo ACL (Access Control Levels)
  16. Desarrollando un componente MVC : Añadiendo un script de instalación-desinstalación-actualización
  17. Desarrollando un componente MVC : Usando la capacidad de filtro
  18. Desarrollando un componente MVC : Añadiendo un servidor de actualización

Usando la base de datos

Los componentes, por lo general, gestionan sus contenidos mediante la base de datos. Durante la fase de instalación/desinstalación/actualización de un componente, puedes ejecutar consultas SQL mediante el uso de ficheros SQL.

Con tu gestor y editor de archivos favorito, crea dos archivos llamadosadmin/sql/install.mysql.utf8.sql y admin/sql/updates/mysql/0.0.6.sql. Ambos deberían tener el mismo contenido, como sigue:

admin/sql/install.mysql.utf8.sql and admin/sql/updates/mysql/0.0.6.sql

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 install.mysql.utf8.sql se ejecutará cuando instales este componente. El fichero 0.0.6.sql se ejecutará cuando hagas una actualización.

Nota importante: Cuando se instale el componente, los archivos en el directorio de actualizaciones SQL (por ejemplo, admin/sql/updates/mysql) serán leidos y el nombre del último fichero alfabeticamente será utilizando para rellenar el número de la versión del componente en la tabla #__schemas. Este valor debe estar en la tabla para que la actualización automática ejecute los archivos SQL en versiones futuras. Por esta razón, es una buena práctica crear un fichero de actualización SQL para cada versión. (aunque sea vacío o con un simple comentario). De esta forma la versión de #__schemas siempre coincidirá con la versión del componente.

Nota Importante: Cuando se guardan los archivos SQL en utf8, asegurate de guardarlos como utf8 NO BOM o la consulta fallará con error MySQL #1064.

Este es el fichero de instalación. Se ejecutará si pones la orden apropiada en el fichero helloworld.xml

helloworld.xml



 
        Hello World!
        
        November 2009
        John Doe
        john.doe@example.org
        http://www.example.org
        Copyright Info
        License Info
        
        0.0.6
        
        Description of the Hello World component ...
 
         
                
                        sql/install.mysql.utf8.sql
                
        
         
                
                        sql/uninstall.mysql.utf8.sql
                
        
         
                
                        sql/updates/mysql
                
        
 
        
        
        
                index.html
                helloworld.php
                controller.php
                views
                models
        
 
        
                
                Hello World!
                
                
                
                        
                        index.html
                        helloworld.php
                        
                        sql
                        
                        tables
                        
                        models
                
        
 

Haz lo mismo para el fichero uninstall:

Crea el fichero admin/sql/uninstall.mysql.utf8.sql con el siguiente contenido:

admin/sql/uninstall.mysql.utf8.sql

DROP TABLE IF EXISTS `#__helloworld`;

Añadiendo un nuevo tipo de campo

Por el momento, hemos utilizado un campo hardcodeado para los mensajes. Necesitamos utilizar la base de datos para habilitar un campo de selección donde elegir el mensaje que queremos mostrar.

Modifica el fichero site/views/helloworld/tmpl/default.xml y añade estas lineas

site/views/helloworld/tmpl/default.xml



        
                COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_DESC
        
        
                

Introduce un nuevo tipo de campo y le dice a Joomla que busque la definición del campo en el directorio /administrator/components/com_helloworld/models/fields folder.

Crea el fichero admin/models/fields/helloworld.php file con el siguiente contenido:

admin/models/fields/helloworld.php

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 de selección de donde elegir. Puedes ver el resultado de este cambio en la sección del gestor de menú para el elemento helloworld.

Muestra el mensaje seleccionado

Cuando un elemento de menú de este componente se crea o actualiza, Joomla guarda el identificador del mensaje. El modelo HelloWorldModelHelloWorld tiene que computar el mensaje de acuerdo a este identificador y la información se guarda en la base de datos.

Modifica el fichero site/models/helloworld.php:

site/models/helloworld.php

messages))
                {
                        $this->messages = array();
                }
 
                if (!isset($this->messages[$id])) 
                {
                        //request the selected id
                        $jinput = JFactory::getApplication()->input;
                        $id = $jinput->get('id', 1, 'INT' );
 
                        // Get a TableHelloWorld instance
                        $table = $this->getTable();
 
                        // Load the message
                        $table->load($id);
 
                        // Assign the message
                        $this->messages[$id] = $table->greeting;
                }
 
                return $this->messages[$id];
        }
}

Este modelo ahora solicita a TableHelloWorld que recupere el mensaje. Eseta clase Table tiene que ser definida en el fichero admin/tables/helloworld.php

admin/tables/helloworld.php


No deberías ver ninguna diferencia, pero si accedes a la base de datos deberías ver una tabla llamada jos_helloworld con dos columnas: id y greeting. Y dos entradas: Hello World! y Good bye World

Empaquetando el componente

Contenido del 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

Create a compressed file of this directory or directly download the archive and install it using the extension manager of Joomla. You can add a menu item of this component using the menu manager in the backend.

Note: site/models/helloworld.php is not up-to-date as mentioned on this page. You need to copy the code yourself.

Deja un comentario