Guardar un formulario en un archivo de texto

En esta entrada, vamos a guardar datos de un formulario HTML5 en un archivo de texto. Para esto necesitaremos los siguientes archivos:

  • index.html
  • datos.php
  • datos.txt
  • numerofactura.txt
  • estilos.css, en la carpeta css.

Este ejemplo consiste en una factura simplificada para calcular subtotales, el IVA y el total de dos productos, por medio de un formulario.

Los datos del formulario se guardan en el archivo de texto datos.txt.

guardar

Crear formulario con index.html

Para crear el formulario HTML5 utlizaremos las etiquetas <form>, <label> e <input>, con sus atributos.

<form id="formulario" method="post" action="datos.php">

En la línea anterior, se crea el formulario con el método de envío de datos post al archivo datos.php.

Sólo hay que aclarar un detalle. El atributo name de la etiqueta input, nos servirá para pasar los datos introducidos al archivo datos.php.

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="css/estilo.css" type="text/css">
    <title>Factura simplificada</title>
</head>

<body>

    <form id="formulario" method="post" action="datos.php">
        <label for="nombre">Nombre:</label>
        <input type="text" name="nombre" id="nombre" value="" required>
        <p>
        <label for="apellidos">Apellidos:</label>
        <input type="text" name="apellidos" id="apellidos" value="" required>
        <p>
        <label for="domicilio">Domicilio de entrega:</label>
        <input type="text" name="domicilio" id="domicilio" value="" required>
        <p>
        <label for="producto1">Patatas 1,75 €/kg.</label>
        <input type="checkbox" name="producto1" id="producto1" value="Patatas">
        <input type="number" name="cantidad1" id="cantidad1" value="" min="0" placeholder="Escribe la cantidad">
        <p>
        <label for="producto2">Cebollas 1,05 €/kg.</label>
        <input type="checkbox" name="producto2" id="producto2" value="Cebollas">
        <input type="number" name="cantidad2" id="cantidad2" min="0"  placeholder="Escribe la cantidad">
        <div class="input">
            <input type="submit" value="Enviar y calcular">
            <input type="reset" value="Limpiar formulario">
        </div>
</form>
</body>
</html>

En primer lugar, como puede verse es un formulario simple, con varios campos de texto input, que son de tipo text, number y checkbox.

En segundo lugar, hay un botón input de tipo submit, que recoge los datos introducidos para mandarlos con el método post.

<input type="submit" value="Enviar y calcular">

Y en tercer lugar, hay otro botón de tipo reset para limpiar los datos introducidos.

<input type="reset" value="Limpiar formulario">

Estos dos botones están en una etiqueta div para ponerlos en una clase para los estilos css, pero eso lo veremos después.

Guardar datos en un archivo de texto (datos.php)

A continuación vamos a comentar el archivo datos.php.

<!DOCTYPE html>

<html>

<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="css/estilo.css" type="text/css">
</head>

<body>
    <?php
        // Variables para los valores de "nombre", "apellidos" y "domicilio"
        $nombre = $_REQUEST["nombre"];
        $apellidos = $_REQUEST["apellidos"];
        $domicilio = $_REQUEST["domicilio"];

        // Variables para la fecha y hora actuales
        $fecha = date("d/m/Y");
        $hora = date("H:i:s");

        // Constantes de los precios
        define("precio1", 1.75);
        define("precio2", 1.05);

        // Vector de variables para almacenar el precio de cada producto
        $totalProducto = array();

        // Abre el archivo numerofactura.txt 
        $leerNumeroFactura = fopen("numerofactura.txt", "rb");

        // Variable $factura para leer el contenido de "leerNumeroFactura"
        $factura = fread($leerNumeroFactura, filesize("numerofactura.txt"));

        //Cierra el archivo
        fclose($leerNumeroFactura);

        // Incrementamos el valor leído previamente
        $factura++;

        // Abrimos el archivo otra vez
        $leerNumeroFactura = fopen("numerofactura.txt", "wb");

        // Escribimos el valor de la variable "$factura" para la próxima
        fwrite($leerNumeroFactura, $factura);

        // Cierra el archivo
        fclose($leerNumeroFactura);

        // Cuerpo de la factura simplificada
        if (isset($_REQUEST["producto1"])) {
            $producto1 = $_REQUEST["producto1"];
            $cantidad1 = $_REQUEST["cantidad1"];
            $totalProducto[0] = precio1 * $cantidad1;
        } else {
            $producto1 = "Producto no seleccionado";
            $cantidad1 = 0;
            $totalProducto[0] = 0;
        }

        if (isset($_REQUEST["producto2"])) {
            $producto2 = $_REQUEST["producto2"];
            $cantidad2 = $_REQUEST["cantidad2"];
            $totalProducto[1] = precio2 * $cantidad2;
        } else {
            $producto2 = "Producto no seleccionado";
            $cantidad2 = 0;
            $totalProducto[1] = 0;
        }

        // Pie de la factura simplificada
        $total = 0;
        for ($i = 0; $i < count($totalProducto); $i++) {
            $total += $totalProducto[$i];
        }

        $IVA = $total * 0.04;
        $subtotal = $total - $IVA;

        $datos = fopen("datos.txt", "ab");
    
        // Escribe los datos introducidos separados por ";"
        fwrite($datos, $factura.";".$fecha.";".$hora.";".$nombre.";".$apellidos.";".$domicilio.";".$producto1.";".$cantidad1.";".$totalProducto[0].";".$producto2.";".$cantidad2.";".$totalProducto[1].";".$subtotal.";".$IVA.";".$total."\n");
        
        fclose($datos);
    
        // Escribe la factura simplificada en la pantalla
        echo "<h2>Factura generada correctamente<br><br>
        
        FACTURA SIMPLIFICADA nº$factura<br>
        Cliente: $nombre $apellidos<br>
        Domicilio: $domicilio<br>
        $fecha $hora<br>
        ---------------------------------\n<br>
        $producto1 \n         $cantidad1" . " x " . precio1 . " = " . "$totalProducto[0]\n<br>
        $producto2 \n         $cantidad2" . " x " . precio2 . " = " . "$totalProducto[1]\n<br>
        ---------------------------------<br>
        BASE: $subtotal €<br>
        IVA 4%: $IVA €<br>
        TOTAL: $subtotal x $IVA = $total €<br>
        </h2>";
        ?>
