Autor Tema: Crear calendario simple mensual o semanal PHP HTML CSS función mktime CU00830B#  (Leído 13373 veces)

Jonathan Ramos

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 15
    • Ver Perfil
Dejo mi codigo del ejercicio final de la entrega CU00830B del curso de php, crear un Calendario, y si es posible usar tablas html y css.

Empecé sin usar funciones, pero al final opté por crear dos funciones ya que quise ir viendo cómo crear una funcion para imprimir cualquier tabla en base a un array o arreglo (a modo de "base de datos") con argumentos especificos. Ya estoy ahora creándola  ;D.

De mientras aquí esta el codigo para el Calendario, que pudo haber sido sin funciones  :o.

Utilizo nombres en ingles para las variables por que se me hace mas comodo ya que son mas cortos y sin problemas con las "ñ"  8).

Código: [Seleccionar]
<?php
//Creacion de un calendario mediante el uso de la funcion draw_calendar_v1(), que a su vez llama a create_calendar().
//Solo se crearon las funciones con el fin de probar el llamado y regreso de valores, asi como poder crear
//posteriormente una funcion drawTable() que dibuje tablas basadas en un arreglo multidimensional y datos.
//Coded by: Jonathan Ramos, jonathanramos@gmail.com

// Funcion que crea un arreglo Calendario de la fecha indicada con valores listos para salida
function create_calendar($month,$year,$calendar){

// Declaramos variables de dias y semanas
// usamos mktime para crear la fecha exacta que queremos para crear valor $time 
$running_day date('w',mktime(0,0,0,$month,1,$year)); // w devuelve el numero del dia de la semana
$days_in_month date('t',mktime(0,0,0,$month,1,$year)); //t devuelve el numero de dias del mes
$days_in_week 0;
$day 1;
$week 0;

// Mandamos datos de los dias de la semana al arreglo
// Imprimimos dias en blanco hasta alcanzar el primero en la semana
for ($days_in_week 0$days_in_week $running_day$days_in_week++){
$calendar [$week][$days_in_week] = 0;
/*  Remueve Comentarios si quieres ver los datos representativos que se van mandando al arreglo
echo ("-- ");
*/
}

// Procedemos con los dias
while ($day <= $days_in_month) {
// Mientras no se llegue al numero de dias del mes llenamos el arreglo
while($days_in_week 7) { 
// Asignamos los dias restantes mientras no lleguemos al tope de dias de semana 7.
// Al terminar los dias del mes seguimos llenando el arreglo de vacio
if ($day <= $days_in_month){
$calendar [$week][$days_in_week] = $day;
/* Remueve Comentarios si quieres ver los datos representativos que se van mandando al arreglo
echo (" ".$day." ");
*/
} else {
$calendar [$week][$days_in_week] = 0;
/* Remueve Comentarios si quieres ver los datos representativos que se van mandando al arreglo
echo (" -- ");
*/
}
$days_in_week++;
$day++;
}
$days_in_week 0;
$week++;
/* Remueve Comentarios si quieres ver los datos representativos que se van mandando al arreglo
echo "<br/>";
*/
}
return $calendar;
}

