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);
}
}
?>
hola buen dia me prodiras pasar todo el codigo de la agenda completo.
ReplyDeleteGracias
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.
ReplyDeleteSaludos