Acabo de hacer un sistema de calendario para eventos en mi rato de aburrimiento espero que le sea útil a todos
Clase del Calendario y los Eventos
Código PHP:
Ver original<?php
class Calendario
{
private $fecha;
private $mes;
private $hoy;
private $w;
private $eventos = array();
public function __CONSTRUCT($fecha = 0)
{
// La fecha actual
$this->fecha = new DateTime
($fecha != 0 ?
$fecha : date('Y-m-d')); // La cantidad de dias del mes
$this->mes = $this->fecha->format('t');
// El dia de hoy
$this->hoy = $this->fecha->format('j');
// El valor numerico de la semana del primer dia del mes
$this->w = $this->fecha->modify('-' .($this->hoy-1). ' day')->format('w');
// Restamos para saber desde donde va a empezar a pintar, por ejemplo
// si comienza un miercoles, debe dejar 3 cuadros vacios atraz
$this->w = $this->w > 0 ? -$this->w+1 : 0;
}
public function setEvento(Evento $evento)
{
$this->eventos[] = $evento;
}
public function Pintar()
{
echo '<table class="calendario">';
echo '
<tr>
<th>Domingo</th>
<th>Lunes</th>
<th>Martes</th>
<th>Miercoles</th>
<th>Jueves</th>
<th>Viernes</th>
<th>Sabado</th>
<tr>
';
$i=0;
for($this->w;$this->w<=$this->mes;$this->w++)
{
echo ($i == 0) ? '<tr>' : '';
echo ($i%7 == 0 && $i > 0) ? '</tr><tr>' : '';
if($this->w<=0)
{
echo '<td></td>';
}else
{
echo '<td ' . ($this->hoy == $i ? 'class="hoy"' : '') . '>'; // Si el dia es hoy
// Pintamos el dia actual
echo '<span class="dia">' . $this->w . '</span>';
// Agregar los eventos
foreach($this->eventos as $e)
{
if($e->getFecha()->format('d')==$i)
{
echo '<div class="evento">';
echo '- <a href="#" class="asunto">' . $e->getAsunto() . '</a> ';
echo 'programado para las ' . $e->getHora() . ' por <b>' . $e->getCreador() . '</b>';
echo '</div>';
}
}
echo '</td>';
}
$i++;
}
echo '</table>';
}
}
class Evento
{
private $fecha;
private $hora;
private $creador;
private $asunto;
public function getFecha() { return $this->fecha; }
public function getHora() { return $this->hora; }
public function getCreador() { return $this->creador; }
public function getAsunto() { return $this->asunto; }
public function setFecha($x)
{
$this->fecha = new DateTime($x);
$this->hora = $this->fecha->format('h:ia');
}
public function setCreador($x) { $this->creador = $x; }
public function setAsunto($x) { $this->asunto = $x; }
}
Como seteamos eventos?
Código PHP:
Ver original<?php
// Instanciamos el calendario
$c = new Calendario('2013-04-16');
// Seteamos un evento
$e = new Evento();
$e->setFecha('2013-04-16 14:02:00');
$e->setCreador('HiToGoRoShi');
$e->setAsunto('Reunion en con nuestro cliente');
$c->setEvento($e);
// Seteamos otro evento
$e = new Evento();
$e->setFecha('2013-04-18 14:07:00');
$e->setCreador('Kenshin');
$e->setAsunto('Capacitacion en sistema');
$c->setEvento($e);
// Seteamos otro evento
$e = new Evento();
$e->setFecha('2013-04-18 14:15:00');
$e->setCreador('Raul');
$e->setAsunto('Reunion con los proveedores');
$c->setEvento($e);
// Seteamos otro evento
$e = new Evento();
$e->setFecha('2013-04-24 14:16:00');
$e->setCreador('Pepe');
$e->setAsunto('Cena con los empleados');
$c->setEvento($e);
Como lo pintamos?
Código PHP:
Ver original<!DOCTYPE html>
<html>
<head>
<title>Calendario de eventos creado por HiToGoRoShi</title>
<link href="calendario.css" rel="stylesheet" />
</head>
<body>
<h1>Calendario de eventos creado por HiToGoRoShi</h1>
<?php $c->Pintar(); ?>
</body>
</html>
Una hoja de estilo para que se vea algo mejor, guardarlo como calendario.css
Código CSS:
Ver original.calendario
{
width:100%;
font-family:arial;
border-spacing:0;
}
.calendario th
{
background:#356AA0;
color:white;
text-align:left;
height:30px;
line-height:30px;
}
.calendario td
{
width:14%;
}
.calendario td.hoy
{
background:#C3D9FF;
}
.calendario td span.dia
{
background:#eee;
width:20px;
padding:5px;
display:block;
text-align:center;
}
.calendario td.hoy span.dia
{
background:#356AA0;
color:white;
}
.calendario td div.evento
{
display:block;
padding:4px;
clear:both;
font-size:12px;
margin:2px;
background:#F9F7ED;
border:1px solid #d3d3d3;
}
.calendario td div.evento a
{
color:black;
text-decoration:none;
font-weight:bold;
}
Ya lo probre y funciona bien, creo que esta bien facil de entender y modificar .. mas bien la funcion Pintar() no deberia hacer el ECHO, sino devolver una cadena que tenga armado el calendario y recien cuando se invoque el metodo ahi hariamos el ECHO
Demo en linea http://kimsa-media.com/calendario/