entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Calendario PHP con conexión a base de datos MySQL

Necesito crear un calendario PHP con conexión a base de datos MySQL, similar a un google calendar pero nativo para mi web, sin necesidad de que el usuario haga login en su calendario de google en ningún momento. Simplemente con el login de nuestra app web ya tendrá acceso a un calendario propio, los eventos se irán rescatando de diferentes tablas de la base de datos. Algo similar a esto:

http://imgur.com/apB4SwP

La aplicación es una aplicación de gestión de equipos deportivos donde se introducen sesiones de entrenamientos, partidos, etc. por lo que los eventos del calendario muchos de ellos se capturan directamente de la introducción de dichas sesiones, partidos, etc.

Alguien tiene alguna idea "genial"?

Jejejeje

Sé que sí porque aquí todos son la ostia! ;-P

0voto

chinorris comentado

Hola me parece super útil para un proyecto que estoy haciendo y me gustaria saber como podría hacer que se pudiesen añadir 2 o más eventos a un mismo día con el calendario que pusiste. y como mostrar más meses o poner botones para ir saltando de mes en mes.

Un saludo y muchas gracias por los aportes anteriores.!!!

0voto

Peter comentado

@chinorris no se a quien le querías comentar eso, pero lo pusiste como una respuesta a la pregunta y claramente no es una respuesta. Si tienes una duda similar, por favor abre una pregunta nueva.

En ella detallas tu proyecto, pones el código que tienes, que problema te da, etc... Y ahí recibes ayuda.

Saludos.

3 Respuestas

2votos

white Puntos75880

Para marcar el día del mes con un dato de la base de datos, guarda los dias de los eventos en un vector.

aca te dejo un código de ejemplo:


la tabla podria ser esta:

