En los anteriores posts he hablado sobre el patrón MVC y sobre el concepto de front-end y back-end en Joomla!. Una vez entendido se puede empezar a programar un componente MVC en condiciones.

Iniciación: Construir un componente simple en Joomla! 1.5 Usando el patrón MVC.

Siguiendo el patrón MVC, vamos a crear un componente simple para joomla 1.5 al que llamaremos prueba. El objetivo de esta primera toma de contacto es entender la metodología de trabajo para crear el componente de joomla! 1.5.

Lo primero que haremos será ir a la carpeta principal de Joomla en nuestro servidor web. Dentro de esa carpeta localizar el directorio components .
Observa que dentro del directorio existen otros directorios que empiezan por com_xxxx . Esta es la primera norma que pone Joomla!: los componentes se deben de ubicar en un directorio cuyo nombre empieze por com_ seguido del nombre del componente, por ejemplo para el componente prueba seria com_prueba (este aspecto es similar a la parte de módulos que hemos visto anteriormente)

Por lo tanto creamos un directorio dentro del directorio components y lo llamamos com_prueba. Cuando llamemos a nuestro componente, lo primero que hace Joomla es buscar el archivo php que hay dentro con el mismo nombre que el componente y ejecutarlo. Este es el punto de entrada del componente. Creamos el fichero prueba.php dentro del directorio y de momento lo dejamos en blanco.

Por ahora solo estamos creando la estructura del componente. Lo siguiente es crear el archivo controller.php, y de momento también lo dejaremos en blanco. Ahora necesitamos crear los directorios en los que ubicaremos nuestro Modelo y nuestra Vista.

Crea un directorio con nombre models y otro con nombre views.

Dentro del directorio views, hay que crear un directorio por cada vista y el directorio tiene que tener el nombre de la vista; crea el directorio prueba dentro del directorio views.

Dentro del directorio views/prueba crea el directorio tmpl , aquí es donde se guardarán los layouts de la vista. El layout es el fichero final que se mostrará por el navegador, más adelante explicaré esto.

Crea el fichero views/prueba/view.html.php , este fichero también es necesario. Ahora crea el fichero prueba.php dentro de models.

Ya tienes la estructura básica del componente, aunque aún no hemos introducido código.

Componente de Joomla

Como podrás imaginar el modelo del componente irá dentro de la carpeta models , las vistas se ubicaran dentro del directorio views, y el controlador en el archivo controller.php .

Joomla! 1.5 sabe qué componente tiene que cargar porque busca en la query string de la petición el parámetro “option”, del cual obtiene el nombre del componente a cargar. Es decir, nosotros para llamar a nuestro componente prueba, introduciremos en joomla la URL acabada con index.php?option=com_prueba. Esto muestra la pagina principal de nuestro componente, que por defecto carga la vista con el mismo nombre del componente, es decir, la vista con nombre “prueba”.

Cuando se carga el componente, se ejecuta el punto de entrada a este, prueba.php, y en el punto de entrada será donde nosotros crearemos una instancia de nuestro componente.

Introduce el siguiente código en el punto de entrada de tu componente:

  1.  
  2.  
  3. <?php defined( ‘_JEXEC’ ) or die( ‘Restricted access’ );
  4.  
  5. //Importa el controlador base
  6. require_once( JPATH_COMPONENT.DS.‘controller.php’ );
  7.  
  8. // Si viene en la petición, se importa el controlador específico
  9. //El controlador específico hereda  del controlador base, por eso es necesario //importar también el base
  10. if($controller = JRequest::getWord(‘controller’)) {
  11.     $path = JPATH_COMPONENT.DS.‘controllers’.DS.$controller.‘.php’;
  12.     if (file_exists($path)) {
  13.         require_once $path;
  14.     } else {
  15.         $controller = ;
  16.     }
  17. }
  18.  
  19. // Se crea el controlador
  20. $classname    = ‘PruebaController’.$controller;
  21. $controller   = new $classname( );
  22. //El nombre del controlador es obtenido dinamicamente con el string $classname
  23.  
  24. // Sele pasa la tarea ( task) al controlador y se ejecuta su metodo execute
  25. $controller->execute( JRequest::getVar( ‘task’ ) );
  26.  
  27. // Redirect if set by the controller
  28. $controller->redirect();
  29. ?>
  30.  

