Foros del Web » Programando para Internet » PHP »

Aporte de calendario para eventos

Estas en el tema de Aporte de calendario para eventos en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 16/04/2013, 09:55
Avatar de HiToGoRoShi  
Fecha de Ingreso: abril-2008
Mensajes: 849
Antigüedad: 16 años
Puntos: 31
Aporte de calendario para eventos

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
  1. <?php
  2. class Calendario
  3. {
  4.     private $fecha;
  5.     private $mes;
  6.     private $hoy;
  7.     private $w;
  8.     private $eventos = array();
  9.    
  10.     public function __CONSTRUCT($fecha = 0)
  11.     {
  12.         // La fecha actual
  13.         $this->fecha = new DateTime($fecha != 0 ? $fecha : date('Y-m-d'));
  14.         // La cantidad de dias del mes
  15.         $this->mes = $this->fecha->format('t');
  16.         // El dia de hoy
  17.         $this->hoy = $this->fecha->format('j');
  18.         // El valor numerico de la semana del primer dia del mes
  19.         $this->w = $this->fecha->modify('-' .($this->hoy-1). ' day')->format('w');
  20.         // Restamos para saber desde donde va a empezar a pintar, por ejemplo
  21.         // si comienza un miercoles, debe dejar 3 cuadros vacios atraz
  22.         $this->w = $this->w > 0 ? -$this->w+1 : 0;
  23.     }
  24.     public function setEvento(Evento $evento)
  25.     {
  26.         $this->eventos[] = $evento;
  27.     }
  28.     public function Pintar()
  29.     {
  30.         echo '<table class="calendario">';
  31.         echo '
  32.             <tr>
  33.                 <th>Domingo</th>
  34.                 <th>Lunes</th>
  35.                 <th>Martes</th>
  36.                 <th>Miercoles</th>
  37.                 <th>Jueves</th>
  38.                 <th>Viernes</th>
  39.                 <th>Sabado</th>
  40.             <tr>
  41.         ';
  42.         $i=0;
  43.         for($this->w;$this->w<=$this->mes;$this->w++)
  44.         {
  45.             echo ($i == 0) ? '<tr>' : '';
  46.             echo ($i%7 == 0 && $i > 0) ? '</tr><tr>' : '';
  47.            
  48.             if($this->w<=0)
  49.             {
  50.                 echo '<td></td>';
  51.             }else
  52.             {
  53.                 echo '<td ' . ($this->hoy == $i ? 'class="hoy"' : '') . '>'; // Si el dia es hoy
  54.                 // Pintamos el dia actual
  55.                 echo '<span class="dia">' . $this->w . '</span>';
  56.                 // Agregar los eventos
  57.                 foreach($this->eventos as $e)
  58.                 {
  59.                     if($e->getFecha()->format('d')==$i)
  60.                     {
  61.                         echo '<div class="evento">';
  62.                         echo '- <a href="#" class="asunto">' . $e->getAsunto() .  '</a> ';
  63.                         echo 'programado para las ' . $e->getHora() . ' por <b>' . $e->getCreador() . '</b>';
  64.                         echo '</div>';                 
  65.                     }
  66.                 }
  67.                 echo '</td>';
  68.             }
  69.             $i++;
  70.         }
  71.         echo '</table>';
  72.     }
  73. }
  74.  
  75.  
  76. class Evento
  77. {
  78.     private $fecha;
  79.     private $hora;
  80.     private $creador;
  81.     private $asunto;
  82.    
  83.     public function getFecha() { return $this->fecha; }
  84.     public function getHora() { return $this->hora; }
  85.     public function getCreador() { return $this->creador; }
  86.     public function getAsunto() { return $this->asunto; }
  87.     public function setFecha($x)
  88.     {
  89.         $this->fecha = new DateTime($x);
  90.         $this->hora = $this->fecha->format('h:ia');
  91.     }
  92.     public function setCreador($x) { $this->creador = $x; }
  93.     public function setAsunto($x) { $this->asunto = $x; }
  94. }