CREATE TABLE IF NOT EXISTS `calendar_events` (
`id` int(11) NOT NULL,
  `descripcion` varchar(255) NOT NULL,
  `fecha_inicio` datetime NOT NULL,
  `fecha_fin` datetime NOT NULL,
  `cod_equipo` int(11) NOT NULL
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

INSERT INTO `calendar_events` (`id`, `descripcion`, `fecha_inicio`, `fecha_fin`, `cod_equipo`) VALUES
(1, 'hello world', '2015-02-19 08:00:00', '2015-02-19 23:00:00', 1),
(2, 'lorem ipsum dolor sit amet', '2015-02-25 12:15:00', '2015-02-25 21:30:00', 1),
(3, 'otro evento cualquiera', '2015-02-14 09:00:00', '2015-02-14 12:00:00', 1),
(4, 'nombre evento', '2015-02-19 07:00:00', '2015-02-19 08:00:00', 1);

el codigo en php:

<!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Calendario</title>
        <link href='http://fonts.googleapis.com/css?family=Lato' rel='stylesheet' type='text/css'>
        <style type="text/css">body{margin:0;font-family:Lato;}ul,li{list-style-type:none;margin:0;padding:0;}.calendar{padding:30px;}.calendar .day{background:#ecf0f1;border-bottom:2px solid #bdc3c7;float:left;margin:3px;position:relative;height:120px;width:120px;}.day.marked{background:#3498db;border-color:#2980b9;}.day .day-number{color:#7f8c8d;left:5px;position:absolute;top:5px;}.day.marked .day-number{color:white;}.day .events{color:white;margin:29px 7px 7px;height:78px;overflow-x:hidden;overflow-y:hidden;}.day .events h5{margin:0 0 5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%;}.day .events strong,.day .events span{display:block;font-size:11px;}.day .events ul{}.day .events li{}</style>
    </head>
    <body>
    <div class="calendar">
    <?php

        $mysqli = new mysqli('localhost', 'root', 'tupassword', 'basededatos');

        if ( $mysqli->connect_errno )
        {
            die( $mysqli->mysqli_connect_error() );
        }

        $result = $mysqli->query('SELECT * FROM calendar_events');

        if( !$result )
            die( $mysqli->error );

        $events = array();

        while($row = $result->fetch_assoc())
        {
            $start_date = new DateTime($row['fecha_inicio']);
            $end_date = new DateTime($row['fecha_fin']);
            $day = $start_date->format('j');

            $events[$day][] = array(
                'start_hour' => $start_date->format('G:i a'),
                'end_hour' => $end_date->format('G:i a'),
                'team_code' => $row['cod_equipo'],
                'description' => $row['descripcion']
            );
        }

        $datetime = new DateTime();

        // mes en texto
        $txt_months = array(
            'Enero', 'Febrero', 'Marzo',
            'Abril', 'Mayo', 'Junio',
            'Julio', 'Agosto', 'septiembre',
            'Octubre', 'Noviembre', 'Diciembre'
        );

        $month_txt = $txt_months[$datetime->format('n')-1];

        // ultimo dia del mes
        $month_days = date('j', strtotime("last day of"));

        echo '<h1>' . $month_txt . '</h1>';

        foreach(range(1, $month_days) as $day)
        {
            $marked = false;
            $events_list = array();

            foreach($events as $event_day => $event)
            {
                // si el dia del evento coincide lo marcamos y guardamos la informacion
                if($event_day == $day)
                {
                    $marked = true;
                    $events_list = $event;
                    break;
                }
            }

            echo '
            <div class="day' . ($marked ? ' marked' : '') . '">
                <strong class="day-number">' . $day . '</strong>
                <div class="events"><ul>';

                    foreach($events_list as $event)
                    {
                        echo '<li>
                            <h5>' . $event['description'] . '</h5>
                            <div>
                                <strong>Inicio:</strong>
                                <span>' . $event['start_hour'] . '</span>
                            </div>

                            <div>
                                <strong>Fin:</strong>
                                <span>' . $event['end_hour'] . '</span>
                            </div>
                        </li>';
                    }

                echo '</ul></div>
            </div>';
        }
        ?>
    </div>
    </body>
    </html>

el resultado tendria que ser el siguiente:

https://jsfiddle.net/ekbdt423/embedded/result/


saludos!

1voto

ankeorum comentado

White muchas gracias por eso, entiendo la carga de eventos desde la base de datos pero como haces para que puedas hacer click en un día y asociarle un evento a ese día a la hora que tú quieras?

2votos

white comentado

En el bucle guarda el dia y el mes en un link para tener el mes y el dia de referencia.

<a href="?guardar-evento&dia=2&mes=2">agregar evento</a>

aca te dejo el ejemplo:

demo: http://jsfiddle.net/eb6qm729/embedded/result/
archivos: https://db.tt/SfHLxZLv

si tienes mas dudas puedes abrir una nueva pregunta.

saludos!

0voto

Luis_tor comentado

Hola que tal, este calendario me ha sido de mucha ayuda, podrías indicarme como hiciste la conexión y las tablas de tu base de datos?
Gracias

0voto

juan014-23 comentado

una duda cuando yo hago en inicio de fecha del día miércoles 10/02/2016 hora a las 12.00pm y finalista el miércoles a las 1:00pm 10/02/2016 okey y cuando yo porgan ese evento ese día que fue en febrero me aparecerá el mes de marzo lo mismo que indique febrero hora de inicio y finalizar yo en febrero así sucesivamente para los mese que venga haga esta pregunta porque estoy buscando algo parecido como esto es para ser la parrila de la radio que haga el calendario de la programación y esta otra parte aquí le dejo una foto y un puglin de wordpress se publica el día la hora que inicia y se quita la hora que finaliza tiene foto nombre del programa nombre del moderador del programa red social y una descripción a adicional este es el puglin ; enter image description here

y esta la dirección; enter link description here

0voto

miguel comentado

White, no me muestra el boton para cargar eventos nuevos. Que podria estar pasando. El codigo funciona todo, solo tuve que modificar el acceso a la BD. Por favor, ayuda!

0voto

germanspellman comentado

Hola White, podrías subir nuevamente los archivos del ejemplo calendario para descargar. Gracias!

1voto

white Puntos75880

Tienes en mente crear uno desde cero o deseas usar una librería? existen varias como por ejemplo:

http://phpeventcalendar.com/category/docs/
http://phpeventcalendar.com/eventcalendar/docs/api_b1.0.2/classes/C_Calendar.html#method_editCalendar

0voto

ankeorum comentado

Había pensado utilizar uno ya hecho pero en nuestro servidor tenemos una sola base de datos. No sé si eso hará que no podamos usar muchos ya implementados como el que has puesto porque el phpeventcalendar utiliza una base de datos exclusiva para él mientras que nosotros queremos que se implemente con nuestra base de datos para así podemos recabar datos de manera automática para la creación de eventos en los calendarios de los usuarios.

Un saludo y gracias

0voto

white comentado

No necesitas crear una base de datos extra necesariamente, solo agregrar las tablas que pide la libreria en tu base de datos.

dependiendo de tus conocimientos en php puedes usar la api de esa libreria con tu código. sino, existen multitud de tutoriales por la red explicando como crear un calendario en php y mysql.

como primer paso, crea una tabla adicional en donde guardaras la fecha de los eventos.

  • con una consulta guarda la fecha de los eventos en un vector.
  • en un bucle imprime los dias del mes y si el dia en el bucle coincide con alguna fecha del vector se marca el evento.

intenta crear uno, si tienes problemas en el transcurso, está entredesarrolladores para ayudarte.

saludos!

0voto

elarsoft comentado

que tablas nesesita para que funcione tu ejempo

0voto

ricardom1 comentado

Tienes en mente crear uno desde cero o deseas usar una librería? existen varias como por ejemplo:http://phpeventcalendar.com/category/docs/
http://phpeventcalendar.com/eventcalendar/docs/api_b1.0.2/classes/C_Calendar.html#method_editCalendar

Este es el calendario que también usamos. Es un calendario excelente.

3votos

Leonardo-Tadei Puntos227320

Para hacer algo a mano, yo he partido varias veces del calendario que genera BlueFish:

<?php
    $now = getdate(time());
    $time = mktime(0,0,0, $now['mon'], 1, $now['year']);
    $date = getdate($time);
    $dayTotal = cal_days_in_month(0, $date['mon'], $date['year']);
    //Print the calendar header with the month name.
    print '<table><tr><td colspan="7"><strong>' . $date['month'] . '</strong></td></tr>';
    for ($i = 0; $i < 6; $i++) {
        print '<tr>';
        for ($j = 1; $j <= 7; $j++) {
            $dayNum = $j + $i*7 - $date['wday'];
            //Print a cell with the day number in it.  If it is today, highlight it.
            print '<td';
            if ($dayNum > 0 && $dayNum <= $dayTotal) {
                            // Acá podés consultar en la DB los eventos de este día
                            // ...
                print ($dayNum == $now['mday']) ? ' style="background: #ccc;">' : '>';
                print $dayNum;
            }
            else {
                //Print a blank cell if no date falls on that day, but the row is unfinished.
                print '>';
            }
            print '</td>';
        }
        print '</tr>';
        if ($dayNum >= $dayTotal && $i != 6)
            break;
    }
    print '</table>';
?>

Para mostrar el calendario de un día cualquiera, solo hay que asignar a $now la fecha que desees.

Luego, para mostrar datos, en el bucle que arma los días traés con una query los eventos de ese día... si no hay muchos eventos esto es suficiente, pero si hubiera decenas de eventos a mostrar, como esto hace una query por cada día, es más óptimo traer todos loe eventos del mes jutnos y cargarlos en un vector, usando como ínice el número de día, de manera tal de hacer solo 1 query.

La tabla que guarde los eventos tendrá que tener los datos del mismo y la fecha en formato date o datetime, para rescatar los eventos de un día en particular.

Saludos cordiales!

0voto

ankeorum comentado

Correcto Leonardo, con tu código creo un mini calendario de todo el mes pero como haría para por ejemplo poner en negrita los días que tienen un evento y poder clickar en cualquier día y añadir eventos a esos días?

Es obvio que tengo que usar la base de datos, supongamos que en la base de datos creo una tabla calendario, dicha tabla tendrá como campos fech_inicio, fech_fin, hora_inicio, hora_fin, cod_equipo y descripcion. De manera que si un usuario hace login sólo podrá ver, obviamente, sus eventos, los del equipo que gestiona. Rescatar esa información no será un problema pero mostrarla en pantalla me temo que sí ya que con el código que me has puesto no tengo ni idea de cómo integrarlo.

1voto

Leonardo-Tadei comentado

Hola @ankeorum,

para integrar el calendario que puse con la DB, tenés que ejecutar la query para determinar si hay eventos ese día en dónde aparece el comentario "Acá podés consultar en la DB los eventos de este día".

Para una tabla con esta estructura:

id (int unsigned)
fechainicio (datetime)
fechafin (datetime)
titulo (varchar)
...

tomando del valor de $now el momento actual formateado para MySQL

$ahora = "{$now['year']}-{$now['mon']}-{$now['mday']} {$now['hours']}:{$now['minutes]}:{$now['seconds]}";

ejecutás esta query para determinar si ese día hay uno o varios eventos:

$sql = "SELECT * FROM Eventos WHERE fehcainicio >= '$ahora' AND fechafin <= '$ahora';

Si el resultado de la query devuelve 1 o más registros, ponés un enlace que lleve a mostrar los eventos del día (que podrían mostrarse en el mismo lugar, debajo del calendario) y si devuelve 0 no ponés un enlace:

...
$daynum = "<a href=''?day=$ahora">$daynum</a>;
print $daynum;

En este ejemplo, puse un enlace A que envía por GET la fecha a la propia página para que pueda procesarla y mostrar las cosas.

Mucho de esto depende de lo que querés mostrar y de la forma en que quieras se se interactúe con el calendario... si en vez de un enlace querés poner una indicación visual de cada evento de ese día, en vez de quedarte con la cantidad de registros, podés mostrar el número de día paqueño y una lista de enlaces A con el título de cada evento que al clickear muestren información sobre él, etc.

Lo importante es la lógica de despliege del calendario, luego se implementa según la GUI deseada y los datos a mostrar.

Saludos!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta