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

Añadiendo un modelo

En el framework de Joomla, los modelos (Models) son los responsables de gestionar la información. La primera función que tiene que ser escrita para un modelo es una función get. Devuelve datos al objeto llamante. En nuestro caso la vista HelloWorldViewHelloWorld. Por defecto, el modelo llamado HelloWorldModelHelloWorld que reside en site/models/helloworld.php es el modelo principal asociado a esta vista.

Así que vamos a echar un vistazo rápido a las convenciones de nombres con un ejemplo, ya que la convención de nomenclatura son la magia real, que hacen todo el trabajo:

La clase HelloWorldViewHelloWorld reside en site/views/helloworld/view.html.php y hará uso de la clase HelloWorldModelHelloWorld en el fichero site/models/helloworld.php

Así que vamos a suponer que queremos utilizar una vista imaginaria fluffy, tendríamos que tener:

  • La clase HelloWorldViewFluffy que reside en site/views/fluffy/view.html.php.
  • La vista que hará uso de HelloWorldModelFluffy en el archivo site/models/fluffy.php.

Nota: la pantalla real de la vista: site/views/fluffy/tmpl/default.php se necesita también para hacer que este ejemplo funcione.

Incumplir cualquiera de estas convenciones dará lugar a errores o una página en blanco.

Así que volviendo a la aplicación real de las clases individuales, con tu gestor y editor de archivos favorito crea el archivo site/models/helloworld.php que contenga:

site/models/helloworld.php

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
// import Joomla modelitem library
jimport('joomla.application.component.modelitem');
 
/**
 * HelloWorld Model
 */
class HelloWorldModelHelloWorld extends JModelItem
{
        /**
         * @var string msg
         */
        protected $msg;
 
        /**
         * Get the message
         * @return string The message to be displayed to the user
         */
        public function getMsg() 
        {
                if (!isset($this->msg)) 
                {
                        $this->msg = 'Hello World!';
                }
                return $this->msg;
        }
}

La clase HelloWorldViewHelloWorld solicita datos al modelo mediante el método get de la clase JView:

site/views/helloworld/view.html.php

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
// import Joomla view library
jimport('joomla.application.component.view');
 
/**
 * HTML View class for the HelloWorld Component
 */
class HelloWorldViewHelloWorld extends JView
{
        // Overwriting JView display method
        function display($tpl = null) 
        {
                // Assign data to the view
                $this->msg = $this->get('Msg');
 
                // Check for errors.
                if (count($errors = $this->get('Errors'))) 
                {
                        JLog::add(implode('<br />', $errors), JLog::WARNING, 'jerror');
                        return false;
                }
                // Display the view
                parent::display($tpl);
        }
}

Nota: $this->get() es un miembro de JView::get que es un proxy para los metodos get* del modelo por defecto donde * que se rellena con el valor del primer parámetro pasado a get()

También modifica el fichero helloworld.xml para indicar el uso de modelos y la nueva versión:

helloworld.xml

<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="2.5.0" method="upgrade">
 
        <name>Hello World!</name>
        <!-- The following elements are optional and free of formatting constraints -->
        <creationDate>November 2009</creationDate>
        <author>John Doe</author>
        <authorEmail>john.doe@example.org</authorEmail>
        <authorUrl>http://www.example.org</authorUrl>
        <copyright>Copyright Info</copyright>
        <license>License Info</license>
        <!--  The version string is recorded in the components table -->
        <version>0.0.4</version>
        <!-- The description is optional and defaults to the name -->
        <description>Description of the Hello World component ...</description>
 
        <update> <!-- Runs on update; New in 2.5 -->
                <schemas>
                        <schemapath type="mysql">sql/updates/mysql</schemapath>
                </schemas>
        </update>
 
        <!-- Site Main File Copy Section -->
        <!-- Note the folder attribute: This attribute describes the folder
                to copy FROM in the package to install therefore files copied
                in this section are copied from /site/ in the package -->
        <files folder="site">
                <filename>index.html</filename>
                <filename>helloworld.php</filename>
                <filename>controller.php</filename>
                <folder>views</folder>
                <folder>models</folder>
        </files>
 
        <administration>
                <!-- Administration Menu Section -->
                <menu>Hello World!</menu>
                <!-- Administration Main File Copy Section -->
                <!-- Note the folder attribute: This attribute describes the folder
                        to copy FROM in the package to install therefore files copied
                        in this section are copied from /admin/ in the package -->
                <files folder="admin">
                        <!-- Admin Main File Copy Section -->
                        <filename>index.html</filename>
                        <filename>helloworld.php</filename>
                        <!-- SQL files section -->
                        <folder>sql</folder>
                </files>
        </administration>
 
</extension>

Empaquetando el componente

Contenido del directorio:

  1. helloworld.xml
  2. site/index.html
  3. site/helloworld.php
  4. site/controller.php
  5. site/views/index.html
  6. site/views/helloworld/index.html
  7. site/views/helloworld/view.html.php
  8. site/views/helloworld/tmpl/index.html
  9. site/views/helloworld/tmpl/default.xml
  10. site/views/helloworld/tmpl/default.php
  11. site/models/index.html
  12. site/models/helloworld.php
  13. admin/index.html
  14. admin/helloworld.php
  15. admin/sql/index.html
  16. admin/sql/updates/index.html
  17. admin/sql/updates/mysql/index.html
  18. admin/sql/updates/mysql/0.0.1.sql

Crea un archivo comprimido o directamente descarga el archivo e instalalo mediante el gestor de extensiones de Joomla. Puedes añadir un elemento de menú de este componente mediante el gestor de menús en el backend.