// Funcion que pinta el calendario
function draw_calendar_v1($month,$year){
$calendar = array(array());
$cal_size 0;
$week 0;
$cell 1;
$month_name " ";

//Creamos el arreglo Calendario
$calendar create_calendar($month,$year,$calendar);
    
// Longitud del Calendario incluyendo espacios en blanco, con llamada recursiva para que sea completo;
// Al ser recursivo nos suma tambien los renglones que son los arrays padres de las celdas, entonces restamos
$cal_size = count($calendar,COUNT_RECURSIVE) - count($calendar); 

//Creamos la tabla
echo '<table style="width:50%">';

//Imprime $month and $year
switch ($month) {  // Obtenemos el nombre en castellano del mes
case $month_name "Enero";
break;
case $month_name "Febrero";
break;
case $month_name "Marzo";
break;
case $month_name "Abril";
break;
case $month_name "Mayo";
break;
case $month_name "Junio";
break;
case $month_name "Julio";
break;
case $month_name "Agosto";
break;
case $month_name "Septiembre";
break;
case 10 $month_name "Octubre";
break;
case 11 $month_name "Noviembre";
break;
case 12 $month_name "Diciembre";

}
// Primer renglon de la tabla (table row tr) con colspan para abarcar todo el renglon
echo '<tr style="background-color:CornflowerBlue; color:white;"><th colspan = "7"; >'.$month_name.' '.$year.'</th></tr>';

//Creamos las celdas de los nombres de los dias de la semana
echo '<tr style="background-color:Azure;">';
echo '<th>Domingo</th><th>Lunes</th><th>Martes</th><th>Miercoles</th><th>Jueves</th><th>Viernes</th><th>Sabado</th></tr>';

//Creamos las celdas de los dias de la semana
while ($cell <= $cal_size){
echo "<tr>";
for ($day=0;$day<7;$day++){
if ($calendar[$week][$day]!=0){
echo "<td>".$calendar[$week][$day]."</td>";
} else { echo "<td></td>"; }
$cell++;
}
$week++;
echo "</tr>";
}
echo "</table>";
}

//---------- Inicio Programa principal  ---------------
// Configuracion general de pagina y tabla
echo "<!DOCTYPE html><html><head>";
echo 
"<style>table, th, td { border: 1px solid black;border-collapse: collapse;}";
echo 
" table, th {text-align:center;}, td { padding: 5px;text-align: left;}</style>";
echo 
"</head><body>";
echo 
"<h2>Creacion de Calendario usando php,html y css</h2>";
// Lamada a la funcion que pinta el calendario la cual llama a su vez a la que crea el arreglo calendario
$timeArray localtime(time(),true);
$month $timeArray["tm_mon"]+1// Mes actual
$year $timeArray["tm_year"]+1900// Año actual

draw_calendar_v1(2,2016);

echo 
"<br/>Coded by: Jonathan Ramos. jonathanramos@gmail.com";
echo 
"</body></html>";
?>


Este es mi link de ejemplo: http://utilities.byethost3.com/cursoPHP/calendario1.php .

Opiniones?.
« Última modificación: 18 de Febrero 2016, 17:24 por Mario R. Rancel »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Buenos días

Voy a hacer algunos comentarios comparando tu ejercicio con el propuesto en otro hilo del foro.

El propuesto en otro hilo era este (lo llamaré "código alternativo"):

Código: [Seleccionar]
<h1>Calendario</h1>
<style>
table{
    width:300px;
    font-size:24px;
}
</style>
<?php 
$mes 
date("m"); 
$año date ("Y");
$semana = array ("Mon","Tue""Wed""Thu","Fri","Sat","Sun");
echo 
"<table>";
echo 
"<thead>";
echo 
"<tr>";
echo 
"<th colspan='7'>",date("M, Y"),"</th>";
echo 
"</tr>";
echo 
"<tr>";
echo 
"<th>Lu</th><th>Ma</th><th>Mi</th><th>Ju</th><th>Vi</th><th>Sa</th><th>Do</th>";
echo 
"</tr>";
echo 
"</thead>";
echo 
"<tbody>";
//// MARCO EL DÍA 1º DEL MES:  ////////////////////
echo "<tr>";
for (
$i=0;$i<=6;$i++){
    if (
date("D",mktime(0,0,0,$mes,1,$año))==$semana[$i]){
        echo 
"<td>"date("d"mktime(0,0,0,$mes,1,$año)) ,"</td>"
            if ( 
date("D",mktime(0,0,0,$mes,1,$año))=="Sun" ){
                echo 
"</tr>","<tr>";
                break;
            }else{
                break;
            }
        break;        
    }else{
        echo  
"<td>""</td>"  ;
    }
}