</body>
</html>

En este archivo, al principio se recogen los datos (nombre, apellidos y domicilio) del formulario en las líneas:

 $nombre = $_REQUEST["nombre"];
 $apellidos = $_REQUEST["apellidos"];
 $domicilio = $_REQUEST["domicilio"];

Se utiliza el array asociativo $_REQUEST, que nos sirve para los contenidos de get y post; incluso también para los contenidos de $_COOKIE.

Después, inicializa las variables para la fecha y la hora actuales con la función date:

 $fecha = date("d/m/Y");
 $hora = date("H:i:s");

Luego, declara las variables para los precios de los productos:

 define("precio1", 1.75);
 define("precio2", 1.05);

En la línea de abajo, creamos un array para guardar el total de cada producto:

$totalProducto = array();

En las siguientes líneas, empezamos a tener en cuenta el número de la factura. Sólo añadir que el archivo numerofactura.txt contiene un número, el 0 inicialmente. Después lo vamos incrementando con el código:

// Abre el archivo numerofactura.txt 
$leerNumeroFactura = fopen("numerofactura.txt", "rb");

// Variable $factura para leer el contenido de "leerNumeroFactura"
 $factura = fread($leerNumeroFactura, filesize("numerofactura.txt"));

//Cierra el archivo
 fclose($leerNumeroFactura);

// Incrementamos el valor leído previamente
 $factura++;

// Abrimos el archivo otra vez
 $leerNumeroFactura = fopen("numerofactura.txt", "wb");

// Escribimos el valor de la variable "$factura" para la próxima
 fwrite($leerNumeroFactura, $factura);

// Cierra el archivo
 fclose($leerNumeroFactura);

Ahora comenzamos con el cuerpo y el pie de la factura:

// Cuerpo de la factura simplificada
 if (isset($_REQUEST["producto1"])) {
 $producto1 = $_REQUEST["producto1"];
 $cantidad1 = $_REQUEST["cantidad1"];
 $totalProducto[0] = precio1 * $cantidad1;
 } else {
 $producto1 = "Producto no seleccionado";
 $cantidad1 = 0;
 $totalProducto[0] = 0;
 }

if (isset($_REQUEST["producto2"])) {
 $producto2 = $_REQUEST["producto2"];
 $cantidad2 = $_REQUEST["cantidad2"];
 $totalProducto[1] = precio2 * $cantidad2;
 } else {
 $producto2 = "Producto no seleccionado";
 $cantidad2 = 0;
 $totalProducto[1] = 0;
 }

// Pie de la factura simplificada
 $total = 0;
 for ($i = 0; $i < count($totalProducto); $i++) {
 $total += $totalProducto[$i];
 }

$IVA = $total * 0.04;
 $subtotal = $total - $IVA;

Escribir la factura en el archivo datos.txt

Y por último, escribimos el código necesario para escribir los datos en el archivo datos.txt:

$datos = fopen("datos.txt", "ab");
 
 // Escribe los datos introducidos separados por ";"
 fwrite($datos, $factura.";".$fecha.";".$hora.";".$nombre.";".$apellidos.";".$domicilio.";".$producto1.";".$cantidad1.";".$totalProducto[0].";".$producto2.";".$cantidad2.";".$totalProducto[1].";".$subtotal.";".$IVA.";".$total."\n");
 
 fclose($datos);

Escribir los datos en la pantalla

// Escribe la factura simplificada en la pantalla
 echo "<h2>Factura generada correctamente<br><br>
 
 FACTURA SIMPLIFICADA nº$factura<br>
 Cliente: $nombre $apellidos<br>
 Domicilio: $domicilio<br>
 $fecha $hora<br>
 ---------------------------------\n<br>
 $producto1 \n $cantidad1" . " x " . precio1 . " = " . "$totalProducto[0]\n<br>
 $producto2 \n $cantidad2" . " x " . precio2 . " = " . "$totalProducto[1]\n<br>
 ---------------------------------<br>
 BASE: $subtotal €<br>
 IVA 4%: $IVA €<br>
 TOTAL: $subtotal x $IVA = $total €<br>
 </h2>";
 ?>

estilos.css

Os paso el código del estilo del formulario. Es muy sencillo.

body {
    width: 100%;
    font-family: courier, courier new, serif;
    font-size: 12px;  
}

form {
    /* Sólo para centrar el formulario a la página */
    margin: 0 auto;
    width: 600px;
    /* Para ver el borde del formulario */
    padding: 1em;
    border: 1px solid #CCC;
    border-radius: 1em;
}

.input {
    /* Posiciona los botones a la misma posición que los campos de texto */
    padding-left: 200px; /* Mismo tamaño a todos los elementos label */
}

input {
    /* Este margen extra representa aproximadamente el mismo espacio que el espacio entre los labels y sus campos de texto */
    margin-left: .5em;
}

label {
    /* Asegura todos los labels con el mismo tamaño y están alineados */
    display: inline-block;
    width: 200px;
    text-align: right;
}

También puede interesarte

Formularios en HTML5

Enviar un formulario por email

Un comentario en “Guardar un formulario en un archivo de texto”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *