Blue Flower

Tutorial para hacer un módulo Joomla 1.5

Este módulo, muestra un calendario indicando los artículos publicados cada día. Al pasar el puntero por un día que tiene artículos, despliega un marco con un resumen del los artículos.

Archivos necesarios:

mod_calendarioltc.php Archivo principal del módulo
mod_calendarioltc.xml Contiene los parámetros del módulo
calendarioltc.css Hoja de estilos personalizada

Descargar archivos necesarios

En este caso el módulo, es bastante sencillo, ya que no tiene diferentes vistas y la programación está en un sólo archivo.

Esta es una manera sencilla de hacer un módulo, como se puede observar no es necesario implementar el modelo MVC, aunque si recomendable.

En siguientes tutoriales, voy a cambiar el módulo para que funcione con AJAX, ya que uno de los mayores incionvenientes es que cada vez que cambiamos de mes la página se vuelve a cargar.

Código del archivo mod_calendarioLTC.php

He tratado de usar la API de Joomla para todo, pero cuando no sabes alguna clase puedes usar el php directamente,en los cálculos de fechas por ejemplo podría usar la API, pero ya tenia código de PHP y para mi es más sencillo.

 

Evidentemente la conexión a la base de datos es más sencilla con la API de Joomla.

 1 <?php 
2 /**
3 * @version $Id: mod_calendarioLTC.php 2009-07-1 01:45:14Z
4 Luis Trigo $
5 * Este módulo muestra un calendario con los artículos que
6 hay en un mes
7 * al pasar el ratón por encima de un día muestra un
8 resumen de ese día
9 */
10
11 // no direct access
12 defined( '_JEXEC' ) or die( 'Restricted access' );
13 //añade el script de la libreria overlib
14 <script type="text/javascript"
15 src="includes/js/overlib_mini.js"></script>
16 //para añr una hoja de estilos
17 $document = &JFactory::getDocument();
18 $document->addStyleSheet( JURI::base() .
19 'modules/mod_calendarioltc/calendarioltc.css', 'text/css',
20 null, array( 'id' => 'StyleSheet' ) );
21 //contiene el valor del componente principal;
22 global $option;
23
24 //recoge los parametros del XML
25 $secciones =$params->get('sections');
26
27 //Referencia a la base de datos
28 $db =& JFactory::getDBO();
29
30
31 //Variable pasada por get
32 $mes_cal = JRequest::getVar( 'mes_cal', '0', 'get', 'string'
33 );
34 //Al usar la función de Joomla establecemos '0' como valor
35 por defecto
36
37 //si no se manda $mes_cal.
38 //la fecha es la de hoy. (Siempre que se carga la página
39 por primera vez)
40 if($mes_cal ==0){
41 $fecha = time();
42 $mes=date("m",$fecha);
43 $year=date("Y",$fecha);
44 //sprintf("%02d", ((int)$mes)-1) devuelve el mes en
45 formato 01 02 ....
46 $mes_cal= $year . "-". sprintf("%02d", (int)$mes) ."-01";
47 }
48
49 //Variables locales que sacamos de $mes_cal.
50 $year=substr($mes_cal,0,4);
51 $mes=substr($mes_cal,5,2);
52 //el primer dia del mes siempre es 1
53 $dia=1;
54 //Mes Anterior
55 if ($mes=="01"){
56 //si estamos en el mes 1 el anterior es el mes 12
57 $mes_anterior= (int)$year-1 ."-12-01";
58
59 }
60 else
61 {
62 //en cualquier otro mes restamos 1
63 $mes_anterior= $year."-".sprintf("%02d", ((int)$mes)-1) .
64 "-01";
65
66 }
67 //Mes Siguiente
68 if ($mes=="12")
69 //Si el mes es 12 el siguiente es 01
70 $mes_siguiente= (int)$year+1 ."-01-01";
71 else
72 // el resto de los meses es el mes actual más uno
73 $mes_siguiente= $year."-".sprintf("%02d", ((int)$mes)+1) .
74 "-01";
75
76 $query = "SELECT a.id as contid,a.publish_up, a.title, a.
77 state, a.created, a.created_by, u.title AS cattitle "
78 . " FROM #__content AS a "
79 . " LEFT JOIN #__categories AS u ON u.id = a.catid "
80 . " LEFT JOIN #__sections as sec ON sec.id = a.sectionid
81 "
82 . " where a.publish_up >= '". $mes_cal . "' and a.
83 publish_up < '" . $mes_siguiente ."'"
84 . " AND sec.title LIKE '".$secciones."' AND a.state = 1
85 "
86 . " LIMIT 0,300";

Si ponemos un echo($query); saldrá la consulta sql que queremos ejecutar, pero con los nombres de la tabla #__

Si queremos probar la consulta en phpmyadmin hay que cambiarlos en mi caso por jos_.