/////////marco los días subsiguientes////////////////////
for ($j=2;$j<=date("t");$j++){
    if ( 
date("D",mktime(0,0,0,$mes,$j,$año))=="Sun" )  {
        echo      
"<td>",   date("d"mktime(0,0,0,$mes,$j,$año)), "</td >""</tr>""<tr>"
    }else{
        echo      
"<td>",   date("d"mktime(0,0,0,$mes,$j,$año)) ,  "</td>" ;
    }
}
echo 
"</tr>";
echo 
"</tbody>";
echo 
"</table>";
?>


Los comentarios serían los siguientes:

En tu código independizas la definición o cálculo del calendario en una función, en otra su dibujado y en otra la construcción de la página desde donde se llama a las funciones. Esto es un buen diseño ya que permites la reutilización de las funciones en otros contextos. Es quizás un diseño un tanto más avanzado de lo explicado en el curso donde los diseños son muy simples, pero es interesante tanto para tí hacerlos si tienes capacidad para ello como para otras personas que vean este ejercicio, porque contiene una estructuración del código muy interesante. Por tanto tu diseño es bastante mejor que el del código alternativo.

Tu código se ve más largo que el código alternativo. No siempre esto es malo, pero en general se considera que cuanto más breve sea un código mejor. Habría que revisar punto por punto y ver si se puede reducir. Sólo te voy a poner un ejemplo:

Planteas este código:

Código: [Seleccionar]
switch ($month) {  // Obtenemos el nombre en castellano del mes
case 1 : $month_name = "Enero";
break;
case 2 : $month_name = "Febrero";
break;
case 3 : $month_name = "Marzo";
break;
case 4 : $month_name = "Abril";
break;
case 5 : $month_name = "Mayo";
break;
case 6 : $month_name = "Junio";
break;
case 7 : $month_name = "Julio";
break;
case 8 : $month_name = "Agosto";
break;
case 9 : $month_name = "Septiembre";
break;
case 10 : $month_name = "Octubre";
break;
case 11 : $month_name = "Noviembre";
break;
case 12 : $month_name = "Diciembre";

}

Esto parece que podría reducirse creando un array con los nombres de los meses (en 1 línea) y asignando el month_name según el valor de month en otra línea. Parece que con dos o tres líneas podría resolverse este código, que en tu caso comprende 23 ó 24 líneas. El resto del código habría que verlo en el mismo sentido. Respecto a esto hay que excluir los comentarios, que no cuentan. Al revés, debe valorarse positivamente que hayas comentado ampliamente el código.


En tu código para mostrar el mes actual aparece draw_calendar_v1(2,2016);

Supongo que eso era una prueba y que realmente debe ser draw_calendar_v1($month,$year);

Sería interesante ver la función que comentas que estás creando para mostrar cualquier array en una tabla, seguro que puede ser útil para muchas personas

En resumen, felicitarte porque se ve un código bien trabajado y que funciona bien

Saludos

Jonathan Ramos

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 15
    • Ver Perfil
Hola Mario muchas gracias por tus Comentarios. Tienes razon, pude haber reducido el codigo usando un arreglo en lugar de ese switch enorme, lo corregire ahora mismo.
Algo asi:
Código: [Seleccionar]
$monthArray = array ("Enero","Febrero","Marzo","Abril","Mayo","Junio","Juio","Agosto","Septiembre","Octubre","Noviembre","Diciembre");
$month_name = $monthArray[--$month];
Tambien no habia notado que subi la version donde no obtenia la fecha actual automaticamente, ahora mismo lo edito.

En cuanto a la función para imprimir arreglos bidimensionales (tablas) lo he terminado. Tarde un poco por querer ponerle mas cosas. Aun no se como hacer para poder hacer algunos argumentos opcionales, asi que de mientras se tiene que pasar un valor 0 para aclarar que no se requiere dicho valor. En total fueron 2 archivos buildCalendar.php y drawTable.php, que son llamados por otro para crear el calendario. Dejo aqui la funcion para pintar el arreglo bidimensional (tabla).

