Lun Mar 17, 2008 8:45 am
|
 |
zozo666
Perlero Frecuente

|
Registrado: 26 May 2007
Mensajes: 137
|
|
| Creación de un calendario con Perl |
|
|
Buenas gente, necesitaría un gran favor y una gran ayuda. Tengo que generar un calendario en Perl; un ejemplo fácil que doy, un calendario como el de Google pero no tan completo ni con todas las opciones que tiene.
Lo que tengo que hacer es un calendario que me muestre solamente los 7 días de la semana que estamos transitando, o sea, ésta sería la semana de 2000-03-17 que empezó ayer.
Bueno, lo que tendría que hacer es tener 8 columnas, una columna sería del horario y las demás, de los 7 días de la semana.
Toda la información la tendría que traer de una base de datos, o sea, solamente el Título del evento y el horario.
Digo un ejemplo para que vean lo que necesito: en la primera columna por ejemplo me aparece este horario 14:00, y el día 18-03-2007; están programadas 3 cosas, por ejemplo, "Llamar a mama, leer el diario, pagar Teléfono". El tema es que estas 3 cosas programadas están en distintos registros en la base de datos, o sea hay un registro para Llamar a mama, en el cual el campo Hora figura "2007-03-18 14:00:00" y los demás lo mismo, o sea, en el Campo Hora de los otros 2 también figura "2007-03-18 14:00:00"
Lo que quiero hacer es tratar de mostrarlo todo en el mismo cuadro del día ese, o sea, todo lo que está hecho en el mismo día a la misma hora. O sea que me aparezca esto:
| Código: |
HORA-------2007-03-18
---------------------------
14:00 ------- Llamar a mama
---------------leer el diario
---------------pagar Telefono
15:00 -------- Tal cosa... |
Así es como quiero que me muestre el calendario las cosas que tengo programadas. ¿Qué consejo me dan para hacer este tipo de calendario? No es nada complejo. El problema que se me presenta cuando lo pienso es mostrar lo que tengo programado como mostré arriba.
¿Qué me aconsejan para hacer esto? Desde ya, muchísimas gracias por ayudarme. |
|
|
|

Lun Mar 17, 2008 9:13 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4060
Ubicación: Valladolid, España
|
|
|
|
|
| Esto se tiene que hacer muy sencillo con el módulo DateTime, para el cálculo de los tiempos, incrementándose de hora en hora. Con el módulo DBI, buscar en la base de datos. Y con alguno de las decenas de módulos de formateo, en la salida, hecho. |
|
Lun Mar 17, 2008 9:25 am
|
 |
zozo666
Perlero Frecuente

|
Registrado: 26 May 2007
Mensajes: 137
|
|
|
|
|
| Sí, eso es lo que estoy tratando de hacer, pero mi problema es la consulta y el mostrarlo; la consulta no la puedo hacer como para que me seleccione y me muestre ya todo como lo quiero. O sea, no se me ocurre cómo hacerlo. |
|
Lun Mar 17, 2008 10:01 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4060
Ubicación: Valladolid, España
|
|
|
|
|
Si sabes que los campos de Hora van de hora en hora, entonces te vale con que en la consulta preguntes hora por hora, con una igualdad. Lo metes todo en un doble bucle, para todas las horas de un día y para todos los días de la semana, y ya está.
Otra opción, desde luego, es hacer una sola consulta, para el periodo que va desde el primer día de la semana, hasta el último. Y luego, hacer un bucle por todos los resultados, almacenándolo y ordenándolos por horas y presentándolos en orden.
En caso de duda, puedes ir presentando el código que estás usando. |
|

Lun Mar 17, 2008 11:32 am
|
 |
zozo666
Perlero Frecuente

|
Registrado: 26 May 2007
Mensajes: 137
|
|
|
|
|
Esta buena la idea que me decís, pero no me queda bien en claro el resultado de la consulta; o sea: yo genero una consulta tal como me decís vos ¿no? pero los resultados que me da la consulta, ¿dónde los almaceno? O sea, si la consulta se hace tantas veces como días a la semana tendría que tener una variable que vaya acumulando los resultados ¿no? Capaz que no entendí bien...
Lo que tenía pensado también es crear una consulta que me de la hora, el día y el título de todos los eventos que estén en esta semana, pero lo que no sé es cómo mostrarlo, por que si los muestro en una lista con un <TMPL_LOOP> la primera forma que muestre yo que quería que quedaran no funcionarios, o sea me repetiría el horario.
| Código: |
14:00 Llamar a mama
14:00 Leer el diario
etc |
¿Cómo lo tendría que mostrar el array que me devuelve fetchall_arrayref({}) para que me quede como el ejemplo que di al principio del post? |
|

Lun Mar 17, 2008 2:50 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4060
Ubicación: Valladolid, España
|
|
|
|
|
Este es un ejemplo:
| Perl: | #!/usr/bin/perl
use DateTime;
use strict;
my @basededatos = (
{
Hora => '14:00:00',
Dia => '2008-03-18',
Titulo => 'Llamar a mama',
},
{
Hora => '14:00:00',
Dia => '2008-03-18',
Titulo => 'Leer el diario',
},
{
Hora => '14:00:00',
Dia => '2008-03-18',
Titulo => 'pagar Teléfono',
},
{
Hora => '15:00:00',
Dia => '2008-03-18',
Titulo => 'Tal cosa...',
},
);
# Fecha inicial
my $dt = DateTime-> new(
year => 2008,
month => 03,
day => 17,
);
# Para toda la semana
for my $d ( 1 .. 7 ) {
my $dia = $dt-> ymd; # aaaa-mm-dd
print "HORA\t\t$dia\n";
# Para todas las horas
for my $h ( 0 .. 23 ) {
my $hora = $dt-> hms; # hh:mm:ss
(my $horacorta) = $hora =~ /^ (..:.. )/; # hh:mm
my $hora_puesta; # flag
foreach my $evento ( @basededatos ) {
if ( $evento-> {Dia } eq $dia and $evento-> {Hora } eq $hora ) {
print $horacorta if not $hora_puesta++;
print "\t\t$evento->{Titulo}\n";
}
}
# Vemos la siguiente hora
$dt-> add( hours => 1 );
}
} |
sale:
| Código: |
HORA 2008-03-17
HORA 2008-03-18
14:00 Llamar a mama
Leer el diario
pagar Teléfono
15:00 Tal cosa...
HORA 2008-03-19
HORA 2008-03-20
HORA 2008-03-21
HORA 2008-03-22
HORA 2008-03-23 |
|
|

Mar Mar 18, 2008 9:30 am
|
 |
zozo666
Perlero Frecuente

|
Registrado: 26 May 2007
Mensajes: 137
|
|
|
|
|
Ahora ya tengo el código en el cual puedo mostrar todo el calendario de la semana. Lo muestro para que lo vean.
| Perl: | #! /usr/bin/perl -w
use CGI;
use DBI;
use Date:: Calc qw(:all );
use CGI:: Carp qw(fatalsToBrowser );
use HTML:: Template;
my $cgi = CGI-> new;
my $t = HTML:: Template-> new(filename => '../html/Template/prueba_tmpl.tmpl');
$t-> param(
Dia1 => "2008-03-16",
Dia2 => "2008-03-17",
Dia3 => "2008-03-18",
Dia4 => "2008-03-19",
Dia5 => "2008-03-20",
Dia6 => "2008-03-21",
Dia7 => "2008-03-22"
);
$t-> param(eventos => [
{ Hora => '14:00',
Dia1_Evento => [],
Dia2_Evento => [{ Dia2_idEvento => '256', Dia2_Titulo => 'Probando todo' }],
Dia3_Evento => [{ Dia3_idEvento => '256' , Dia3_Titulo => 'Probando todo' }],
Dia4_Evento => [{ Dia4_idEvento => '256' , Dia4_Titulo => 'Probando todo' }],
Dia5_Evento => [{ Dia5_idEvento => '256',Dia5_Titulo => 'Probando todo' }],
Dia6_Evento => [{ Dia6_idEvento => '256' , Dia6_Titulo => 'Probando todo' }],
Dia7_Evento => [{ Dia7_idEvento => '256', Dia7_Titulo => 'Probando todo' }],
},
{ Hora => '23:00',
Dia1_Evento => [
{ Dia1_idEvento => '256', Dia1_Titulo => 'Probando todo'},
{ Dia1_idEvento => '542', Dia1_Titulo => '2 en un dia'}
],
Dia2_Evento => [{ Dia2_idEvento => '256', Dia2_Titulo => 'Probando todo' }],
Dia3_Evento => [],
Dia4_Evento => [
{ Dia4_idEvento => '45' , Dia4_Titulo => 'Probando rep1' },
{ Dia4_idEvento => '254' , Dia4_Titulo => 'Probando rep2' },
{ Dia4_idEvento => '2556' , Dia4_Titulo => 'Probando rep3' },
{ Dia4_idEvento => '78' , Dia4_Titulo => 'Probando rep4' }
],
Dia5_Evento => [{ Dia5_idEvento => '256',Dia5_Titulo => 'Probando todo' }],
Dia6_Evento => [{ Dia6_idEvento => '256' , Dia6_Titulo => 'Probando todo' }],
Dia7_Evento => [{ Dia7_idEvento => '256', Dia7_Titulo => 'Probando todo' }],
},
],
);
print $cgi-> header;
print $t-> output; |
y esta es la plantilla:
| HTML: | <table border=0 cellpadding="0" cellspacing="2" >
<tr>
<th width="70px">HORA </th>
<TH width="110px">DOMINGO <br><TMPL_VAR name="Dia1"></TH>
<TH width="110px">LUNES <br><TMPL_VAR name="Dia2"></TH>
<TH width="110px">MARTES <br><TMPL_VAR name="Dia3"></TH>
<TH width="110px">MIERCOLES <br><TMPL_VAR name="Dia4"></TH>
<TH width="110px">JUEVES <br><TMPL_VAR name="Dia5"></TH>
<TH width="110px">VIERNES <br><TMPL_VAR name="Dia6"></TH>
<TH width="110px">SABADO <br><TMPL_VAR name="Dia7"></TH>
</tr>
<TMPL_LOOP name="eventos">
<TMPL_IF name="error">
<TMPL_VAR name="error">
<TMPL_ELSE>
<tr>
<td align="right" class=""><TMPL_VAR name="Hora"></TD>
<TMPL_IF name="Dia1_Evento">
<td width="90" class=""><TMPL_LOOP name="Dia1_Evento"><a href="javascript:mos(<TMPL_VAR name="Dia1_idEvento">)"><TMPL_VAR name="Dia1_Titulo"><br></a></TMPL_LOOP></TD>
<TMPL_ELSE>
<td width="90" bgcolor="#F7F7F7"></td>
</TMPL_IF>
<TMPL_IF name="Dia2_Evento">
<td width="90" class=""><TMPL_LOOP name="Dia2_Evento"><a href="javascript:mos(<TMPL_VAR name="Dia2_idEvento">)"> <TMPL_VAR name="Dia2_Titulo"><br></a></TMPL_LOOP></TD>
<TMPL_ELSE>
<td width="90" bgcolor="#F7F7F7"></td>
</TMPL_IF>
<TMPL_IF name="Dia3_Evento">
<td width="90" class=""><TMPL_LOOP name="Dia3_Evento"><a href="javascript:mos(<TMPL_VAR name="Dia3_idEvento">)"><TMPL_VAR name="Dia3_Titulo"><br></a></TMPL_LOOP></TD>
<TMPL_ELSE>
<td width="90" bgcolor="#F7F7F7"></td>
</TMPL_IF>
<TMPL_IF name="Dia4_Evento">
<td width="90" class=""><TMPL_LOOP name="Dia4_Evento"><a href="javascript:mos(<TMPL_VAR name="Dia4_idEvento">)"> <TMPL_VAR name="Dia4_Titulo"><br></a></TMPL_LOOP></TD>
<TMPL_ELSE>
<td width="90" bgcolor="#F7F7F7"></td>
</TMPL_IF>
<TMPL_IF name="Dia5_Evento">
<td width="90" class=""><TMPL_LOOP name="Dia5_Evento"><a href="javascript:mos(<TMPL_VAR name="Dia5_idEvento">)"><TMPL_VAR name="Dia5_Titulo"><br></a></TMPL_LOOP></TD>
<TMPL_ELSE>
<td width="90" bgcolor="#F7F7F7"></td>
</TMPL_IF>
<TMPL_IF name="Dia6_Evento">
<td width="90" class=""><TMPL_LOOP name="Dia6_Evento"><a href="javascript:mos(<TMPL_VAR name="Dia6_idEvento">)"> <TMPL_VAR name="Dia6_Titulo"><br></a></TMPL_LOOP></TD>
<TMPL_ELSE>
<td width="90" bgcolor="#F7F7F7"></td>
</TMPL_IF>
<TMPL_IF name="Dia7_Evento">
<td width="90" class=""><TMPL_LOOP name="Dia7_Evento"><a href="javascript:mos(<TMPL_VAR name="Dia7_idEvento">)"><TMPL_VAR name="Dia7_Titulo"><br></a></TMPL_LOOP></TD>
<TMPL_ELSE>
<td width="90" bgcolor="#F7F7F7"></td>
</TMPL_IF>
</tr>
</TMPL_IF>
</TMPL_LOOP>
</table> |
Ahora me falta algo importante para hacer esto, que sería la consulta a la base de datos, ¿hay alguna manera de crear una consulta para pasar el param como hice yo en el script?
La base de datos se llama Calendario y tiene un campo ID, otro HORA (datetime) y otro EVENTO.
¿De qué manera tendría que generar la consulta? Se puede generar la consulta para que me envíe los datos a la plantilla de la forma que ingresé "a mano" en el script?
Muchísimas gracias,  |
|

