Saturday, March 27, 2010

Agenda mensual con calendario en PHP (y V)

Por último la clase Mes.
Las clases van contenidas unas dentro de otras a modo de "matrioska".
La clase Mes es la que conecta con la BD.
/* Clase Mes */
class Mes
{
    private $anyo;    
    private $mes;
    private $numDiasMes;
    private $numSemanasMes;
    private $semanas;

    
    /* Constructor */
    public function __construct($anyo, $mes)  
    {
        //Inicializo los miembros
        $this->setAnyo($anyo);
        $this->setMes($mes);
        $this->numDiasMes = Fechas::getFinMes($anyo,$mes);
        $this->crearSemanasMes();  
        $this->addEventos();
    }       
    
    /* Métodos de acceso */
    public function setAnyo($anyo) 
    {
        $this->anyo = $anyo;
    }

    public function getAnyo() 
    {
        return $this->anyo;
    }
    
    public function setMes($mes) 
    {
        $this->mes = $mes;
    }

    public function getMes() 
    {
        return $this->mes;
    }

    public function getNumDiasMes() 
    {
        return $this->numDiasMes;
    }

    public function getNumSemanasMes() 
    {
        return $this->numSemanasMes;
    }
   
    public function getSemanas() 
    {
        return $this->semanas;
    }
    
    /* Métodos */
    
    /* Genera las semanas de un mes */
    private function crearSemanasMes()
    {   
        /*Se inicializan las variables antes del bucle*/
        
        $i = 0;
        
        /*Dia en que nos encontramos al recorrer la agenda*/
        $diaActual = 1; //Se inicializa a 1
        
        /*Mientras no hayamos entrado en otro mes*/
        while( $diaActual <= $this->numDiasMes )
        {
            /*Se crean las semanas*/  
            $this->semanas[$i] = new Semana();
            
            $this->semanas[$i]->creaDiasSemana($diaActual, $this->anyo,
                                               $this->mes,$this->numDiasMes);
            
            $i = $i + 1;
        }  
        
        /*Se guarda el número de semanas del mes*/
        $this->numSemanasMes = $i;
       
    }
    
    /* Añade un evento a la agenda */
    public function addEvento($dia, $evento) 
    {
        $numSemanaIni = Fechas::getSemanaAnyo($this->anyo, $this->mes, 1);
        
        $numSemana = Fechas::getSemanaAnyo($this->anyo, $this->mes, $dia);
        
        //Si la primera semana del año es la 59
        if(53==$numSemanaIni)
        {
            $numSemanaIni = 0;
            
            //Si además el evento es esa semana
            if(53==$numSemana)
            {
                $numSemana = 0;    
            }
        }
        
        $indiceSemana = $numSemana - $numSemanaIni;
        
        $diaSemana = Fechas::getDiaSemana($this->anyo, $this->mes, $dia);
        
        $this->semanas[$indiceSemana]->setEvento($evento, $diaSemana);
    }
    
    /* Obtiene un evento de la agenda */
    public function getEvento($dia) 
    {
        $numSemanaIni = Fechas::getSemanaAnyo($this->anyo, $this->mes, 1);
    
        $numSemana = Fechas::getSemanaAnyo($this->anyo, $this->mes, $dia);
        
        //Si la primera semana del año es la 59
        if(53==$numSemanaIni)
        {
            $numSemanaIni = 0;
            
            //Si además el evento es esa semana
            if(53==$numSemana)
            {
                $numSemana = 0;    
            }
        }
        
        $indiceSemana = $numSemana - $numSemanaIni;
        
        $diaSemana = Fechas::getDiaSemana($this->anyo, $this->mes, $dia);           
        
        return $this->semanas[$indiceSemana]->getEvento($diaSemana);
    }
    
    /* Muestra un evento de la agenda */
    public function muestraEvento($dia) 
    {
        $numSemanaIni = Fechas::getSemanaAnyo($this->anyo, $this->mes, 1);
    
        $numSemana = Fechas::getSemanaAnyo($this->anyo, $this->mes, $dia);
        
        //Si la primera semana del año es la 59
        if(53==$numSemanaIni)
        {
            $numSemanaIni = 0;
            
            //Si además el evento es esa semana
            if(53==$numSemana)
            {
                $numSemana = 0;    
            }
        }
        
        $indiceSemana = $numSemana - $numSemanaIni;
        
        $diaSemana = Fechas::getDiaSemana($this->anyo, $this->mes, $dia);           
        
        $this->semanas[$indiceSemana]->muestraEvento($diaSemana);
    }
    
    /* Muestra el HTML de un mes */
    public function muestraCalendario()
    {   
        $nombreMeses = array('Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio',
                             'Agosto','Septiembre','Octubre','Noviembre','Diciembre');
        $nombreDias = array('Lun','Mar','Mie','Jue','Vie','Sab','Dom');                                  
        
        
        /*Se obtiene el nombre del mes*/
        $nombreMes = $nombreMeses[$this->mes - 1];
        
        
        /*Se colocan los botones*/
        printf("<table class=\"tablaBotones\"><tr><td>
                <input type=\"submit\" name=\"restaMes\" value=\"<<\" onClick=\"verMesAnterior()\">
                </td><td class=\"caption_text\">%s %d</td><td>
                <input type=\"submit\" name=\"sumaMes\" value=\">>\" onClick=\"verMesSiguiente()\">
                </td></tr><table>\n", $nombreMes, $this->anyo);
                
        /*Se abre la tabla*/
        printf("<table>\n");
        
        /*Se abre el cuerpo de la tabla*/ /*Se abre la tabla*/
        printf("<tbody>\n");
        /*Se crea la primera fila de la tabla*/
        printf("<tr>\n");
        
        /*La primera casilla va vacía*/
        printf("<th class=\"dia\"></th>\n");
        
        /*Se generan las casilla de los días de la semana*/
        for($i=0;$i<7;$i++)
        {   
           /*Se escribe en el HTML el texto del día de la semana */
           printf("<th class=\"dia\"> %s </th>\n", $nombreDias[$i]);     
        }
     
        printf("</tr>\n");

        /* Semanas */
        $this->muestraSemanas();
        
        /*Se cierra el cuerpo de la tabla*/
        printf("</tbody>\n");
        
        /*Se cierra la tabla*/
        printf("</table>\n");

    }
    
    /* Genera el HTML de todas las semanas del mes */
    public function muestraSemanas()
    {
        foreach($this->semanas as $semana)
        {
            $semana->muestraSemana();
        }
    }
    
    /* Añade al calendario del mes los eventos que están en la BD */
    public function addEventos()
    {
        require_once 'login.php';
        
        //Se intenta conectar con la BD
        $db_server = mysql_connect($db_hostname,$db_username,$db_password);
                
        //Si ha habido errores se aborta y se informa al usuario
        if(!$db_server)
        {
            die( "No se pudo conectar con MySQL: " . mysql_error() );
        }
        
        mysql_select_db($db_database)
            or die( "No se pudo selecionar la BD: " . mysql_error() );
        
        //Consulta SQL
        $query = "select id_evento, nombre, DATE_FORMAT(fecha_hora,'%d-%m-%y'),
                  TIME_FORMAT(fecha_hora,'%H:%k'), descripcion, lugar, DAY(fecha_hora)
                  from calendariov where MONTH(fecha_hora) = '$this->mes'
                  and YEAR(fecha_hora) = '$this->anyo'";
        
        $result = mysql_query($query);

        //Si hubo fallos se informa al usuario
        if(!$result)
        {
            die("Fallo en el acceso a la BD: " . mysql_error());
        }

        //Si todo fue bien
        $numEventos = mysql_num_rows($result);

        for($j = 0;$j < $numEventos; ++$j)
        {
            $row = mysql_fetch_row($result);
                      
            //Se inserta el evento en el calendario
            $this->addEvento( (int) $row[6], new Evento($row[0], $row[1], $row[2], 
                                                        $row[3], $row[4], $row[5]));
        }

        mysql_close($db_server);

    }
            
}  

?>     

2 comments:

  1. hola buen dia me prodiras pasar todo el codigo de la agenda completo.

    Gracias

    ReplyDelete
  2. Lo siento, estaba en un ordenador que pasó a mejor vida. Lo único que me queda de ese cósigo es lo que publiqué aquí. Usa lo que te sirva.
    Saludos

    ReplyDelete