Código: [Seleccionar]
<?php
//Funcion que Dibuja una tabla.
//Coded by: Jonathan Ramos, jonathanramos@gmail.com
//--------------------------------------------------------------------------------------------------
// Sintaxis function drawTable ($title,$columnHeader,$rowHeader,$tableArray,$keyFlag,$emptyCellKey)
// -------------------------------------------------------------------------------------------------
// donde $title,$columnHeader,$rowHeader y $emptyCellKey deben ser asignados con valor 0 si no se requieren.
// $title : Es una Cadena con el titulo de la tabla.
// $columnHeader: Arreglo con los Headers de las columnas de la tabla a dibujar.
// $rowHeader: Arreglo con los Headers de los renglones de la tabla a dibujar.
// $tableArray: Arreglo de dos dimensiones con los datos a imprimir en la tabla. Este es obligatorio.
// $keyFlag: Valor booleano para indicar que se incluye un valor clave de escape para imprimer celda vacia.
// $emptyCellKey: Valor clave de escape para imprimir celda vacia, si no se requiere se debe asignar false.

function drawTable($title,$columnHeader,$rowHeader,$tableArray,$keyFlag,$emptyCellKey){

$arrayRowCount count($tableArray); // Numero de elementos encabezado columna
$arrayColumnCount count($tableArray[0]); // Numero de elementos encabezado renglon
$tableColumnCount $arrayColumnCount;

//Creamos la tabla html
echo '<table style="width:50%">';

//Imprime titulo con cellpading $tableColumnCount
if ($rowHeader != 0){
$tableColumnCount++; //Si existen $rowHeader, incrementamos el numero de columnas de la tabla a dibujarse
}
echo '<tr style="background-color:CornflowerBlue; color:white;">'// Estilo del titulo
echo '<th colspan = "'.$tableColumnCount.'"; >'.$title.'</th></tr>';

//Si son requeridos, creamos Headers de Columna
if ($columnHeader != 0){
//Iniciamos etiqueta html table row
echo '<tr style="background-color:Azure;">'// Colores de estilo
//Si hay headers de renglon, agregamos una celda en blanco
if ($rowHeader != 0){
echo "<th></th>";
}

//Pintado de headers de Columna
for ($col=0$col $arrayColumnCount$col++){
echo "<th>".$columnHeader[$col]."</th>";
}
echo "</tr>"//Finalizamos etiqueta html table row


//Pintado de renglones del array, y si son requeridos, creamos Headers de Renglon.
for ($row=0$row $arrayRowCount$row++){
echo "<tr>"//Inicializamos etiqueta html table row sin atributos

//Si son requeridos, creamos Headers de Renglon
if ($rowHeader != 0){
// Colores de estilo
echo '<th style="background-color:Lavender;">'.$rowHeader[$row].'</th>'// Headers de renglon
}

//Pintado de celdas del arreglo $tableArray
for ($col=0$col $arrayColumnCount$col++){
// Verificamos si la bandera de escape es TRUE
if ( $keyFlag ){
// Verificamos si no es un valor de celda vacia
if ($tableArray[$row][$col] != $emptyCellKey){
echo "<td>".$tableArray[$row][$col]."</td>";
} else {
echo "<td></td>"// Celda Vacia por valor de escape
}
} else {
echo "<td>".$tableArray[$row][$col]."</td>";
}

echo "</tr>"//Finalizamos etiqueta html table row
}

echo "</table>";

// end drawTable()

?>

En el siguiente link se puede ver el uso de la funcion de dibujo de tabla con dos argumentos diferentes: http://utilities.byethost3.com/cursoPHP/calendario_v2.php
« Última modificación: 18 de Febrero 2016, 15:13 por Jonathan Ramos »

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".