Calendario en PHP ciclo FOR. En este articulo veremos cómo crear un simple calendario usando PHP apoyados del ciclo FOR. Además, el calendario es muy dinámico y podemos navegador dentro de los meses del año.
Calendario en PHP ciclo FOR
Crear un calendario es muy sencillo, Primeramente, necesitamos lo siguiente:
- Un archivo PHP
- Ciclo FOR
- Condicionales IF ELSE
- Tablas HTML5
- Estilos CSS
- Definir la hora por país
- Un editor de código (Notepad++, VS Code u otro que les guste)
¿Como crear un calendario sencillo en PHP?
Para lograr el objetivo tenemos que apoyarnos de un array para los meses del año, además de definir la hora en PHP (date_default_timezone_set) podemos navegar por los distintos meses y años del calendario.
Para cambiar Y/o navegar entre los meses usaremos enlaces con el método $_REQUEST
o método GET. Sin embargo, también podemos usar el método POST si no queremos dejar rastro en la URL del navegador.
// Enlace HTML <a href="<?php echo $_SERVER["PHP_SELF"]."?mes=". $prev_month."&anio=".$prev_year; ?>" style="color:#FFFFFF">Anterior</a>
Primera forma: Calendario en PHP ciclo FOR
Usaremos una variable llamada $monthNames
para definir los meses del año en idioma español de enero hasta diciembre.
Código de ejemplo (Copiar y pegar para probar):
<?php date_default_timezone_set("America/Lima"); $monthNames = array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"); if (!isset($_REQUEST["mes"])) $_REQUEST["mes"] = date("n"); if (!isset($_REQUEST["anio"])) $_REQUEST["anio"] = date("Y"); $cMonth = $_REQUEST["mes"]; $cYear = $_REQUEST["anio"]; $prev_year = $cYear; $next_year = $cYear; $prev_month = $cMonth-1; $next_month = $cMonth+1; if ($prev_month == 0 ) { $prev_month = 12; $prev_year = $cYear - 1; } if ($next_month == 13 ) { $next_month = 1; $next_year = $cYear + 1; } ?> <table width="200" style="border:1px solid #999"> <tr align="center"> <td bgcolor="#999999" style="color:#FFFFFF"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="50%" align="left"><a href="<?php echo $_SERVER["PHP_SELF"]."?mes=". $prev_month."&anio=".$prev_year; ?>" style="color:#FFFFFF">Anterior</a></td> <td width="50%" align="right"><a href="<?php echo $_SERVER["PHP_SELF"]."?mes=". $next_month."&anio=".$next_year; ?>" style="color:#FFFFFF">Siguiente</a></td> </tr> </table> </td> </tr> <tr> <td align="center"> <table width="100%" border="0" cellpadding="2" cellspacing="2"> <tr align="center"> <td colspan="7" bgcolor="#999999" style="color:#FFFFFF"><strong><?php echo $monthNames[$cMonth-1].' '.$cYear; ?></strong></td> </tr> <tr> <td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>Domingo</strong></td> <td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>Lunes</strong></td> <td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>Martes</strong></td> <td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>Miercoles</strong></td> <td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>Jueves</strong></td> <td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>Viernes</strong></td> <td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>Sabado</strong></td> </tr> <?php $timestamp = mktime(0,0,0,$cMonth,1,$cYear); $maxday = date("t",$timestamp); $thismonth = getdate ($timestamp); $startday = $thismonth['wday']; for ($i=0; $i<($maxday+$startday); $i++) { if(($i % 7) == 0 ) echo "<tr>"; if($i < $startday) echo "<td></td>"; else {?> <td align="center" valign="middle" height="20px" <?php if ((date("d")== $i - $startday + 1) && $cMonth==date("n")){?> style="background:#999; color:#FFF"<?php }?>> <?php echo ($i - $startday + 1) ?> </td> <?php } if(($i % 7) == 6 ) echo "</tr>"; } ?> </table> </td> </tr> </table>
Explicación del código anterior
Al ejecutar el script anterior mostrara un calendario que cumple su función: simple y modificable tanto en css, pero tiene dos detalles:
- Al pinchar en su menú, y luego querer volver al mes actual deja de señalar el día de hoy. (supongo que esto es reparable simplemente creando un TD central y linkear como index.)
- La semana empieza desde lunes, pero los días no, por ejemplo, hoy es lunes 20 de septiembre 2021. en el calendario pone martes 20.
Estos dos inconvenientes fueron corregidos en esta versión de calendario, así que ya no hay esos inconvenientes,
Salida en el navegador
Podemos agregarle más estilo o incluso agregarle la librería Bootstrap para darle una interfaz más profesional.
Segundo Forma: Calendario en PHP ciclo FOR
Este segundo ejemplo es más sencillo que el anterior ya que no posee los enlaces para navegar entre los meses del año, pero es muy funcional para mostrar los días y el mes actual de manera correcta.
<?php $days_count = date('t'); $current_day = date('d'); $week_day_first = date('N', mktime(0, 0, 0, date('m'), 1, date('Y'))); ?> <table> <tr> <th>LU</th> <th>MA</th> <th>MI</th> <th>JU</th> <th>VI</th> <th style="color: red;">SA</th> <th style="color: red;">DO</th> </tr> <?php for ($w = 1 - $week_day_first + 1; $w <= $days_count; $w = $w + 7): ?> <tr> <?php $counter = 0; ?> <?php for ($d = $w; $d <= $w + 6; $d++): ?> <td style="<?php if ($counter > 4): ?>color: red;<?php endif; ?><?php if ($current_day == $d): ?>background-color:yellow; color:green;font-weight:bold;<?php endif; ?>"> <?php echo($d > 0 ? ($d > $days_count ? '' : $d) : '') ?> </td> <?php $counter++; ?> <?php endfor; ?> </tr> <?php endfor; ?> </table>
La salida en el navegador:
Es un aspecto muy básico, pero resalta sábado y domingo en rojo. además, el día actual marca en un casillero como por ejemplo el día 28 de marzo del 2022. Sin embargo, al ser básico es muy configurable, pueden agregarle más estilos y/o librerías para convertirlo en un calendario profesional.
CONCLUSIÓN
En este articulo hemos proporcionado 2 ejemplos completos para implementar calendarios en PHP, hemos usado el ciclo FOR, Método POST o Método GET según su preferencia.
Además, pueden agregarle conexión a base de datos MySQL y usar PDO como conector. Sin embargo, recomiendo usar PDO en las consultas SQL por su seguridad. porque tenemos que protegernos de las inyecciones SQL.
Espero que estos ejemplos les ayude en sus proyectos web y no se olviden de compartir en las redes sociales.