Vamos a comentar el siguiente codigo paso a paso:

La primera línea comprueba si esta definida la variable “_JEXEC”, y si no esta definida se muestra un mensaje de error por pantalla mediante la función “die”. Esto es una medida de seguridad que incluye el marco de trabajo Joomla! y que es recomendable usar en todos nuestros archivos .php que tengamos en el sitio, y que evitara que la gente acceda a las paginas directamente sin hacer antes las comprobaciones de seguridad que lleva incluida Joomla!

Seguidamente se importa el fichero controller.php donde crearemos nuestra clase que contendrá el controlador.

JPATH_COMPONENT y DS son constantes que define el marco de trabajo de Joomla! y que contienen el path al componente en el sistema y el separador de directorios adecuado para el sistema que se este utilizando, “\” para Windows y “/” para sistemas Unix. Utilizar estas constantes nos facilitara el trabajo más adelante y hará nuestras aplicaciones portables e independientes de la plataforma donde se estén utilizando.

Después de importar el controlador, se comprueba si existe el parámetro “controller” en la query string, y si existe establece la variable path a JPATH_COMPONENT/controllers/$controller.php, para luego hacer un require_once de path, e importar el controlador que se especifica en la petición y que se sitúa en la carpeta controllers .

Nosotros no hemos creado la carpeta controllers, por que de momento solo crearemos un controlador, pero también se pueden crear varios controladores y se instanciará uno u otro según el parámetro controller que se establezca en la query string.

Después de importar el fichero correspondiente a nuestro controlador, lo instanciamos y ejecutamos el método execute del controlador, y le pasamos como parámetro un string que contiene el valor del parámetro task que hayamos establecido en la query string.

Después de esto se ejecuta el metodo redirect() del controlador, que redigirá el flujo del programa a la vista adecuada.

Parece complicado, pero no lo es tanto simplemente recuerda:

  • Se comprueba si viene un parámetro en la query string que establezca un controlador, y si viene se importa el fichero con el controlador.
  • Se instancia el controlador.
  • Se ejecuta el método execute del controlador.
  • Se ejecuta el método redirect del controlador.

Después de esto, lógicamente, tendremos que incluir el código del controlador que acabamos de instanciar.

Vamos al fichero controller.php y copiamos el siguiente codigo:

  1.  
  2.  <?php
  3.     defined( ‘_JEXEC’ ) or die( ‘Restricted access’ );
  4.  
  5.     //Se importa el archivo donde se encuentra la clase abstracta del componente con la funcion de joomla “jimport”.
  6.  
  7.     jimport(’joomla.application.component.controller’);
  8.  
  9.     class PruebaController extends JController
  10.     {
  11.  
  12.       function display()
  13.       {
  14.             parent::display();
  15.       }
  16.     }
  17.     ?>
  18.  

Esta vez lo único que hemos hecho es crear la clase que hará la función de controlador, y es obligatorio que herede de JController.Hemos sobrescrito el metodo display, pero lo único que hacemos es ejecutar el metodo display de la clase padre, es decir, que básicamente no hacemos nada.

En un componente más complejo, antes de ejecutar parent::display(); incluiríamos lógica de negocio en la aplicación, con acceso a datos , etc..

El controlador da paso a la vista correspondiente, que en este caso es la que se llame prueba.

Se le puede especificar la vista que se quiere ver pasándole a la petición un parámetro en la query string , es decir, si en vez de ver la vista por defecto quieres que el controlador redirija a una vista con nombre “noticias”, haremos una petición como la siguiente: index.php?option=com_prueba&view=noticias.

Lo mismo se puede hacer con el parámetro controller, pero en ese caso lo que haría sería instanciar el controlador con el nombre especificado en lugar de el controlador por defecto que se instancia.

Después de crear nuestro controlador, vamos a crear nuestra vista.

Vamos al fichero view.html.php en el directorio views/prueba y copiamos el siguiente código:

  1.  
  2. <?php
  3.     defined( ‘_JEXEC’ ) or die( ‘Restricted access’ );
  4.     jimport( ‘joomla.application.component.view’);
  5.  
  6.     class PruebaViewPrueba extends JView
  7.     {
  8.  
  9.     function display($tpl = null)
  10.  
  11.     {
  12.  
  13.       $model =& $this->getModel();
  14.  
  15.       $mensaje= $model->getMensaje();
  16.  
  17.       $this->assignRef( ‘mensaje’, $mensaje );
  18.  
  19.       parent::display($tpl);
  20.  
  21.     }
  22.  
  23.     }
  24.  
  25.     ?>
  26.  

