Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Rellenar un calendario de eventos

Estas en el tema de Rellenar un calendario de eventos en el foro de PHP en Foros del Web. Hola, Mi padre es el presidente de una comunidad de vecinos y en mis tiempos de aburrimiento decidí programarle un pequeño calendario de asistencia. Al ...
  #1 (permalink)  
Antiguo 31/01/2014, 05:42
 
Fecha de Ingreso: julio-2005
Mensajes: 310
Antigüedad: 16 años, 6 meses
Puntos: 36
Rellenar un calendario de eventos

Hola,

Mi padre es el presidente de una comunidad de vecinos y en mis tiempos de aburrimiento decidí programarle un pequeño calendario de asistencia.

Al diseñar la base de datos no tuve en cuenta algunas cosillas y ahora me topo con un gran inconveniente que no logro solucionar sin tener que deshacer todo el código programado.

Tengo la siguiente tabla:

TABLA_EVENTOS
- Nombre del evento
- Fecha de inicio
- Fecha de fin
- Número de asistentes

Y relleno un calendario:

Código PHP:
// Creo el calendario
for ($i 1$i <= date('t'strtotime($month)); $i++) {
            
$day_week date('N'strtotime($month '-' $i));
            
$calendar[$week][$day_week] = $i;
            if (
$day_week == 7)
                
$week++;
}


// Obtengo los eventos del mes
$eventos funcion_devuelve_array_de_eventos($mes);

// Relleno calendario con los eventos
        
foreach ($eventos as $evento) {
                foreach (
$calendar as $week => $days) {
                    for (
$i 1$i <= 7$i++) {
                        
// Si hay algún evento con fecha de inicio para el día que estamos iterando se añade al calendario
                        
if ($days[$i] == $evento->fecha_inicio) {
                            
$days[$i]->asistentes $evento->asistentes;                         
                            
$calendar[$week] = $days;
                        }
                    }
                }
            } 
El problema es que no tuve en cuenta que el evento tiene una fecha de inicio y una de fin. Es decir, si un evento empieza el 1 de julio y termina el 3 de julio en el calendario debe aparecer:

1 de julio -> Evento 1 | 30 asistentes
2 de julio -> Evento 1 | 30 asistentes
3 de julio -> Evento 1 | 30 asistentes

Pero sólo tengo en cuenta el primer día del evento en el código que he puesto, así que en mi calendario sólo aparece:
1 de julio -> Evento 1 | 30 asistentes

Tendría que haber hecho una fila en la base de datos por cada día, pero no lo tuve en cuenta. ¿Hay solución?

Gracias.
  #2 (permalink)  
Antiguo 31/01/2014, 06:22
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 13 años, 9 meses
Puntos: 326
Respuesta: Rellenar un calendario de eventos

Buenas, supongo que podrías modificar este bucle algo así:

Código PHP:
foreach ($eventos as $evento) {
                foreach (
$calendar as $week => $days) {
                    for (
$i 1$i <= 7$i++) {
                        
// Si hay algún evento con fecha de inicio para el día que estamos iterando se añade al calendario
                        
if ($days[$i] == $evento->fecha_inicio) {
                            
$days[$i]->asistentes $evento->asistentes;
                            for(
$j $i+1$days[$j] <= $evento->fecha_fin$j++) {
                               
$days[$j]->asistentes $evento->asistentes;
                            }

                            
$calendar[$week] = $days;
                        }
                    }
                }
            } 

Supongo que faltaria q controlaras tb que si se "pasa" de la semana, deberias aumentarla para seguir sumando ;)

PD: ¿Y q pasa si coinciden dos fechas?
__________________
>> Eleazan's Source
>> @Eleazan
  #3 (permalink)  
Antiguo 31/01/2014, 10:48
 
Fecha de Ingreso: julio-2005
Mensajes: 310
Antigüedad: 16 años, 6 meses
Puntos: 36
Respuesta: Rellenar un calendario de eventos

Cita:
Iniciado por Eleazan Ver Mensaje
Buenas, supongo que podrías modificar este bucle algo así:

Código PHP:
foreach ($eventos as $evento) {
                foreach (
$calendar as $week => $days) {
                    for (
$i 1$i <= 7$i++) {
                        
// Si hay algún evento con fecha de inicio para el día que estamos iterando se añade al calendario
                        
if ($days[$i] == $evento->fecha_inicio) {
                            
$days[$i]->asistentes $evento->asistentes;
                            for(
$j $i+1$days[$j] <= $evento->fecha_fin$j++) {
                               
$days[$j]->asistentes $evento->asistentes;
                            }

                            
$calendar[$week] = $days;
                        }
                    }
                }
            } 

Supongo que faltaria q controlaras tb que si se "pasa" de la semana, deberias aumentarla para seguir sumando ;)

PD: ¿Y q pasa si coinciden dos fechas?
Muchas gracias compañero. No termina de funcionar el código porque se desborda la memoria en algún lado pero tiene fácil solución que miraré luego con más calma.

Lo que más me preocupa son los límites ya que el calendario es mensual, obtengo todo los eventos del mes y en base a eso relleno el calendario, que tiene las fechas de un mes... El problema son las reservas que se hacen el día 31 de julio y duran, por ejemplo, 3 días. Ahí cogería días de agosto que no tendría en el calendario. Y lo mismo pasaría al visitar el mes de agosto, que habría reservas que comienzan en julio. Un desastre total por no haberlo pensando mejor antes.

A ver si se me ocurre algo esta noche mientras duermo. Si alguien tiene alguna sugerencia, aunque haya que partir desde un punto de vista diferente sin tener que modificar la base de datos bienvenido sea!

Gracias.
  #4 (permalink)  
Antiguo 01/02/2014, 07:40
 
Fecha de Ingreso: julio-2005
Mensajes: 310
Antigüedad: 16 años, 6 meses
Puntos: 36
Respuesta: Rellenar un calendario de eventos

¿Alguien tiene alguna idea? No se me ocurre nada :(
  #5 (permalink)  
Antiguo 01/02/2014, 15:10
 
Fecha de Ingreso: julio-2005
Mensajes: 310
Antigüedad: 16 años, 6 meses
Puntos: 36
Respuesta: Rellenar un calendario de eventos

He pensado este algoritmo, a ver que opináis:

Código PHP:
// El calendario es un array que contendrá la fecha para cada día del mes
$calendario enero;

foreach(
$calendario as $dia){
   
$eventos buscar_evento($dia);
   foreach(
$eventos as $evento){
         
$dia->asistentes += $evento->asistentes;
   }

La función buscar_eventos($dia) es una consulta mysql:
select * from EVENTOS when checkin <= $dia and checkout >= $dia

Mi único objetivo es conocer la suma total de asistentes de todos los eventos.

Ejemplo:

Evento 1
Fecha inicio: 28/02/14
Fecha fin: 02/03/14
Asistentes: 4

Evento 2:
Fecha inicio y fecha fin: 28/02/14
Asistentes: 3

Entonces el calendario mostraría:
Día 28/02 -> 3 + 4 = 7 asistentes
Día 01/03 -> 4 asistentes
Día 02/03 -> 4 asistentes

Es lo único que se me ocurre por ahora. ¿Me paso algo por alto? Todavía no lo he probado.

EDITO: Ya lo he implementado y a priori funciona bien.

Última edición por kiko's; 01/02/2014 a las 16:54

Etiquetas: calendario, eventos, fecha, rellenar, tabla
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




La zona horaria es GMT -6. Ahora son las 03:23.