# Proyectos - Blog

El objetivo de este proyecto es crear un blog para un único usuario

Un ejemplo de blog puede probarse en la ventana siguiente:

Enlace a ejercicio Blog

### Comentarios

- En la sección de soluciones tiene disponible una versión mínima del ejercicio que únicamente permite crear la base de datos, pero que puede utilizarse como base para el resto del ejercicio.
- Para generar el calendario se puede utilizar la función comentada al final de esta página.

Esta puede ser la consulta de creación de tabla para este proyecto:

    // Tamaño de los campos en la tabla
    define('TAM_ENTRADA',         255);  // Tamaño del campo Entradas > Entrada
    define('MAX_REG_ENTRADAS',    10);   // Número máximo de registros en la tabla Entradas

    // Consultas de creación de tabla en MySQL
    $consulta = "CREATE TABLE $dbEntradas (
        id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
        fecha DATE,
        entrada VARCHAR(".TAM_ENTRADA."),
        PRIMARY KEY(id)
        )";

    $consulta = "CREATE TABLE $dbEntradas (
        id INTEGER PRIMARY KEY,
        fecha DATE,
        entrada VARCHAR(".TAM_ENTRADA.")
        )";

## Blog 1 - Inicio

La página inicial del blog muestra las opciones disponibles: Editar, Leer y Borrar todo

Bienvenido al blog de Fulanito.

## Blog 2 - Modo de edición

Al hacer clic en Editar desde la página de inicio, aparece la fecha del día, un área de texto y un calendario en el que se puede hacer clic en todos los días.

## 10/3/2005 Hoy empiezo mi weblog |
<< Marzo de 2005 >>
L | M | X | J | V | S | D
--- | --- | --- | --- | --- | --- | ---
| 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 | 31 |  |  |

Detalles:

- Al guardar la entrada de un día, se pasa automáticamente al modo de lectura.
- Si ya existe la entrada de un día, al hacer clic en el calendario la entrada ya existente aparece en el área de texto y al guardar la entrada corregida sustituye a la anterior.
- Las desigualdades situadas a los lados del nombre del mes permiten cambiar de un mes a otro. Al cambiar de mes, se muestra la información del misdo día del mes correspondiente (salvo que se estuviera en un día que no existe en el otro mes, por ejemplo si se está en el 31 de marzo, al pasar a abril se debe pasar al 30 de abril).

## Blog 3 - Modo de lectura

Al hacer clic en Leer desde la página de inicio, aparece la fecha del día, un área de texto y un calendario en el que se puede hacer clic en los días que tienen entrada.

## 10/3/2005 Hoy empiezo mi blog |
<< Marzo de 2005 >>
L | M | X | J | V | S | D
--- | --- | --- | --- | --- | --- | ---
| 1 | 2 | 3 | 4 | 5 | 6
7 | 8 | 9 | 10 | 11 | 12 | 13
14 | 15 | 16 | 17 | 18 | 19 | 20
21 | 22 | 23 | 24 | 25 | 26 | 27
28 | 29 | 30 | 31 |  |  |

Detalles:

- Al pasar de un mes a otro, si el día correspondiente no tiene entrada, debe mostrar el mensaje: "Todavía no se ha escrito la entrada de este día.".
- Al pulsar Editar, se debe pasar al modo de edición del día que se estaba leyendo.

## Blog 4 - Borrar todo

La opción Borrar todo permite eliminar todas las entradas del blog.

## Blog - Calendario

Para generar el calendario, se puede utilizar esta función, que requiere dos argumentos:

- el primer argumento es la fecha en formato aaaa-mm-dd,
- si el segundo argumento es la cadena 'editar', todos los días del calendario tienen un enlace para poder editarlos, y si es la cadena 'leer', sólo los días con entrada tienen un enlace para poder leer la entrada de ese día.

    <?php
    function calendario ($fecha, $enlaces)
    {
        global $db, $dbEntradas;

        date_default_timezone_set('Europe/Madrid');
        if (!ctype_digit(substr($fecha, 5, 2))||!ctype_digit(substr($fecha, 8, 2))
            ||!ctype_digit(substr($fecha, 0, 4))) {
            $fecha = date('Y-m-d');
        } elseif (!checkdate((int)substr($fecha, 5, 2), (int)substr($fecha, 8, 2),
                        (int)substr($fecha, 0, 4))) {
            $fecha = date('Y-m-d');
        }

        $diaInicial = substr($fecha, 8, 2);
        $mes     = substr($fecha, 5, 2);
        $anyo    = substr($fecha, 0, 4);

        $esBisiesto = (($anyo%400 == 0) || (($anyo%100 != 0) && ($anyo%4 == 0)))
                        ? '1' : '0';
        $duraMeses = ($esBisiesto) ?
            array ( 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31) :
            array ( 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31);
        $meses = array('', 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo',
                            'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre',
                            'Noviembre', 'Diciembre');

        if ($diaInicial > $duraMeses[(int)($mes)-1]) {
            $fechaAnt = date('Y-m-d', mktime(0, 0, 0, $mes-1, $duraMeses[(int)($mes)-1], $anyo));
        } else {
            $fechaAnt = date('Y-m-d', mktime(0, 0, 0, $mes-1, $diaInicial, $anyo));
        }
        $diaAnt  = substr($fechaAnt, 8, 2);
        $mesAnt  = substr($fechaAnt, 5, 2);
        $anyoAnt = substr($fechaAnt, 0, 4);

        if ($diaInicial > $duraMeses[(int)($mes)+1]) {
            $fechaSig = date('Y-m-d', mktime(0, 0, 0, $mes+1, $duraMeses[(int)($mes)+1], $anyo));
        } else {
            $fechaSig = date('Y-m-d', mktime(0, 0, 0, $mes+1, $diaInicial, $anyo));
        }
        $diaSig  = substr($fechaSig, 8, 2);
        $mesSig  = substr($fechaSig, 5, 2);
        $anyoSig = substr($fechaSig, 0, 4);

        $jd = gregoriantojd($mes, 1, $anyo);
        $dia = (jddayofweek($jd, 0)+6)%7;
        $dias = array ('L', 'M', 'X','J','V','S','D');
        $diaSemana = $dias[$dia];

        print "<div class=\"calendario\">\n  <table border=\"1\" class=\"calendario\" >\n";
        if ($enlaces=="editar") {
            print "    <caption><a href=\"editar.php?fecha=$fechaAnt\">&lt;&lt;</a> ".
                $meses[(int)($mes)]." de $anyo <a href=\"editar.php?fecha="
                ."$fechaSig\">&gt;&gt;</a>
        </caption>\n";
        } else {
            print "    <caption><a href=\"leer.php?fecha=$fechaAnt\">&lt;&lt;</a> "
                .$meses[(int)($mes)]." de $anyo <a href=\"leer.php?fecha="
                ."$fechaSig\">&gt;&gt;</a></caption>\n";
        }
        print "    <tr>\n      <th>L</th>\n      <th>M</th>\n      <th>X</th>
          <th>J</th>\n      <th>V</th>\n      <th>S</th>\n      <th>D</th>\n    </tr>\n";
        for ($n=0; $n<=5; $n++) {
            $num_inicio = 1-$dia+$n*7;
            if ($num_inicio <= $duraMeses[(int)($mes)]) {
                print "    <tr>\n";
                for ($i=0; $i<7; $i++) {
                    $num = $num_inicio + $i;
                    if ($num > 0 && $num <= $duraMeses[(int)($mes)]) {
                        if ($enlaces=='editar') {
                            print "      <td class=\"enlace\"><a href=\"editar.php"
                                ."?fecha=$anyo-$mes-".sprintf("%02d", $num)
                                ."\">$num</a></td>\n";
                        } elseif ($enlaces=='leer') {
                            $consulta = "SELECT COUNT(*) FROM $dbEntradas WHERE "
                                ."fecha='$anyo-$mes-".sprintf("%02d", $num)."'";
                            $result = $db->query($consulta);
                            if (!$result) {
                                print "      <td>$num</td>\n";
                            } elseif ($result->fetchColumn()) {
                                print "      <td class=\"enlace\"><a "
                                  ."href=\"leer.php?fecha=$anyo-$mes-"
                                  .sprintf("%02d", $num)."\">$num</a></td>\n";
                            } else {
                                print "      <td>$num</td>\n";
                            }
                        }
                    } else {
                        print "      <td></td>\n";
                    }
                }
                print "    </tr>\n";
            }
        }
        print "  </table>\n</div>\n\n";
    }
    ?>

Esta obra está bajo una licencia de Creative Commons.