Un calendario de eventos permite a los usuarios añadir y ver eventos a través de un calendario. En este tutorial te mostraremos cómo crear un calendario de eventos con jQuery, PHP y MySQL. Para ello utilizaremos el plugin Bootstrap Calendar, que nos permitirá crear el propio calendario y cargar eventos dinámicamente a través de una base de datos MySQL mediante una solicitud AJAX a un script del lado del servidor.
Así que, una vez explicado lo que vamos a hacer, vamos a ponernos manos a la obra. Esta será la estructura de archivos para nuestro calendario de eventos:
- index.php
- events.js
- event.php
Crear tabla en la base de datos MySQL
Como nuestro calendario de eventos será dinámico, crearemos una tabla llamada events en nuestra base de datos utilizando la siguiente query.
CREATE TABLE `events` ( `id` int(11) NOT NULL, `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `description` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `start_date` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `end_date` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `created` datetime NOT NULL, `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1=Active, 0=Block' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Insertaremos unos cuantos registros en dicha tabla...
INSERT INTO `events` (`id`, `title`, `description`, `start_date`, `end_date`, `created`, `status`) VALUES (1, 'This is a special events about web development', '', '2018-02-12 00:00:00', '2018-02-16 00:00:00', '2018-02-10 00:00:00', 1), (2, 'PHP Seminar 2018', '', '2018-02-11 00:00:00', '2018-02-17 00:00:00', '2018-02-10 00:00:00', 1), (3, 'Bootstrap events 2018', '', '2018-02-4 00:00:00', '2018-02-4 00:00:00', '2018-02-01 00:00:00', 1), (4, 'Developers events', '', '2018-02-04 00:00:00', '2018-02-04 00:00:00', '2018-02-01 00:00:00', 1), (5, 'Annual Conference 2018', '', '2018-02-05 00:00:00', '2018-02-05 00:00:00', '2018-02-01 00:00:00', 1), (6, 'Bootstrap Annual events 2018', '', '2018-02-05 00:00:00', '2018-02-05 00:00:00', '2018-02-01 00:00:00', 1), (7, 'HTML5 events', '', '2018-02-05 00:00:00', '2018-02-05 00:00:00', '2018-02-01 00:00:00', 1), (8, 'PHP conference events 2018', '', '2018-02-08 00:00:00', '2018-02-08 00:00:00', '2018-02-02 00:00:00', 1), (9, 'Web World events', '', '2018-02-08 00:00:00', '2018-02-08 00:00:00', '2018-02-01 00:00:00', 1), (10, 'Wave PHP 2018', '', '2018-02-08 00:00:00', '2018-02-08 00:00:00', '2018-02-02 00:00:00', 1), (11, 'Dev PHP 2018', '', '2018-02-08 00:00:00', '2018-02-08 00:00:00', '2018-02-01 00:00:00', 1);
Incluir la librería de Bootstrap y la de jQuery
Como he comentado antes, para implementar este calendario utilizaremos el plugin Boostrap Calendar, por lo que tendremos que incluir la librería de Bootstrap y la de jQuery pues sin ellas, nuestro calendario no funcionaría...
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> <link rel="stylesheet" href="css/calendar.css">
También tendremos que incluir estos archivos al final del documento, antes de cerrar el tag body.
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script> <script type="text/javascript" src="js/calendar.js"></script> <script type="text/javascript" src="js/events.js"></script>
Diseñando nuestro calendario
En el fichero index.php, crearemos el HTML de nuestro calendario de eventos de acuerdo al plugin Bootstrap Calendar con sus botones y demás características.
<div class="container"> <div class="page-header"> <div class="pull-right form-inline"> <div class="btn-group"> <button class="btn btn-primary" data-calendar-nav="prev"><< Prev</button> <button class="btn btn-default" data-calendar-nav="today">Today</button> <button class="btn btn-primary" data-calendar-nav="next">Next >></button> </div> <div class="btn-group"> <button class="btn btn-warning" data-calendar-view="year">Year</button> <button class="btn btn-warning active" data-calendar-view="month">Month</button> <button class="btn btn-warning" data-calendar-view="week">Week</button> <button class="btn btn-warning" data-calendar-view="day">Day</button> </div> </div> <h3></h3> <small>To see example with events navigate to Februray 2018</small> </div> <div class="row"> <div class="col-md-9"> <div id="showEventCalendar"></div> </div> <div class="col-md-3"> <h4>All Events List</h4> <ul id="eventlist" class="nav nav-list"></ul> </div> </div> </div>
Crear el calendario con el plugin de Bootstrap
En el fichero event.js, implementaremos nuestro calendario con el plugin Bootstrap Calendar. Realizaremos una solicitud AJAX para cargar los eventos dinámicamente de una base de datos MySQL llamando al fichero del lado del servidor event.php mediante la opción events_source.
(function($) { "use strict"; var options = { events_source: 'event.php', view: 'month', tmpl_path: 'tmpls/', tmpl_cache: false, day: '2018-02-28', onAfterEventsLoad: function(events) { if(!events) { return; } var list = $('#eventlist'); list.html(''); $.each(events, function(key, val) { $(document.createElement('li')) .html('' + val.title + '') .appendTo(list); }); }, onAfterViewLoad: function(view) { $('.page-header h3').text(this.getTitle()); $('.btn-group button').removeClass('active'); $('button[data-calendar-view="' + view + '"]').addClass('active'); }, classes: { months: { general: 'label' } } }; var calendar = $('#showEventCalendar').calendar(options); $('.btn-group button[data-calendar-nav]').each(function() { var $this = $(this); $this.click(function() { calendar.navigate($this.data('calendar-nav')); }); }); $('.btn-group button[data-calendar-view]').each(function() { var $this = $(this); $this.click(function() { calendar.view($this.data('calendar-view')); }); }); $('#first_day').change(function(){ var value = $(this).val(); value = value.length ? parseInt(value) : null; calendar.setOptions({first_day: value}); calendar.view(); }); $('#language').change(function(){ calendar.setLanguage($(this).val()); calendar.view(); }); $('#events-in-modal').change(function(){ var val = $(this).is(':checked') ? $(this).val() : null; calendar.setOptions({modal: val}); }); $('#format-12-hours').change(function(){ var val = $(this).is(':checked') ? true : false; calendar.setOptions({format12: val}); calendar.view(); }); $('#show_wbn').change(function(){ var val = $(this).is(':checked') ? true : false; calendar.setOptions({display_week_numbers: val}); calendar.view(); }); $('#show_wb').change(function(){ var val = $(this).is(':checked') ? true : false; calendar.setOptions({weekbox: val}); calendar.view(); }); }(jQuery));
Cargar eventos de la base de datos
Ahora en event.php obtendremos los registros de nuestra base de datos y los devolveremos al cliente en formato JSON de acuerdo a lo establecido en el plugin Bootstrap Calendar para cargar los eventos del calendario.
<?php include_once("db_connect.php"); $sqlEvents = "SELECT id, title, start_date, end_date FROM events LIMIT 20"; $resultset = mysqli_query($conn, $sqlEvents) or die("database error:". mysqli_error($conn)); $calendar = array(); while( $rows = mysqli_fetch_assoc($resultset) ) { // convert date to milliseconds $start = strtotime($rows['start_date']) * 1000; $end = strtotime($rows['end_date']) * 1000; $calendar[] = array( 'id' =>$rows['id'], 'title' => $rows['title'], 'url' => "#", "class" => 'event-important', 'start' => "$start", 'end' => "$end" ); } $calendarData = array( "success" => 1, "result"=>$calendar); echo json_encode($calendarData); ?>