Como seteamos eventos?
Código PHP:
Ver original
  1. <?php
  2. // Instanciamos el calendario
  3. $c = new Calendario('2013-04-16');
  4.  
  5. // Seteamos un evento
  6. $e = new Evento();
  7. $e->setFecha('2013-04-16 14:02:00');
  8. $e->setCreador('HiToGoRoShi');
  9. $e->setAsunto('Reunion en con nuestro cliente');
  10.  
  11. $c->setEvento($e);
  12.  
  13. // Seteamos otro evento
  14. $e = new Evento();
  15. $e->setFecha('2013-04-18 14:07:00');
  16. $e->setCreador('Kenshin');
  17. $e->setAsunto('Capacitacion en sistema');
  18.  
  19. $c->setEvento($e);
  20.  
  21. // Seteamos otro evento
  22. $e = new Evento();
  23. $e->setFecha('2013-04-18 14:15:00');
  24. $e->setCreador('Raul');
  25. $e->setAsunto('Reunion con los proveedores');
  26.  
  27. $c->setEvento($e);
  28.  
  29. // Seteamos otro evento
  30. $e = new Evento();
  31. $e->setFecha('2013-04-24 14:16:00');
  32. $e->setCreador('Pepe');
  33. $e->setAsunto('Cena con los empleados');
  34.  
  35. $c->setEvento($e);

Como lo pintamos?
Código PHP:
Ver original
  1. <!DOCTYPE html>
  2. <html>
  3.     <head>
  4.         <title>Calendario de eventos creado por HiToGoRoShi</title>
  5.         <link href="calendario.css" rel="stylesheet" />
  6.     </head>
  7. <body>
  8.     <h1>Calendario de eventos creado por HiToGoRoShi</h1>
  9.     <?php $c->Pintar(); ?>
  10. </body>
  11. </html>

Una hoja de estilo para que se vea algo mejor, guardarlo como calendario.css
Código CSS:
Ver original
  1. .calendario
  2. {
  3.     width:100%;
  4.     font-family:arial;
  5.     border-spacing:0;
  6. }
  7. .calendario th
  8. {
  9.     background:#356AA0;
  10.     color:white;
  11.     text-align:left;
  12.     height:30px;
  13.     line-height:30px;
  14. }
  15. .calendario td
  16. {
  17.     width:14%;
  18. }
  19. .calendario td.hoy
  20. {
  21.     background:#C3D9FF;
  22. }
  23. .calendario td span.dia
  24. {
  25.     background:#eee;
  26.     width:20px;
  27.     padding:5px;
  28.     display:block;
  29.     text-align:center;
  30. }
  31. .calendario td.hoy span.dia
  32. {
  33.     background:#356AA0;
  34.     color:white;
  35. }
  36. .calendario td div.evento
  37. {
  38.     display:block;
  39.     padding:4px;
  40.     clear:both;
  41.     font-size:12px;
  42.     margin:2px;
  43.     background:#F9F7ED;
  44.     border:1px solid #d3d3d3;
  45. }
  46. .calendario td div.evento a
  47. {
  48.     color:black;
  49.     text-decoration:none;
  50.     font-weight:bold;
  51. }

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/

Última edición por HiToGoRoShi; 16/04/2013 a las 12:02
  #2 (permalink)  
Antiguo 16/04/2013, 12:03
Avatar de HiToGoRoShi  
Fecha de Ingreso: abril-2008
Mensajes: 849
Antigüedad: 16 años
Puntos: 31
Respuesta: Aporte de calendario para eventos

Post actualizado, termine la publicación ya pueden verlo cualquier duda consulta respondo acá dependiendo de la participación me animo hacer mas utilidades
  #3 (permalink)  
Antiguo 16/04/2013, 14:18
 
Fecha de Ingreso: abril-2008
Ubicación: El Salvador
Mensajes: 736
Antigüedad: 16 años
Puntos: 47
Respuesta: Aporte de calendario para eventos

Cómo sería para poder navegar los diferentes meses del año??? Y no limitar el calendario a un solo mes y poder tener todo el año calendarizado??
  #4 (permalink)  
Antiguo 16/04/2013, 15:16
Avatar de HiToGoRoShi  
Fecha de Ingreso: abril-2008
Mensajes: 849
Antigüedad: 16 años
Puntos: 31
Respuesta: Aporte de calendario para eventos

Cita:
Iniciado por alex1084 Ver Mensaje
Cómo sería para poder navegar los diferentes meses del año??? Y no limitar el calendario a un solo mes y poder tener todo el año calendarizado??
Esto hace funcionar todo

Código PHP:
Ver original
  1. $c = new Calendario('2013-04-16');

Ahí pon la fecha con la que quieres trabajar, y si quieres navegar por los diferentes meses del año crea dos enlaces uno que te lleve al mes anterior, y otro al mes posterior, y que esta variable reciba el constructor del calendario

Código HTML:
Ver original
  1. <a href='index.php?f=2013-03'>Anterior</a>
  2. <a href='index.php?f=2013-04'>Siguiente</a>
  3.  
  4. $c = new Calendario($_GET['f']);
  #5 (permalink)  
Antiguo 16/04/2013, 16:41
 
Fecha de Ingreso: abril-2008
Ubicación: El Salvador
Mensajes: 736
Antigüedad: 16 años
Puntos: 47
Respuesta: Aporte de calendario para eventos

aja pero y para cargar dinámicamente los eventos??
De la forma en que está planteado todo es estático de que forma podría hacerse eso dinámico?? incluso las generaciones de los meses
  #6 (permalink)  
Antiguo 17/04/2013, 15:23
Avatar de HiToGoRoShi  
Fecha de Ingreso: abril-2008
Mensajes: 849
Antigüedad: 16 años
Puntos: 31
Respuesta: Aporte de calendario para eventos

Ya esta modificado, vuelvo adjuntar todo el código en un solo archivo para que lo puedan usar ..

Al ingresar una fecha al calendario solo ingresar el año y el mes, el formato debe ser este 2013-04 Y-m