Observa la definición de la clase. Como puedes observar tiene un nombre un poco peculiar, este nombre no se lo he puesto así por que he querido, sino que he seguido una norma que establece el marco de trabajo Joomla!, y que consiste en poner primero el nombre del componente que lo llama, seguido de view y seguido del nombre de la vista:

NombreComponenteViewNombreVista

Esta norma es la que se sigue también para el modelo.

Lo que vamos a hacer en este caso es sobrescribir el método display y utilizar assignRef para crear referencias que utilizará el “layout”.

La primera línea del método display obtiene el modelo, Joomla busca un modelo con nombre PruebaModelPrueba debido a que no se le pasa ningún parámetro a la función getModel() y lo instancia. Si le hubiéramos pasado el nombre de algún modelo como parámetro, nos hubiera devuelto el modelo especificado.

Una vez tenemos el modelo ejecutamos el método getMensaje de este, que devuelve un string. El string se le pasa al layout por referencia mediante assignRef.

Finalmente se ejecuta el método display de la clase padre, al cual se le puede pasar como parámetro el nombre del layout que se quiere visualizar, en nuestro caso no le pasaremos ninguno y visualizará el layout con nombre default.php .

Crea el fichero views/prueba/tmpl/default.php . Este será el layout que se visualizara por defecto en nuestra vista. Añade el siguiente código:

  1.  
  2. <h1><?php echo $this->mensaje ?></h1>
  3.  

Observa que recogemos lareferencia que hemos asignado antes mediante asignRef() simplemente como si fuera una variable local del script php. Yo he puesto este código muy simple, pero tu puedes poner todo el código html que se te ocurra.

­­ ­

Solo nos queda preparar el modelo e implementar el método getMensaje() que hemos usado antes en la vista,

Ves a la carpeta models y en el fichero prueba.php escribe el siguiente codigo :

­

  1.  
  2. <?php
  3.  
  4. defined(’_JEXEC’) or die();
  5. jimport( ‘joomla.application.component.model’ );
  6.  
  7. class PruebaModelPrueba extends JModel
  8. {
  9.  
  10.    function getMensaje(){
  11.  
  12.       //Aqui se obtiene los valores de l base de datos
  13.  
  14.       return “Hola soy un valor que ha devuelto el modelo”;
  15.  
  16.    }
  17. }
  18. ?>
  19.  

El código habla por si solo, ten en cuenta que yo he devuelto una cadena de texto por simplicidad, pero en una aplicación más compleja nos se devolvería una cadena obtenida de una base de datos o un resultSet, p.e.

Ya está finalizada la creación del componente. Para llamarlo tendremos que pasarle en la url como argumento el nombre del componente, y Joomla lo mostrará por pantalla. Como es lógico, Joomla sólo podrá mostrar un componente simultáneamente por pantalla.

Así quedaría la estructura de directorios para la parte de front-end de los componentes de Joomla!:

­

­

­ En el caso del componente que acabo de diseñar, después de introducir en el navegador la dirección http://localhost/sit­ioJoomla/index.php?option=com_prueba , ­ debería mostrar, si todo ha ido bien : “Hola soy un valor que ha devuelto el modelo”.

­­ He explicado cómo hacer la parte de front-end de un componente de Joomla! La parte de back-end se desarrolla de una forma similar, pero bajo la carpeta administrator/components del sistema de directorios de Joomla!, más adelante lo explicaré, así como los metodos mas importantes de acceso a datos que trae el API de Joomla!, que nos ahorrarán mucho tiempo y nos permitrán crear componentes mas seguros.

Saludos.



