• Publicidad

Creación de un calendario con Perl

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Creación de un calendario con Perl

Notapor zozo666 » 2008-03-17 09:45 @447

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: Seleccionar todo
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.
zozo666
Perlero nuevo
Perlero nuevo
 
Mensajes: 139
Registrado: 2007-05-26 10:36 @483

Publicidad

Notapor explorer » 2008-03-17 10:13 @467

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor zozo666 » 2008-03-17 10:25 @475

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.
zozo666
Perlero nuevo
Perlero nuevo
 
Mensajes: 139
Registrado: 2007-05-26 10:36 @483

Notapor explorer » 2008-03-17 11:01 @500

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor zozo666 » 2008-03-17 12:32 @564

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: Seleccionar todo
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?
zozo666
Perlero nuevo
Perlero nuevo
 
Mensajes: 139
Registrado: 2007-05-26 10:36 @483

Notapor explorer » 2008-03-17 15:50 @701

Este es un ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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 );
    }
}
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


sale:
Código: Seleccionar todo
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
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor zozo666 » 2008-03-18 10:30 @479

Ahora ya tengo el código en el cual puedo mostrar todo el calendario de la semana. Lo muestro para que lo vean.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#! /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;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


y esta es la plantilla:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. <table border=0 cellpadding="0" cellspacing="2" > 
  2. <tr> 
  3. <th width="70px">HORA</th> 
  4. <TH width="110px">DOMINGO<br><TMPL_VAR name="Dia1"></TH> 
  5. <TH width="110px">LUNES<br><TMPL_VAR name="Dia2"></TH> 
  6. <TH width="110px">MARTES<br><TMPL_VAR name="Dia3"></TH> 
  7. <TH width="110px">MIERCOLES<br><TMPL_VAR name="Dia4"></TH> 
  8. <TH width="110px">JUEVES<br><TMPL_VAR name="Dia5"></TH> 
  9. <TH width="110px">VIERNES<br><TMPL_VAR name="Dia6"></TH> 
  10. <TH width="110px">SABADO<br><TMPL_VAR name="Dia7"></TH> 
  11. </tr> 
  12.  
  13. <TMPL_LOOP name="eventos"> 
  14. <TMPL_IF name="error"> 
  15. <TMPL_VAR name="error"> 
  16. <TMPL_ELSE> 
  17. <tr> 
  18. <td align="right" class=""><TMPL_VAR name="Hora"></TD> 
  19. <TMPL_IF name="Dia1_Evento"> 
  20. <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> 
  21. <TMPL_ELSE> 
  22. <td width="90" bgcolor="#F7F7F7"></td> 
  23. </TMPL_IF> 
  24. <TMPL_IF name="Dia2_Evento"> 
  25. <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> 
  26. <TMPL_ELSE> 
  27. <td width="90" bgcolor="#F7F7F7"></td> 
  28. </TMPL_IF> 
  29. <TMPL_IF name="Dia3_Evento"> 
  30. <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> 
  31. <TMPL_ELSE> 
  32. <td width="90" bgcolor="#F7F7F7"></td> 
  33. </TMPL_IF> 
  34. <TMPL_IF name="Dia4_Evento"> 
  35. <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> 
  36. <TMPL_ELSE> 
  37. <td width="90" bgcolor="#F7F7F7"></td> 
  38. </TMPL_IF> 
  39. <TMPL_IF name="Dia5_Evento"> 
  40. <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> 
  41. <TMPL_ELSE> 
  42. <td width="90" bgcolor="#F7F7F7"></td> 
  43. </TMPL_IF> 
  44. <TMPL_IF name="Dia6_Evento"> 
  45. <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> 
  46. <TMPL_ELSE> 
  47. <td width="90" bgcolor="#F7F7F7"></td> 
  48. </TMPL_IF> 
  49. <TMPL_IF name="Dia7_Evento"> 
  50. <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> 
  51. <TMPL_ELSE> 
  52. <td width="90" bgcolor="#F7F7F7"></td> 
  53. </TMPL_IF> 
  54. </tr>  
  55. </TMPL_IF> 
  56. </TMPL_LOOP> 
  57. </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, :D
zozo666
Perlero nuevo
Perlero nuevo
 
Mensajes: 139
Registrado: 2007-05-26 10:36 @483

Notapor explorer » 2008-03-18 11:21 @514

Obviamente, la solución pasa por crear las estructuras de datos de forma dinámica.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor zozo666 » 2008-03-18 11:38 @526

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?
zozo666
Perlero nuevo
Perlero nuevo
 
Mensajes: 139
Registrado: 2007-05-26 10:36 @483

Notapor explorer » 2008-03-18 11:55 @538

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 27 invitados