Código PHP:
Ver original
  1. <?php
  2. class Calendario
  3. {
  4.     private $fecha;
  5.     private $mes;
  6.     private $hoy;
  7.     private $w;
  8.     private $eventos = array();
  9.    
  10.     public function __CONSTRUCT($fecha = null)
  11.     {
  12.         // La fecha ingresada
  13.         $this->fecha = new DateTime($fecha);
  14.         // La cantidad de dias del mes
  15.         $this->mes = $this->fecha->format('t');
  16.         // La fecha de hoy
  17.         $this->hoy = new DateTime(date('ymd'));
  18.         // El valor numerico de la semana del primer dia del mes
  19.         $this->w = $this->fecha->format('w');
  20.         // Restamos para saber desde donde va a empezar a pintar, por ejemplo
  21.         // si comienza un miercoles, debe dejar 3 cuadros vacios atraz
  22.         $this->w = $this->w > 0 ? -$this->w + 1 : 0;
  23.     }
  24.     public function setEvento(Evento $evento)
  25.     {
  26.         $this->eventos[] = $evento;
  27.     }
  28.     public function Pintar()
  29.     {
  30.         // Clonamos el objeto DateTime para ser modificado
  31.         $fecha_navegacion = clone $this->fecha;
  32.         // Un mes atraz
  33.         echo '<a href="?f=' . $fecha_navegacion->modify('-1 month')->format('Y-m') . '">' . $fecha_navegacion->format('Y F') . '</a> - ';
  34.         // Un mes adelante  
  35.         echo '<a href="?f=' . $fecha_navegacion->modify('+2 month')->format('Y-m') . '">' . $fecha_navegacion->format('Y F') . '</a>';
  36.        
  37.         // Armamos el calendario
  38.         echo '<table class="calendario">';
  39.         echo '
  40.             <tr>
  41.                 <th class="mes" colspan="7">' . ($this->fecha->format('F')) . '</th>
  42.             </tr>
  43.             <tr>
  44.                 <th>Domingo</th>
  45.                 <th>Lunes</th>
  46.                 <th>Martes</th>
  47.                 <th>Miercoles</th>
  48.                 <th>Jueves</th>
  49.                 <th>Viernes</th>
  50.                 <th>Sabado</th>
  51.             </tr>
  52.         ';
  53.         // Con esto sabemos cuando hacer un TR
  54.         $i=0;
  55.         for($this->w;$this->w<=$this->mes;$this->w++)
  56.         {
  57.             echo ($i == 0) ? '<tr>' : '';
  58.             echo ($i%7 == 0 && $i > 0) ? '</tr><tr>' : '';
  59.            
  60.             if($this->w<=0)
  61.             {
  62.                 echo '<td></td>';
  63.             }else
  64.             {
  65.                 echo '<td ' . ($this->hoy->format('ymj') == $this->fecha->format('ym') . $this->w ? 'class="hoy"' : '') . '>'; // Si el dia es hoy
  66.                 // Pintamos el dia actual
  67.                 echo '<span class="dia">' . $this->w . '</span>';
  68.                 // Agregar los eventos
  69.                 foreach($this->eventos as $e)
  70.                 {
  71.                     if($e->getFecha()->format('ymj') == $this->fecha->format('ym') . $this->w)
  72.                     {
  73.                         echo '<div class="evento">';
  74.                         echo '- <a href="#" class="asunto">' . $e->getAsunto() .  '</a> ';
  75.                         echo 'programado para las ' . $e->getHora() . ' por <b>' . $e->getCreador() . '</b>';
  76.                         echo '</div>';                 
  77.                     }
  78.                 }
  79.                 echo '</td>';
  80.             }
  81.             $i++;
  82.         }
  83.         echo '</table>';
  84.     }
  85. }
  86.  
  87. class Evento
  88. {
  89.     private $fecha;
  90.     private $hora;
  91.     private $creador;
  92.     private $asunto;
  93.    
  94.     public function getFecha() { return $this->fecha; }
  95.     public function getHora() { return $this->hora; }
  96.     public function getCreador() { return $this->creador; }
  97.     public function getAsunto() { return $this->asunto; }
  98.     public function setFecha($x)
  99.     {
  100.         $this->fecha = new DateTime($x);
  101.         $this->hora = $this->fecha->format('h:ia');
  102.     }
  103.     public function setCreador($x) { $this->creador = $x; }
  104.     public function setAsunto($x) { $this->asunto = $x; }
  105. }
  106.  
  107. // Instanciamos el calendario
  108. $c = new Calendario(isset($_GET['f']) ? $_GET['f'] : date('Y-m'));
  109.  
  110. // Seteamos un evento
  111. $e = new Evento();
  112. $e->setFecha('2013-04-16 14:02:00');
  113. $e->setCreador('HiToGoRoShi');
  114. $e->setAsunto('Reunion en con nuestro cliente');
  115.  
  116. $c->setEvento($e);
  117.  
  118. // Seteamos otro evento
  119. $e = new Evento();
  120. $e->setFecha('2013-04-18 14:07:00');
  121. $e->setCreador('Kenshin');
  122. $e->setAsunto('Capacitacion en sistema');
  123.  
  124. $c->setEvento($e);
  125.  
  126. // Seteamos otro evento
  127. $e = new Evento();
  128. $e->setFecha('2013-04-18 14:15:00');
  129. $e->setCreador('Raul');
  130. $e->setAsunto('Reunion con los proveedores');
  131.  
  132. $c->setEvento($e);
  133.  
  134. // Seteamos otro evento
  135. $e = new Evento();
  136. $e->setFecha('2013-04-24 14:16:00');
  137. $e->setCreador('Pepe');
  138. $e->setAsunto('Cena con los empleados');
  139.  
  140. $c->setEvento($e);
  141.  
  142. // Seteamos otro evento
  143. $e = new Evento();
  144. $e->setFecha('2013-05-17 14:16:00');
  145. $e->setCreador('Pepe');
  146. $e->setAsunto('Cena con los empleados');
  147.  
  148. $c->setEvento($e);
  149.  
  150. ?>
  151.  
  152. <!DOCTYPE html>
  153. <html>
  154.     <head>
  155.         <title>Calendario de eventos creado por HiToGoRoShi</title>
  156.         <link href="calendario.css" rel="stylesheet" />
  157.     </head>
  158. <body>
  159.     <h1>Calendario de eventos creado por HiToGoRoShi</h1>
  160.     <?php $c->Pintar(); ?>
  161. </body>
  162. </html>

El ejemplo en linea lo vemos acá
http://kimsa-media.com/calendario/

Me gustaría poder modificar el primer tema para no traer confusiones

Etiquetas: calendario, eventos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 4 personas




La zona horaria es GMT -6. Ahora son las 17:00.