87  // Ejecutamos la consulta 
88 $db->setQuery( $query);
89
90 // Mostramos un error si no conectamos a la base de datos
91 $rows = $db->loadObjectList();
92 echo $db->getErrorMsg();
93
94 //Dirección desde la que se llamó
95 $uri = JFactory::getURI();
96 //dirección desde la que se llamó en una cadena
97 $url = $uri->toString();
98 //Borramos de la llamada la parte get de la variable mes_cal
99 si existe
100 $url = ereg_replace("&mes_cal=".$mes_cal,"",$url);
101 //si la llamada no incluye ninguna varible hay que añadir ?
102 en vez de &
103 //esto pasa cuando se entra por primera vez en la web
104 if(!stripos($url,"?"))
105 $url = $url ."index.php?" . $option;
106 //la variable option debe tener (com_content) o el
107 componente que se indique como principal
108
109 //Creamos la fecha en formato PHP
110 $fecha=mktime('0','0','0',$mes,$dia,$year);
111
112 //La fecha inicial del calendario incluye los dias que no
113 pertenecen al mes ejemplo el 1-8-09 es Sabado
114 //el calendario empieza el 26-07-09 (86400 es el numero de
115 segundos de un día (24*60*60))
116 $diasemana= date("w",$fecha);
117 if ($diasemana== 0) {
118 $numdiasant = 6;
119 }
120 else{
121 $numdiasant = $diasemana -1;
122 }
123
124 $fechaini= $fecha -($numdiasant * 86400);
125 $diaini = date("d",$fechaini);
126 $mesini= date("m",$fechaini);
127 $mes_txt = mestxt($mes); //traducimos el mes, tambien
128 podemos usar la traduccion de joomla
129
130 //Empezamos a dibujar el calendario
131 //Primero el encabezado
132 ?>
133 <div class="calendario">
134 <table width="140">
135 <tr>
136 <td align="right"><?echo($mes_txt."-".$year);?></td>
137 </td>
138 </tr>
139 </table>
140
141 </div>
142 <table class="botones" width="150">
143 <tr >
144 <td >
145 <a href="<?echo($url)."&mes_cal=".$mes_anterior;?>"><< </a>
146 </td>
147 <td>
148 <a href="<?echo($url);?>">HOY </a>
149 </td>
150 <td>
151 <a href="<?echo($url)."&mes_cal=".$mes_siguiente;?>">>> <
152 /a>
153 </td>
154
155 </tr>
156 </table>
157
158 <table class="botones" width="150">
159 <tr class="nombre_dias">
160 <td width="10%">L</td>
161 <td width="10%">M</td>
162 <td width="10%">M</td>
163 <td width="10%">J</td>
164 <td width="10%">V</td>
165 <td width="10%">S</td>
166 <td width="10%">D</td>
167 </tr>
168 <?php $ndias =0; //contador
169 //Hacemos un bucle de 6 para un máximo de seis semanas
170 en un mes
171 for ($n=0;$n<6;$n+=1){ ?>
172 <tr>
173 <?php
174 //Hacemos un bucle de 7 para los siete dias de la semana
175 for ($i=0;$i<7;$i++){?>
176 <td width="100">
177 <?
178 //Si el dia pertenece al mes que queremos del calendario
179 if(date("m",$fechaini+($ndias*86400)) ==$mes){
180 $entro =0;
181 $overdiv = "";
182 foreach ( $rows as $row ){
183 //recorremos todas las filas de la tabla y seleccionamos
184 los articulos de la fecha
185 $dia_actividad=substr($row->publish_up,8,2);
186 //Solo usamos el dia, por que la consulta solo incluye
187 los articulos del mes
188 if ($dia_actividad == date("d",$fechaini+($ndias*86400)))
189 {
190 $hora= substr($row->publish_up,11,5);
191 $titulo =$row->title;
192 //por ahora dejo esto
193 $titulo = ereg_replace('"',"",$titulo);
194 $titulo = ereg_replace("'","",$titulo);
195
196 // no funciono $titulo = preg_replace("/[^a-zA-Z0-9 .
197 ?!$()\'\"]/", '', $titulo);
198
199 //rellenamos una variable para mostrar el over div (al
200 pasar el ratón por el día muestra la información
201 $overdiv = $overdiv . " <tr><td>" . $hora . "</td><td>
202 " . $titulo . '</td></tr>' ;
203
204 //Con esta variable cambiamos la clase de la hoja de
205 estilo dia_con o dia_sin
206 $entro=1;
207
208 }
209 }
210 if($entro==0)
211 echo('<div class="dia_sin">');
212
213 $ndia= date("d",$fechaini+($ndias*86400));
214 if($entro==1){
215 echo('<div class="dia_con"');
216 //Escribimos el valor de overdiv
217 //en este caso añado una tabla dentro del overdiv para
218 que la información salga ordenada.
219 echo( 'onMouseOver="return overlib('. "'<table>" .
220 $overdiv . "</table>'". ", BELOW, RIGHT);" . '"' .
221 'onmouseout="return nd();">');
222 ?>
223
224 <a href="<? //si tiene información escribimos el enlace
225 en este caso enviamos el id del articulo al componente
226 content con la vista article
227 //PARA NUESTRO CASO NO SIRVE POR QUE DEBERIAMOS
228 MOSTRAR UN COMPONENTE CON TODOS LOS TITULOS DE ESTE
229 DÍA
230 echo(JURI::root())."index.
231 php?option=com_content&view=article&id=".$row->
232 contid?>">
233
234 <?php
235 //escribimos el número del día en el calendario cerrando
236 el enlace
237 echo("<p>".(int)$ndia."</p>");?> </a>
238 <? }
239 else //escribimos el número del día en el calendario sin
240 enlace
241 echo("<p>".(int)$ndia."</p>");?>
242 </div>
243 <?}$ndias++;?>
244 </td>
245
246 <?php }?>
247 </tr>
248 <?php } //fin del dibujo del calendario?>
249 </table>
250
251
252
253
254 <? function mestxt($mes){
255 switch($mes)
256 {
257 case "01":
258 $mes="Enero";
259 break;
260 case "02":
261 $mes="Febrero";
262 break;
263 case "03":
264 $mes="Marzo";
265 break;
266 case "04":
267 $mes="Abril";
268 break;
269 case "05":
270 $mes="Mayo";
271 break;
272 case "06":
273 $mes="Junio";
274 break;
275 case "07":
276 $mes="Julio";
277 break;
278 case "08":
279 $mes="Agosto";
280 break;
281 case "09":
282 $mes="Septiembre";
283 break;
284 case "10":
285 $mes="Octubre";
286 break;
287 case "11":
288 $mes="Noviembre";
289 break;
290 case "12":
291 $mes="Diciembre";
292 break;
293 }
294 return $mes;
295 }