Mar Mar 18, 2008 10:21 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4060
Ubicación: Valladolid, España
|
|
|
|
|
| Obviamente, la solución pasa por crear las estructuras de datos de forma dinámica. |
|
Mar Mar 18, 2008 10:38 am
|
 |
zozo666
Perlero Frecuente

|
Registrado: 26 May 2007
Mensajes: 137
|
|
|
|
|
| explorer, ¿a qué te referís con, "de forma dinámica"? ¿Te referís a crear el código HTML dentro del cgi, o sea, armar el calendario con los datos dentro del cgi y luego pasarlo al TMPL? |
|
Mar Mar 18, 2008 10:55 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4060
Ubicación: Valladolid, España
|
|
|
|
|
En cuanto a la plantilla, utilizas correctamente las marcas de LOOP para presentar los eventos dentro de cada día, así que de la misma manera, puedes hacer un bucle igual para los días. Sería un bucle dentro de otro.
Y en cuanto a la estructura de datos que vas creando, todas las entradas del tipo Dia1_evento se pueden almacenar como elementos de un array, que a su vez almacenan arrays a hashes, como lo tienes ahora.
Para hacerlo, después de la consulta, vas guardando (quizás con un push), el registro devuelto por la consulta. |
|
Mar Mar 18, 2008 11:04 am
|
 |
zozo666
Perlero Frecuente

|
Registrado: 26 May 2007
Mensajes: 137
|
|
|
|
|
Ok, entonces si ya está aclarado que de esta forma se puede hacer, me voy a lanzar por ésta; ya me pongo a resolverlo; después te cuento cómo me fue.
Muchas gracias explorer  |
|
Mie Mar 19, 2008 1:20 pm
|
 |
zozo666
Perlero Frecuente

|
Registrado: 26 May 2007
Mensajes: 137
|
|
|
|
|
| Buenísimo: lo pude hacer funcionar. Anda bárbaro, muchas gracias explorer, por tu ayuda Adiosssss. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|