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
2.
Contidos Introdución Instalación,configuración e posta en funcionamento Arquitectura de Joomla! 1.5 Languages Templates Modules Plugins Components API Base de datos Integración con outros frameworks Referencias e conclusións
Introdución Joomla! é un CMS desenvolvido en PHP baixo GNU/GPL. É o resultado dunha bifurcación e mellora de Mambo (Mambo 4.5.2.3). O nome de Joomla! vén da palabra suajili jumla que significa " todos xuntos " ou " como un todo ". A primeira versión de Joomla! (Joomla! 1.0.0) publicouse 16 de setembro de 2005. Actualmente está dispoñible a versión Joomla! 1.5.3 construída baixo PHP 5.2
5.
Introdución Joomla éun CMS moi flexible, en parte grazas ao fácil que resulta desenvolver extensións (compoñentes, plugins, modules) . As extensións serán o mecanismo co que conta Joomla! 1.5 para dotarse de maiores funcionalidades e contrarrestar as súas deficiencias (multi idioma, multi sitio, xestión de usuarios limitadas, ...). Isto propicia a aparición dunha gran comunidade de desenvolvedores que xera unha gran cantidade de extensións.
6.
Introdución A tendenciade Joomla! comparada con Drupal e TYPO3 en Google Trends Joomla! 1.0 publicouse o 16 de setembro 2005
7.
O desenvolvemento deextensións de Joomla! evolucionou coa aparición da nova versión 1.5 Creouse un potente framework e potenciouse o aspecto de POO aproveitando as vantaxes de PHP 5. Olvidémonos de PHP4: http://gophp5.org/ Introdución
Instalación Antes decomezar a instalación é recomendable crear a base de datos: $ mysqladmin –u db_user –p create joomla dende liña de comandos ou dende phpmyadmin
11.
Instalación O asistentede instalación de Joomla componse de sete pasos: Escoller o idioma do instalador Chequeo de pre-instalación Licenza Configuración da base de datos Configuración do FTP Outras configuracións Finalizar
Instalación Ao finalizara instalación recoméndase obrígannos a eliminar o directorio de instalación para poder comezar a traballar Despois de eliminar o directorio de instalación xa podemos traballar co Site ou Admin
Estrutura de directoriosseparadas parte de administración (Administrator, Backend, administración, ...) parte pública (Site, Frontend, frontal, ...) Parte de administración e pública teñen similitudes Comparten o cartafol /libraries/ O funcionamento interno da administración é similar ao da parte pública http://localhost/joomla/administrator/index.php?option= com_conten t&task= add Arquitectura
23.
24.
Arquitectura Joomla 1.5esta composto de módulos, compoñentes e plugins. ( Tamén poderíamos considerar aos templates e aos ficheiros de idioma extensións de Joomla!) Os módulo s son pequenos anacos de contido como pode ser un menú, isto é un modulo: O compoñente é onde se mostra o contido principal en Joomla! (miniaplicación) -> só se executa un por petición, o que se especifica no parámetro option Os plugin s responden a eventos do sistema (login de usuarios, ao mostrar contidos, cando se autentican, ... )
A parte dasextensións incluídas en Joomla! é posible extender as funcionalidades por medio de novas extensións As extensións instalaranse dende o administrador de extensións (no backend, obvio :-) Arquitectura
27.
Component Module PluginLanguage Tool : aplicacións externas que permiten xestionar ou facilitar o traballo dun sitio Joomla! Special : extensión específicas que requiren doutras extensións para o seu funcionamento. http://extensions.joomla.org Arquitectura Onde atopar extensións para Joomla! ?
28.
Arquitectura Joomla! estádeseñado a partires dun framework (agora todo son frameworks: CakePHP, Django, Ruby on Rails, FLOW3, ... ;-)
Languages Joomla! permiteimportar paquetes de idioma tendo traducida a interface do sitio ( site ) e/ou administración ( administrator ). Entre as configuracións de Joomla! é posible activar a depuración de cadeas de idioma (Configuración global | Sistema) . Paquetes de idioma galego: https://forxa.mancomun.org/projects/joomlagalego/ En castelán: http://www.todosjuntos.org/content/view/55/1/
31.
No xestor deidiomas 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
Na configuración globalhabilitando o modo de depuración obtemos información dos ficheiros de idioma cargados, cadeas sen tradución, consultas realizadas a base de datos, ... Languages
34.
Formato dun ficheirode idioma INI (p.e.: <path_joomla>/language/gl-ES/gl-ES.com_content.ini) ACCESS LEVEL=Nivel de Acceso ADD=Agregar ALIGN=Aliñar ALL PAGES=Todas as páxinas ALT TEXT=Texto alternativo ALREADY EXISTS=Xa existe ... API para empregar a tradución <?php echo Jtext::_('ADD'); ?> Languages
35.
$ mv en-GB.inien-GB.properties $ prop2po -P en-GB.properties en-GB.pot processing 1 files... [###########################################] 100% $ cp en-GB.pot gl-ES.po $ po2prop -t en-GB.pot gl-ES.po gl-ES.properties $ mv gl-ES.properties gl-ES.ini http://translate.sourceforge.net/wiki/toolkit/prop2po Xerar o ficheiro PO para utilizar ferramentas de tradución de software: poEdit, Kbabel, gTranslator, ... Despois de traducir o ficheiro gl-ES.po convertilo a formato INI Languages
O sistema detemplates da versión 1.5 de Joomla sufriu cambios destacables durante o proceso de desenvolvemento. Inicialmente íase botar man do motor de plantillas patTemplate e por cuestións de rendemento desbotouse a idea. A biblioteca inda está no cartafos /libraries/ inclúese por razóns de compatibilidade. http://trac.php-tools.net/patTemplate Templates
39.
Novidades no motorde plantillas en J! 1.5: Accesibilidade nas plantillas por defecto Compatibilidade cara atrás, versións 1.0.x (legacy mode). $this->countModules('user1 + user2'). Sentencias condicionais. <jdoc :include ... /> Detección automática do uso do editor WYSIWYG. Parametrización. Soporte para múltiples follas de estilo (CSS). Overrides, sobrescriben a saída por defecto das extensións. http://www.joomla.org/component/option,com_jd-wp/Itemid,33/p,210/ Templates
40.
Instalación de temascreados para Joomla! Descargamos un tema p.e.- “Go Vista Plain” e instalámolo empregando o xestor de extensións do administrador de Joomla! http://www.augs-burg.de/joomla/joomla1.5-templates.php Templates
41.
42.
Deseñamos unha plantillade Joomla! propia Partimos do seguinte deseño: http://www.intensivstation.ch/files/en_templates/2/template-3.html Templates
43.
Definimos as nosasposicións (positions) onde situaremos os módulos e o compoñente (left, right, user1, ...) Templates
44.
Empregamos <jdoc:include .../> para definir as posicións < html xmlns= " http://www.w3.org/1999/xhtml " xml: lang = "en" lang = "en" > < head > < jdoc :include type = "head" /> </ head > < body > < div id = "container" > < jdoc :include type = "message" /> < div id = "outer" > < div id = "inner" > < div id = "left" >< h2 > Esquerda </ h2 > < jdoc :include type = "modules" name = "left" /> </ div > < div id = "content" > < h2 > Contido </ h2 > < jdoc :include type = "component" /> </ div > <!-- end content --> ... Templates
Construímos un ficheiro.zip e instalamos a plantilla dende o administrador de extensións. Resultado Templates
47.
Referencias: Titorial sobreplantillas para a versión 1.5 http://www.joomla.org/component/option,com_jd-wp/Itemid,33/p,210/ O titorial de referencia obrigatoria (imprescindible) http://dev.joomla.org/downloads/Joomla15TemplateTutorial.zip Templates
Modules Imos desenvolverun módulo simple que amose unha frase recuperada do programa fortune ( http://fortune-gui.sourceforge.net/ ) Por motivos de tempo vanse a quedar moitas cousas sen explicar, como o uso de parámetros, etc.
50.
Os módulos atópansesituados no directorio /modules/ dentro do directorio de instalación de Joomla e por cada módulo hai un cartafol con nome mod_nomeModulo . O noso módulo vaise a chamar fortune . o cartafol do módulo chamarase / mod_fortune/ . Vemos a continuación a estrutura do módulo . Modules
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 directodefined ( '_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
Que son osplugins? Son extensións que permiten modificar o comportamento do programa Que fan os plugins? Interceptan certos eventos prefijados para executar o noso código antes ou despois do evento. Existen varios tipos de plugins Por cada tipo de plugin existe un directorio dentro do directorio plugins Polo tanto temos o directorio plugins/content para os plugins de tipo content e así con todos os tipos. Plugins
60.
Plugins authentication :autenticación dos usuarios no proceso de login ( LDAP , openid, contas de google, ...) content : procesar os ítems de contidos editors : editores WYSIWYG que poden ser utilizados para a edición de contidos. editors-xtd : extensións do editor (creación de botóns adicionais) search : personalización das procuras realizadas nun sitio (incluír nas buscas resultados de novos compoñentes) system : escoita eventos do sistema user : procesa as accións dun usuario xmlrpc : crea respostas XML-RPC (APIs blogger, SITEMan, ...)
61.
Implementación do pluginUn plugin é un obxecto que deriva da clase JPlugin . Esta clase ten uns métodos definidos que responden aos eventos do sistema (hooks) Polo tanto teremos que sobrescribir o hook preciso para que reaccione a acción que desexemos. Plugins
62.
Obxectivo do plugin:Amosar unha mensaxe antes do cada artigo Estrutura do plugin Fortune Plugins
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
O compoñente éa mini-aplicación que executa Joomla! (http://.../index.php?option=com_...) Os compoñentes pódense implementar empregando o patrón MVC (recomendable para aproveitar as vantaxes do framework) MVC é un patrón de arquitectura de software que separa os datos dunha aplicación, a interfaz de usuario, e a lóxica de control en tres compoñentes distintos. http://es.wikipedia.org/wiki/Modelo_Vista_Controlador Component
68.
Por que étan importante? Seguindo este patrón crearemos código máis ordenado. Será máis fácil entender o código de terceiros (e o noso), xa que segue un patrón coñecido. Aumenta a produtividade. En Joomla! as clases que implementan o patrón son: JModel – JView - JController Component
69.
70.
Component Estrutura duncompoñente en Joomla! simplificada (imos ver só a parte do frontend con varias vistas para soportar Ajax).
71.
O controlador: o controlador é o punto de entrada da aplicación, mantense a escoita de todas as peticións, executa a lóxica da aplicación, e amosa a vista apropiada para cada caso. O modelo: o modelo contén todo o código relacionado co acceso a datos . É importante que sexa un código o máis xenérico posible e se poida reutilizar. Nunca incluiremos lóxica no modelo, soamente consultas á base de datos e validacións de entrada de datos. A vista : a vista contén o código que representará o que vemos por pantalla , neste caso trátase de código html (tamén feed RSS, PDF, ...) Component
72.
Existen dúas formasde traballar: -Usando un ficheiro XML onde se especifica que é cada cousa (Struts). -Usando convencións (Joomla!). Paradigma de diseño “Convention over Configuration” (CoC) Component http://en.wikipedia.org/wiki/Convention_over_Configuration
73.
Que son asconvencións? Son normas a seguir para crear as vistas (JView), os modelos (JModel) e os controladores (JController). Usar convencións adoita resultar máis rápido que usar ficheiros XML. Os ficheiros XML poden crecer desorbitadamente ata o punto de facerse pouco mantenibles. Component
74.
Obxecto Controlador (JController): NomeCompoñente + Controller Obxecto Vistas (JView): nomeCompoñente + View + nomeVista Obxecto Modelo (JModel): nomeCompoñente + Model + Nome do modelo Component
75.
Component Punto deEntrada <?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
76.
Compróbase se vénun parámetro na query string que estableza un controlador, e se vén impórtase o ficheiro co controlador. Instanciase o controlador. Execútase o método execute do controlador. Execútase o método redirect do controlador. Component
Component Grazas avista “raw” é posible facer peticións Ajax. Agora un módulo podería facer peticións HTTP vía Ajax. (ver módulo mod_fortuneajax) Joomla! integra a librería javascript MooTools. OLLO: a última versión de MooTools é a 1.12 e en Joomla! inclúese a 1.11
84.
mod_fortuneajax fai peticiónsAjax ao componente com_fortuneajax, pedindo a vista “raw” para que devolva só o contido e non todo o layout do sistema.
85.
Quedaría pendente todaa parte da administración: http://dev.joomla.org/component/option,com_jd-wiki/Itemid,/ id,components:hello_world_mvc4/ Component
86.
API Base dedatos (core) Para aproveitar as funcionalidades do framework de Joomla! usar convencións : Nome das táboas, recomendable en minúsculas e coa seguinte sintaxe: #__ <nome_componente> _ <nome_táboa> p.e. jos_fortune_frases. ( #__ prefixo definido na instalación, por defecto jos_) Nome da clave primaria “ id ”, (integer auto_increment not null) Nomes dos campos en minúscula, palabras separadas por “_”. p.e. email_secundario
87.
API Base dedatos (core) Nomes de campos comúns con funcionalidades extra: published : 0 -> no publicado 1 -> publicado hits : enteiro que garda os accesos dende o frontend dos visitantes (estatísticas) Bloqueo da edición: checking_out , garda o id de usuario (0 por defecto) checking_out_time , o datetime ordering : garda a orde na que se amosan parameters : garda parámetros en formato INI (variable=valor). Clase de utilidade JParameter
88.
API Base dedatos (core) Código básico para acceso a base de datos: // Recuperar instancia da base de datos $db =& JFactory :: getDBO (); // Consulta $query = 'SELECT * FROM #__fortune_frases' ; // Recoller o resultado da consulta $result = $db -> setQuery ( $query ); Estase traballando para emular as funcións do API de ADOdb. OLLO! non hai intención de integrar a librería ADOdb
89.
API Base dedatos (core) Métodos API: $db =& JFactory::getDBO(); $db->loadResult() $db->loadResultArray([$key]) $db->loadAssoc() $db->loadAssocList([$key]) $db->loadObject() $db->loadObjectList([$key]) $db->loadRow() $db->loadRowList([$key]) ...
90.
API Base dedatos (JTable) JTable proporciona un conxunto de funcionalides (CRUD) abstraendo cuestións internas coma SQL, ...
91.
Clase “TableFortuneFrases” herdade JTable funcionalidades ORM. As clases JTable gárdanse no cartafol /tables/ do compoñente: JPATH_COMPONENT_ADMINISTRATOR.DS.'tables'.DS.'fortunefrases.php' class TableFortuneFrases extends JTable { var $id = null ; var $content = null ; var $published = null ; var $hits = 0 ; var $checking_out = 0 ; var $checking_out_time = null ; var $ordering = null ; var $params = null ; function __construct ( & $db ){ parent :: __construct ( '#__fortune_frases' , 'id' , $db ); } } API Base de datos (JTable)
92.
CRUD ( Create, R ead, U pdate e D elete) // Obter unha instancia de JTable JTable :: addIncludePath ( JPATH_COMPONENT_ADMINISTRATOR . DS . 'tables' ); $table = JTable :: getInstance ( 'FortuneFrases' , 'Table' ); // Create $table -> reset (); // Vaciar buffer evita problemas $table -> set ( 'content' , "Lorem ipsum dolor sit amet" ); $table -> set ( 'ordering' , $table -> getNextOrder ()); if ( $table -> check ()) { // Método check para comprobar o buffer if (! $table -> store ()) { die( $table -> getError () ); } } else { die( $table -> getError () ); } API Base de datos (JTable)
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)
94.
Métodos de JTablepara aproveitar as funcionalidades dos campos comúns: // Published, publicar (=1) ou despublicar (=0) contidos $table -> publish ( $array_ids , 1 , $user -> get ( 'id' )); // Aumentar un máis as visitas do contido $table -> hit (); // Comprobar si esta checked out $table -> isCheckedOut ( $user -> get ( 'id' ) ); // Bloquea o rexistro para o usuario $table -> checkout ( $user -> get ( 'id' ) ); // Desbloquea o rexistro $table -> checkin (); // Reordear os contidos $table -> reorder (); API Base de datos (JTable)
95.
Manexo do campoparams, útil para personalizar propiedades dun contido. Os parámetros defínense no ficheiro XML que contén os detalles da extensión: // Manexo dos parámetros (clase JParameter) $params = new JParameter ( $table -> params ); $parametro = $params -> get ( 'nome_parametro' ); $params -> set ( 'nome_parametro' , $valor ); $table -> params = $params -> toString (); API Base de datos (JTable)
Joomla! pódese integrarcon outros proxectos coma phpBB por medio de compoñentes, plugins, módulos, ... Por medio dunha interface XML-RPC garántese a interoperabilidade . Tamén se pode integrar dentro de Joomla! proxectos desenvolvidos con frameworks web: p.e.- CakePHP e Symfony Joomla! + CakePHP = Jake http://cakeforge.org/frs/?group_id=76&release_id=314 Joomla! + Symfony = sfJoomla15Bridge, inspirado en Jake http://trac.symfony-project.com/wiki/sfJoomla15BridgePlugin Joomla! e outros frameworks
98.
Joomla! e outrosframeworks Instalamos unha aplicación CakePHP existente (Cheesecake Photoblog) en Joomla!. Pasos: 1) Instalar o componente Jake: http://cakeforge.org/frs/download.php/354/jake_1.0.3.38b-joomla_1.5.zip 2) Instalar Cheesecake: http://cakeforge.org/frs/download.php/510/cheesecake_cake.tar.gz 3) Configuramos a aplicación en Joomla! com_jake/jake.ini [settings] default = "cheesecake" [cheesecake] path = "/var/www/cheesecake/app/webroot" url = "/cheesecake" 4) Obter URL de Jake a aplicación
99.
Joomla! e outrosframeworks Instalación de Jake / Jake no menú de compoñentes
100.
Joomla! e outrosframeworks Resultado da integración de Cheesecake en Joomla!
101.
Joomla! e outrosframeworks SITEman, aplicación de escritorio implementada en Java que permite aos usuarios administrar un sitio Joomla! 1.5 dende un ambiente de escritorio.
Referencia e conclusiónsGracias a David Noguera Cifuentes Parte desta presentación inspirada no seu material http://www.nosolocodigo.com/tag/joomla Páxina oficial de Joomla! http://joomla.org Directorio de extensións de Joomla! http://extensions.joomla.org Tradución Joomla! ao galego https://forxa.mancomun.org/projects/joomlagalego/