Para instalar el módulo necesitamos un instalador, es un archivo XML (mod_calendarioltc.xml) donde se indica información del módulo y los archivos que lo componen.


1 <?xml version="1.0" encoding="utf-8"?>
2 <install type="module" version="1.5.0">
3 <name>Calendario_LTC</name>
4 <version>1.0.0</version>
5 <creationDate>2009 07 01</creationDate>
6 <author>Luis Trigo</author>
7 <authorEmail>Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.</authorEmail>
8 <authorUrl>http://www.luistrigoc.es</authorUrl>
9 <description>Muestra un calendario, enlazado a los
10 articulos
11 </description>
12 <files>
13 <filename module="mod_calendarioltc">
14 files/mod_calendarioltc.php</filename>
15 <filename module="mod_calendarioltc">
16 files/mod_calendarioltc.xml</filename>
17 <filename module="mod_calendarioltc">
18 files/calendarioltc.css</filename>
19 </files>
20 </install>

Hay otro archivo XML que se llama igual mod_calendarioltc.xml, pero este sirve para indicar parámetros del módulo, en este caso sólo tiene un parametro secciones, que usamos para filtrar las secciones que va a usar el módulo. En el archivo .zip encontralos los archivos con el siguiente orden: mod_calendarioltc.zip

    mod_calendarioltc.xml (instalador)
  • Files (carpeta)
    • mod_calendarioltc.php mod_calendarioltc.xml (archivo de parámetros). calendarioltc.css

mod_calendarioltc.xml (archivo de parámetros).


1 <?xml version="1.0" encoding="utf-8"?>
2 <install type="module" version="1.5.0">
3 <name>calendarioltc</name>
4 <author>Luis Trigo</author>
5 <creationDate>Julio 2009</creationDate>
6 <copyright>(C) 2005 - 2009 Luis Trigo.</copyright>
7 <license>http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL<
8 /license>
9 <authorEmail>Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.</authorEmail>
10 <authorUrl>www.luistrigoc.es</authorUrl>
11 <version>1.5.0</version>
12 <description>Calendario de articulos por seccion<
13 /description>
14 <files>
15 <filename module="mod_calendarioltc">mod_calendarioltc.
16 php</filename>
17 </files>
18 <params>
19 <param name="moduleclass_sfx" type="text" default=""
20 label="Module Class Suffix"
21 description="PARAMMODULECLASSSUFFIX" />
22 <param name="sections" type="text" default=""
23 label="Secciones" description="Elje las secciones
24 separadas por comas o que empiezen por una palbara
25 ejemplo actividades%" />
26 </params>
27 <params group="advanced">
28 <param name="cache" type="list" default="1"
29 label="Caching" description="Select whether to cache the
30 content of this module">
31 <option value="1">Use global</option>
32 <option value="0">No caching</option>
33 </param>
34 </params>
35 </install>