More Related Content Similar to Dev con Joomla componentes modulos plugins (20) Dev con Joomla componentes modulos plugins1. Desenvolvemento en Joomla! 1.5 Tomás Vilariño Fidalgo II Xornadas de Programación Web en Software Libre Ourense, 24 de Xuño de 2008 28. Arquitectura Joomla! está deseñado a partires dun framework (agora todo son frameworks: CakePHP, Django, Ruby on Rails, FLOW3, ... ;-) 31. No xestor de idiomas establécese o idioma por defecto. Para ter un sitio con soporte multi idioma hai que botar man da extensión JoomFish: http://www.joomfish.net/ Languages 33. Na configuración global habilitando o modo de depuración obtemos información dos ficheiros de idioma cargados, cadeas sen tradución, consultas realizadas a base de datos, ... Languages 45. <? xml version = "1.0" encoding = "utf-8" ?> <install version = "1.5" type = "template" > <name> Template Fortune </name> <version> 1.0 </version> <creationDate> 09/04/07 </creationDate> <authorEmail> [email_address] </authorEmail> <authorUrl> http://vifito.es </authorUrl> <license> GNU/GPL </license> <description> Template de exemplo </description> <files> <filename> index.php </filename> <filename> templateDetails.xml </filename> <filename> template.png </filename> <filename> template_thumbnail.png </filename> <filename> media/3.css </filename> ... <filename> media/xhtml10.gif </filename> </files> <positions> <position> left </position> <position> right </position> <position> top </position> <position> fortune </position> </positions> <params> </params> </install> Templates templateDetails.xml 52. Modules - mod_fortune.php : ficheiro php co mesmo nome co módulo, tomará o control do módulo cando sexa chamado - helper.php : clase helper, serve para separar a lóxica da presentación. - directorio / tmpl/ : aquí gardaremos as plantillas que usaremos para a presentación -Por defecto, úsase o template default.php - mod_fortune.xml : ficheiro xml necesario para xerar un instalable e onde especificaremos os parámetros do módulo. 53. Código do punto de entrada mod_fortune.php Modules <?php // Non permitir o acceso directo defined ( '_JEXEC' ) or die( 'Acceso restrinxido' ); require_once( dirname ( __FILE__ ). DS . 'helper.php' ); $mensaxe = modFortuneHelper :: getMensaxe ( $params ); require( JModuleHelper :: getLayoutPath ( 'mod_fortune' , 'default' ) ); mod_fortune/mod_fortune.php 54. Modules <?php // Non permitir o acceso directo defined ( '_JEXEC' ) or die( 'Acceso restrinxido' ); class modFortuneHelper { function getMensaxe ( $params ) { $linhas = array(); $mensaxe = exec ( '/usr/games/fortune' , $linhas ); return( htmlentities ( implode ( '' , $linhas )) ); } } Helper.php é o ficheiro que contén a lóxica do módulo. A clase helper debe chamarse co nome do módulo sen “_” seguido de helper (modFortuneHelper) : mod_fortune/helper.php 56. <? xml version = "1.0" ?> <install type = "module" version = "1.5.0" > <name> Fortune </name> <author> vifito </author> <version> 1.0 </version> <creationDate> 18-06-2008 </creationDate> <description> Módulo que amosa unha mensaxe fortune aleatoria. </description> <authorEmail> [email_address] </authorEmail> <files> <filename module = "mod_fortune" > mod_fortune.php </filename> <filename> helper.php </filename> <filename> mod_fortune.xml </filename> <filename> tmpl/default.php </filename> </files> </install> Ficheiro XML utilizado polo instalador de Joomla! Modules 63. <? xml version = "1.0" encoding = "utf-8" ?> <install version = "1.5" type = "plugin" group = "content" > <name> Fortune Content </name> <author> vifito </author> <creationDate> Xuño 2008 </creationDate> <license> http://www.gnu.org/licenses/gpl-2.0.html </license> <authorEmail> [email_address] </authorEmail> <authorUrl> vifito.es </authorUrl> <version> 1.0 </version> <description> Insertar fortune antes do contido </description> <files> <filename plugin = "fortune" > fortune.php </filename> </files> <params/> </install> Plugins plugins/content/fortune.xml 64. Plugins <?php defined ( '_JEXEC' ) or die( 'Acceso Restrinxido' ); jimport ( 'joomla.plugin.plugin' ); // Convención : Nome da clase (plg + tipo plugin + nome do plugin) class plgContentFortune extends JPlugin { function plgContentFortune ( & $subject ) { parent :: __construct ( $subject ); } function onBeforeDisplayContent (& $article , & $params , $limitstart = 0 ) { $linhas = array(); $mensaxe = exec ( '/usr/games/fortune' , $linhas ); return( htmlentities ( implode ( ' ' , $linhas )) ); } } plugins/content/fortune.php 75. Component Punto de Entrada <?php // Non permitir o acceso directo defined ( '_JEXEC' ) or die( 'Acceso restrinxido' ); // Controlador base require_once( JPATH_COMPONENT . DS . 'controller.php' ); // Procurar o controlador si se pide na petición if( $controller = JRequest :: getWord ( 'controller' ) ){ $path = JPATH_COMPONENT . DS . 'controllers' . DS . $controller . '.php' ; if ( file_exists ( $path )) { require_once $path ; } else { $controller = '' ; } } // Instanciar o controlador $classname = 'FortuneAjaxController' . $controller ; $controller = new $classname (); // Executar a tarefa que vén da petición $controller -> execute ( JRequest :: getVar ( 'task' ) ); // Redirixir $controller -> redirect (); com_fortuneajax/fortuneajax.php 77. Component Controlador <?php /** * @package vifito.joomla * @subpackage component * @link http://vifito.es/ * @license GNU/GPL */ defined ( '_JEXEC' ) or die( 'Acceso restrinxido' ); jimport ( 'joomla.application.component.controller' ); class FortuneAjaxController extends JController { function display () { parent :: display (); } } com_fortuneajax/controller.php 78. Component Vista <?php defined ( '_JEXEC' ) or die( 'Acceso restrinxido' ); jimport ( 'joomla.application.component.view' ); class FortuneajaxViewFortuneajax extends JView { function display ( $tpl = null ) { $model =& $this -> getModel ( 'Fortuneajax' ); $mensaxe = $model -> getFortune (); $this -> assignRef ( 'mensaxe' , $mensaxe ); parent :: display ( $tpl ); } } com_fortuneajax/views/fortuneajax/view.html.php 79. Component Template <?php // Non permitir o acceso directo defined ( '_JEXEC' ) or die( 'Acceso restrinxido' ); echo $mensaxe ; ?> com_fortuneajax/views/fortuneajax/tmpl/view.html.php 80. Component Modelo <?php defined ( '_JEXEC' ) or die( 'Acceso restrinxido' ); jimport ( 'joomla.application.component.model' ); class FortuneajaxModelFortuneajax extends JModel { function getFortune () { $linhas = array(); $mensaxe = exec ( '/usr/games/fortune' , $linhas ); $str = htmlentities ( implode ( ' ' , $linhas )); return( $str ); } } 81. Component <? xml version = "1.0" encoding = "UTF-8" ?> <! DOCTYPE install SYSTEM " http://dev.joomla.org/xml/1.5/component-install.dtd " > <install type = "component" version = "1.5" > <name> Fortune Ajax </name> <creationDate> Xuño 2008 </creationDate> <author> vifito </author> <authorEmail> [email_address] </authorEmail> <authorUrl> http://vifito.es </authorUrl> <copyright> Copyleft </copyright> <license> GNU/GPL </license> <version> 0.1 </version> <description> Componente Fortune Ajax </description> <files> <filename> fortuneajax.xml </filename> <filename> fortuneajax.php </filename> <filename> controller.php </filename> <filename> models/fortuneajax.php </filename> <filename> views/fortuneajax/view.html.php </filename> <filename> views/fortuneajax/view.raw.php </filename> <filename> views/fortuneajax/tmpl/default.php </filename> </files> <administration /> <install /> <unistall /> </install> 93. // Read if (! $table -> load ( $id )) { die( $table -> getError () ); } // Update $table -> reset (); // Vaciar buffer evita problemas $table -> set ( 'id' , $id ); $table -> set ( 'content' , JRequest :: getString ( 'content' )); if ( $table -> check ()) { // ... } // Delete if (! $table -> delete ( $id )) { die( $table -> getError () ); } API Base de datos (JTable)