Comentarios

  1. 7
    Miguel Angel
    26 de Marzo del 2008 a las 8:24 am

    Hola,

    Tengo un problema al implementar el tutorial… directamente no aparece nada en la página :(.

    Creo que el problema inicial está en el fichero de entrada “prueba.php”. Más en concreto en la primera linea:

    <?php defined( ‘_JEXEC’ ) or die( ‘Restricted access’ );

    Comento todo el código y no da fallo (se carga todo excepto el componente). Pero si dejo sólo esa linea no aparece nada. Tipico cuando hay un error en php.

    No he instalado el componente. Sólo he hecho el front-end y utilizado directamente la url que indicas.

    Alguna idea??

    Un saludo,

  2. 8
    david
    26 de Marzo del 2008 a las 2:26 pm

    Hola Miguel Angel, a veces el embellecedor de código del blog, el geshi, juega malas pasadas y cambia algún carácter que puede hacer que la sintaxis sea erronea.
    Si escribes el error que da quizás pueda decirte que le pasa…

    Por ejemplo, en el punto de entrada, en la linea 15, si copias y pegas dará error , ya que lo que he pretendido poner es una cadena vacía, pero si copias y pegas pondrá unas comillas dobles…

    Un saludo

  3. 9
    Miguel Angel
    26 de Marzo del 2008 a las 3:17 pm

    El problema eran las comillas simples :(

    El copiar/pegar tiene esas cosas

  4. 10
    david
    26 de Marzo del 2008 a las 3:32 pm

    Me alegro que te haya funcionado… La verdad es que se hace muy complicado escribir código con el editor de wysiwyg, ojala se mejore esto en los CMS en un futuro…

  5. 11
    Mauricio Moo Aguilar
    28 de Abril del 2008 a las 2:28 pm

    Saludos David:
    Primeramente felicitaciones por los excelentes tutoriales que has subido a internet. Son muy claro y demasiados útiles, muchas gracias por tomarte el tiempo de ayudar a mas gente.
    Tengo una duda que confío en que me puedas ayudar a resolver. ¿Un componente que se construya en Joomla puede mostrarse directamente en la página de inicio?, como por ejemplo en el caso de las encuestas, que pueden aparecer en la posición que yo desee.Mi deseo es construir un componente que aparezca en la posición de mi página principal que yo desee.
    Gracias por tu atencion y de nueva cuenta felicitaciones

  6. 12
    david
    29 de Abril del 2008 a las 2:55 am

    Hola, pues lo que aparece en la pagina prioncipal es el componente com_frontpage, nunca me lo he planteado lo que dices, pero yo lo que haria seria una redireccion en el htaccess para que la página fuera directamente al componente cuando la gente pone la URL de la web en su navegador y conseguir un efecto parecido.

    Si no te sirve, puedes probar a cargarte el componente com_fronpage y crearte uno propio con el mismo nombre a ver que pasa…

    Comentalo si te funciona!!!

    Un saludo.

  7. 13
    Mauricio Moo Aguilar
    5 de Mayo del 2008 a las 1:56 pm

    Hola otra vez David:
    Gracias por tu propuesta. Desistí un poco de mi idea para concentrarme en enriquecer un poco los componente construidos. Por ahora, se solucio mi problema con un modulo y un iframe….jeje… pero ahora… abusando de tu confianza me enfrento a otro detalle.

    He construido un componente para el Front-End, sin embargo, como lo mencionas en este tutorial, mi código html se encuentra dentro de views/prueba/tmpl/default.php pero no se muestra correctamente. Mi codigo contiene imagenes y estilos css, en breve descripcion, una tabla con imagenes de fondo. El resultado es que solo me muestra el texto, pero no las imagenes de fondo.

    Ojala puedas ayudarme, yo sigo buscando y estudiando a joomla para ver si encuentro algo.

    Gracias de nueva cuenta por tu atencion

  8. 14
    Mauricio Moo Aguilar
    5 de Mayo del 2008 a las 2:25 pm

    Hola otra vez…jajaja

    Pues resolvi mi problema… a los 5 minutos de postear. Como las imagenes las tengo dentro de una carpeta, esta estaba tanto en la carpeta tmpl, pero tambien debe de estar en la carpeta principal del sitio. De esta manera, los estilos, imagenes, etc., se mostraron correctamente en mi componente. Describiendo, el componente tiene colores y estilos diferentes a la plantilla del joomla que uso.

    Gracias por tu atencion y el espacio para compartir esto.Saludos

  9. 15
    david
    6 de Mayo del 2008 a las 1:29 am

    Hola Mauricio, de nada!

    Pues eso te iba a decir, que el error se debia seguramente a que habias puesto la ruta de las imgenes mal.

    Usa JURI::base() o las variables JPATH_COMPONENT y JPATH_BASE para evitar estos errores.

    Un saludo!

  10. 16
    Luis
    23 de Mayo del 2008 a las 6:41 am

    Algo que no me gusta de joomla es este problema que tuvo Mauricio. Yo quisiera poder editar el html en Dreamweaver y ver como está quedando, pero al estar trabajando en joomla no se ven los estilos porque están ubicados en otras carpetas o referenciados para que joomla los encuentre.
    Hay alguna solución a esto?
    Saludos y muy muy bueno el tutorial!!

  11. 17
    julian
    20 de Junio del 2008 a las 9:00 am

    El error inicial ke me aparece es el mensaje de “Restricted access ” de la primera linea del fichero me gustaria saber donde se define la variable _EXEC ???? o por que no me deja acceder a la funcionalidad del componente

  12. 18
    Ricardo
    24 de Junio del 2008 a las 10:20 am

    Buenos dias primeramente felicidades es un tutorial simple y conciso, segui los pasos y lei al principio de los post que marcaba un error por copiar y pegar ya cambie las comillas y me sigue dando el mismo error alguien me puede guiar en que pueda ser gracias, el error es el siguiente
    Parse error: parse error, unexpected T_STRING in C:\Program Files\xampp\htdocs\Joomla153\components\com_prueba\controller.php on line 2

  13. 19
    Ricardo
    24 de Junio del 2008 a las 11:04 am

    Mil disculpas ya l oresolvi cambiando las comillas de todos los archivos gracias

  14. 20
    Ricardo
    24 de Junio del 2008 a las 11:17 am

    Ya resolvi el error gracias.

  15. 21
    david
    24 de Junio del 2008 a las 4:44 pm

    Es normal que te de ese error, ya que joomla comprueba si la variable _JEXEC esta definida, y como tu has puesto _EXEC en lugar de _JEXEC, pues joomla no es capaz de encontrarla y lanza el mensaje de error, un saludo!

  16. 22
    dontysk
    1 de Julio del 2008 a las 8:03 am

    Finalmente se ejecuta el método display de la clase padre, al cual se le puede pasar como parámetro el nombre del layout que se quiere visualizar, en nuestro caso no le pasaremos ninguno y visualizará el layout con nombre default.php .

    Intento hacer eso , es decir pasarle otro layout para que se visualice y no lo consigo. En concreto hago esto
    parent::display(’veragenda.php’);
    ¿Que hago mal?.
    Un saludo

  17. 23
    Maykel
    1 de Julio del 2008 a las 11:54 am

    Me hace falta la estructura de los componentes, el link esta mal, esta apuntando a los pluggin en vez de a los componentes

  18. 24
    Micki
    9 de Julio del 2008 a las 9:53 pm

    Simplemente genial. De verdad, muchas gracias por tus tutoriales.

    ¡¡¡Me has abierto un mundo dentro del nuevo Joomla!!!

  19. 25
    Brody
    28 de Julio del 2008 a las 10:46 am

    Puto cambio de comillas, lo agarran uno dormido la neta,
    un dia perdido..

  20. 26
    Osmar
    20 de Agosto del 2008 a las 7:52 pm

    hola a todos disculpen por mi ignorancia soy nuevo en esto me sale el siguiente error:

    Parse error: syntax error, unexpected T_STRING in C:\wamp\www\prueba\components\com_prueba\prueba.php on line 3

    En los post lei que decia que cambie de comilla: a cual comillas te refieres a ” ” o a ´´ “

  21. 27
    Osmar
    20 de Agosto del 2008 a las 7:54 pm

    O talvez la version que tenga no es compatible tengo la version Joomla 1.5.4

    Se lo agradeceria mucho que me repondiera

Trackbacks

  1. Tutorial: Componente para Joomla 1.5 IV | nosoloCodigo
  2. Programación de componentes bajo Joomla! 1.5. | nosoloCodigo
  3. Tutorial: Módulos para Joomla! 1.5 | nosoloCodigo
  4. Crear el XML del componente de Joomla y generar instalable | nosoloCodigo
  5. Tutorial: Componentes para Joomla! 1.5 II | nosoloCodigo
  6. Subir ficheros al servidor con el API de Joomla! | nosoloCodigo

Deja un Comentario

blank
[x] Cerrar
E-mail