jueves, 23 de junio de 2011

17. Proyecto I 1.2

Hola de nuevo. Seguimos con nuestro programa. Ahora lo vamos a ampliar, le vamos a dar más dinamismo es muy semejante a las primeras páginas que ofrecían sus productos vía Web. Así que vamos a empezar creando el primer archivo lo vamos a llamar form.2.html. Va a consistir en un formulario de este tipo:



















Como podéis comprobar es un formulario también muy sencillo, muy parecido a los que hemos ido haciendo hasta ahora. El código html del formulario es el siguiente:
<form name="form1" id="form1" method="post" action="procesaform2.php">
          <table width="406" border="1" bordercolor="#999999">
            <tr bgcolor="#999999">
              <td width="57"><div align="center"><strong>Antivirus</strong></div></td>
              <td width="180"><div align="center"><strong>Cantidad</strong></div></td>
            </tr>
            <tr bgcolor="#CCCCCC">
              <td>Norton</td>
              <td>
                <div align="center">
                  <input name="nortoncant" type="text" id="nortoncant" size="3" maxlength="3" />
                </div></td>
            </tr>
            <tr bgcolor="#CCCCCC">
              <td>Panda</td>
              <td><div align="center">
                <input name="pandacant" type="text" id="pandacant" size="3" maxlength="3" />
              </div></td>
            </tr>
            <tr bgcolor="#CCCCCC">
              <td>Nod32</td>
              <td><div align="center">
                <input name="nodcant" type="text" id="nodcant" size="3" maxlength="3" />
              </div></td>
            </tr>
            <tr bgcolor="#CCCCCC">
              <td>AVG</td>
              <td><div align="center">
                <input name="avgcant" type="text" id="avgcant" size="3" maxlength="3" />
              </div></td>
            </tr>
            <tr bgcolor="#CCCCCC">
              <td>&iquest;C&oacute;mo conoci&oacute; nuestra p&aacute;gina? </td>
              <td><select name="find" id="find">
                <option value="a">Cliente habitual</option>
                <option value="b">Buscador Google</option>
                <option value="c">Otros buscadores</option>
                <option value="d">Otros medios de comunicaci&oacute;n</option>
              </select></td>
            </tr>
            <tr bgcolor="#CCCCCC">
              <td>Direcci&oacute;n de envio </td>
              <td><input name="direc" type="text" id="direc" size="20" maxlength="20" /></td>
            </tr>
            <tr bgcolor="#CCCCCC">
              <td>Poblaci&oacute;n</td>
              <td><input name="pob" type="text" id="pob" size="20" maxlength="20" /></td>
            </tr>
            <tr bgcolor="#CCCCCC">
              <td>C&oacute;digo Postal </td>
              <td><input name="cp" type="text" id="cp" size="5" maxlength="5" /></td>
            </tr>
            <tr bgcolor="#CCCCCC">
              <td>Provincia</td>
              <td><input name="prov" type="text" id="prov" size="20" maxlength="20" /></td>
            </tr>
            <tr bgcolor="#CCCCCC">
              <td colspan="2"><div align="center">
                <input type="submit" name="Submit" value="Enviar Pedido" />
              </div></td>
            </tr>
          </table>
        </form>
Fijaros que lo nuevo que tiene el formulario es la lista/menú que indica como nos conoció el cliente, y posteriormente le he añadido campos de texto para la dirección de envió, población, provincia, etc. Cuando le demos al botón enviar nos llevará a la siguiente página:





















Cuyo código PHP del archivo del archivo procesaform2.php es el siguiente:
<?
       echo "<p> Pedido procesado a las: ";
       echo date ("H:i"); //La fecha con la hora incluída
       echo " del día ";
       echo date ("j ");
       echo "de ";
       echo date ("F ");
       echo "del año ";
       echo date ("Y"); //hasta aquí la fecha
       echo "<br>";
       echo "<p>Su pedido es el siguiente: ";
       echo "<br>";
       $totalcant = 0; //la cantidad total de programas antivirus solicitados
       $total= 0.00; //el precio total de los programas solicitados
      
       define ("NORTONPRECIO", 50); //el precio de cada programa
       define ("PANDAPRECIO", 52);
       define ("NOD32PRECIO", 28);
       define ("AVGPRECIO", 24,30);
      
       if ($nortoncant<10) //aplicación de descuento
       $descuento = 0;
       elseif ($nortoncant >=10 && $nortoncant <=49)
       $descuento = 5;
       elseif ($nortoncant >=50 && $nortoncant <=99)
        $descuento = 10;
       elseif ($nortoncant>100)
     $descuento = 15;
       switch ($find)
       {
       case "a":
       echo "<p>Se trata de un cliente habitual.";
       break;
       case "b":
       echo "<p>Este cliente nos conoció a través del buscador Google.<br>";
       break;
       case "c":
       echo "<p>Este cliente nos conoció a través de otros buscadores.<br>";
       break;
       case "d":
       echo "<p>Este cliente nos conoció a través de otros medios de comunicación.<br>";
       break;
       default:
       echo "<p>No sabemos como nos ha conocido este cliente<br>";
       break;
       }
       $totalcant = $nortoncant + $pandacant + $nodcant + $avgcant; //cálculo de la cantidad total de programas
       $total = $nortoncant * NORTONPRECIO
                + $pandacant * PANDAPRECIO
                   + $nodcant * NOD32PRECIO
                   + $avgcant * AVGPRECIO;     //cálculo del precio total
    
     if ($totalcant == 0)
     {echo '<font color=black>';
     echo "Usted no ha introducido ninguna cantidad en el formulario <br>";
     echo '</font>';}
     else
     {
     if($nortoncant>0)
     echo $nortoncant. " Norton<br>"; //procesa la cantidad de norton
     if($pandacant>0) //Si no le indicamos la cantidad no lo procesa el pedido
       echo $pandacant. " Panda<br>"; //procesa la cantidad de panda
       if($nodcant>0)
       echo $nodcant. " Nod32<br>"; //procesa la cantidad de nod
       if($avgcant>0)
       echo $avgcant. " AVG<br>"; //procesa la cantidad de avg
       echo "<br>";}
    
       echo "<br>";
       echo "Programas pedidos: ".$totalcant."<br>\n";
       echo "Subtotal:   €";
       echo number_format($total, 2);
       echo "<br>\n";
      
       if ($descuento == 0)
       {
       echo "No tiene ningún descuento en el programa Norton Antivirus<br>";
       }
       else
       {
       echo "<p>Descuento en el programa Norton Antivirus".$descuento."%";
       echo "<br>";
       }
       $iva=0.16;
       $total = $total *(1+$iva);
       $total=number_format($total, 2);
       echo "Total incluyendo impuestos: €".$total."<br\n";
      
        $stringsalida = $date."\t".$nortoncant." Norton \t".$pandacant." Panda\t" .$nodcant." Nod32\t"
                  .$avgcant." AVG\t\€".$total."\t". $direc."\t". $pob."\t". $cp."\t". $prov."\n";

  // abrir fichero añadiendo
@ $fp = fopen("C:/xampp/htdocs/xampp/pedidos.doc", "a");

@  flock($fp, 2);

  if (!$fp)
  {
    echo "<p><strong> Su orden no ha podido ser procesada en este momento.  "
         ."Por favor inténtelo de nuevo más tarde.</strong></p></body></html>";
    exit;
  }

  fwrite($fp, $stringsalida);
  flock($fp, 3);
  fclose($fp);

  echo "<p>Su orden ha sido recibida y guardada.</p>";
       ?>
 Parece complejo, ¿eh? Pero no, es muy sencillo. Lo primero que voy a explicar que es lo que realiza el programa:
1)    Imprime el pedido de forma que sólo saldrá en pantalla las cantidades de los productos que hayamos indicado. De forma que si solo hemos pedido un Antivirus Norton, en el pedido nos va a salir 1 Norton, y los demás no van a aparecer.
2)   El programa te obliga a indicar la cantidad del producto que deseas si no te dará el error: “Usted no ha introducido ninguna cantidad en el formulario”
3)   Aplicación de descuento, esto lo veremos más adelante cuando expliquemos el código PHP paso a paso.
4)   La posibilidad de que el usuario elija como nos conoció.
5)   Y por último, el pedido a su vez será guardado en un archivo .doc
Ahora vamos a verlo paso por paso, hay contenido en el código que ya vimos en la entrada anterior por lo que no hace falta volver a repetir, si queréis refrescar vuestra memoria sólo tenéis que ir a la entrada anterior. Las primeras líneas que vamos a ver son las siguientes:
if ($nortoncant<10)   
$descuento = 0;
       elseif ($nortoncant >=10 && $nortoncant <=49)
       $descuento = 5;
       elseif ($nortoncant >=50 && $nortoncant <=99)
        $descuento = 10;
       elseif ($nortoncant>100)
     $descuento = 15;
Es la aplicación del descuento. Utilizamos la sentencia if elseif, que ya vimos al principio del blog… ¿os acordáis? Venga va que sí… si no echarle un vistazo… Por defecto no se aplicara descuento si la cantidad de programas Norton son menos de 10. Pero si la cantidad que solicitamos está entre el 10 y 49, se nos aplicará un descuento del 5%. Si la cantidad solicitada esta entre 50 y 99 el descuento será del 10%, y si solicitamos más de 100  el descuento será del 15%. Esta claro, ¿no?
Las siguientes líneas se refiere a la lista/menú del formulario, aunque ya lo vimos en entradas anteriores lo voy a recordar:
switch ($find)
       {
       case "a":
       echo "<p>Se trata de un cliente habitual.";
       break;
       case "b":
       echo "<p>Este cliente nos conoció a través del buscador Google.<br>";
       break;
       case "c":
       echo "<p>Este cliente nos conoció a través de otros buscadores.<br>";
       break;
       case "d":
       echo "<p>Este cliente nos conoció a través de otros medios de comunicación.<br>";
       break;
       default:
       echo "<p>No sabemos como nos ha conocido este cliente<br>";
       break;
       }
Utilizamos la función switch. Aquí la opción que elija el usuario aparecerá impresa en el navegador si no elige ninguna aparecerá la frase por defecto (que es la que está dentro del echo de la sentencia default): No sabemos como nos ha conocido este cliente”
Otras líneas de código interesantes y que obligan al usuario a indicar a alguna cantidad en los productos que desee para que se procese el formulario son las siguientes:
if ($totalcant == 0)
     {echo '<font color=black>';
     echo "Usted no ha introducido ninguna cantidad en el formulario <br>";
     echo '</font>';}
     else
     {
     if($nortoncant>0)
     echo $nortoncant. " Norton<br>";
     if($pandacant>0)
       echo $pandacant. " Panda<br>"; panda
       if($nodcant>0)
       echo $nodcant. " Nod32<br>";
       if($avgcant>0)
       echo $avgcant. " AVG<br>";
Usamos la sentencia if. Si el programa detecta que al hacer la suma de las cantidades de los productos seleccionados la variable $totalcant dá 0 no procesará el pedido, nos obligará a indicar una cantidad en alguno de los productos. Si, por ejemplo, solo indicamos que queremos 1 programa Norton en el pedido solo saldrá impreso 1 Norton, y los demás productos no saldrán al no indicar ninguna cantidad en ninguno de ellos.
Y luego ya las líneas que quedan se refieren a la manera de cómo se guarda el pedido impreso en pantalla en un archivo .doc:
   $stringsalida = $date."\t".$nortoncant." Norton \t".$pandacant." Panda\t" .nodcant." Nod32\t"
                  .$avgcant." AVG\t\€".$total."\t". $direc."\t". $pob."\t". $cp."\t". $prov."\n";

@ $fp = fopen("C:/xampp/htdocs/xampp/pedidos.doc", "a");

@  flock($fp, 2);

  if (!$fp)
  {
    echo "<p><strong> Su orden no ha podido ser procesada en este momento.  "
         ."Por favor inténtelo de nuevo más tarde.</strong></p></body></html>";
    exit;
  }

  fwrite($fp, $stringsalida);
  flock($fp, 3);
  fclose($fp);

  echo "<p>Su orden ha sido recibida y guardada.</p>";
Lo que le indicamos al programa que nos guarde los datos en un archivo y poder acceder posteriormente a ellos. Aunque esto tiene su limitación, imaginaros que hay cientos de pedidos, sería más factible que en vez de almacenar esos datos en un archivo se almacenará en una base de datos. No obstante, para empezar a hacer nuestros primeros proyectos es interesante conocer como se almacenan los datos en un archivo y después poder a acceder a ellos. Y lo de las bases de datos lo dejamos para más adelante.
Bien, tenemos que crear una variable, en este caso hemos creado la variable $stringsalida con el contenido que queremos que se nos almacene en el archivo:
$stringsalida = $date."\t".$nortoncant." Norton \t".$pandacant." Panda\t" .$nodcant." Nod32\t".$avgcant." AVG\t\€".$total."\t". $direc."\t". $pob."\t". $cp."\t". $prov."\n";
Primero aparecerá la fecha, seguido de una concatenación y un tabulador (“\t”) concatenación, la cantidad de norton que hayamos indicado, concatenación la palabra Norton tabulador…. hasta el final del string que acaba con un salto de línea (“\n”). Luego cuando veamos el archivo veremos estos datos más claros.
A continuación viene la función fopen:
@ $fp = fopen("C:/xampp/htdocs/xampp/pedidos.doc", "a");
Esta función contiene dos parámetros, el primer parámetro contiene la ruta del archivo y el segundo parámetro significa como se va a utilizar el archivo en este caso el archivo se puede leer y escribir. Hay otros tipos de formas de cómo utilizar el archivo que vemos a continuación
·         a: Modo añadir: abre el archivo para escribir y leer. Empieza al final del contenido del archivo si hay.
·         a+: abre el archivo para escribir y leer. Empieza al final del contenido del archivo si hay.
·         r: abre el archivo para leer no se puede escribir en él. Empieza al principio del archivo
·         r+: abre el archivo para leer y escribir, empieza al principio del archivo
·         w: abre el archivo para escribir, empieza desde el principio del archivo. Si el archivo ya existe, borra el contenido existente. Si no existe intentará crearlo
·         w+: Abre el archivo para escribir y leer, empieza desde el principio del archivo. Si el archivo ya existe, borra el contenido existente. Si no existe intentará crearlo.
·         b: Modo binario. Usado junto con alguno de los anteriores, puede usarse en Windows. Unix no diferencia entre archivos de texto y binarios
Si en el momento de realizar el pedido, la función fopen falla porque no tenemos permisos o por cualquier otro motivo, php da un error por defecto. Bien, si no queremos que aparezca ese error, es decir, que no aparezca nada, pondremos el arroba delante de la variable $fp. Si nos diera error nos llevaría al siguiente mensaje: “Su orden no ha podido ser procesada en este momento. Por favor inténtelo de nuevo más tarde.”  que se lo indicamos en este trozo de código:
if (!$fp)
  {
    echo "<p><strong> Su orden no ha podido ser procesada en este momento.  "."Por favor inténtelo de nuevo más tarde.</strong></p></body></html>";
    exit;
  }
La siguiente línea de código bloquea el archivo:
@  flock($fp, 2);
Si hay más de dos personas realizando el pedido al mismo tiempo, bloquea el archivo de forma que nos dará el error anterior. Aquí también ponemos el arroba para evitar que aparezcan los mensajes predeterminados de PHP. 
En la siguiente línea se refiere a la función de fwrite. Esta función le he indicado dos parámetros.
fwrite($fp, $stringsalida);
El primer parámetro indica el archivo donde se va a guardar los datos, en este caso, es en la variable $fp donde aparece la ruta del archivo. El segundo parámetro indica los datos que se van a guardar en el archivo que es la variable $stringsalida.
La siguiente línea que hemos visto anteriormente:
flock($fp, 3);
bloquea el archivo si hay más de tres personas que lo han abierto para modificarlo o simplemente para leerlo.
Y por último la función fclose que cierra el archivo. Y si todo ha salido correctamente nos aparecerá la frase: Su orden ha sido recibida y guardada.
Vamos a ver como se nos almacena los datos en el archivo. Primero hay que crear el archivo pedidos.doc. Y hacemos un pedido:



















Le damos a enviar y nos aparece lo siguiente:



















Abrimos el archivo pedidos.doc
 


















Y los datos nos aparecen de la forma que vemos.
En la entrada anterior se me olvido comentaros que si habéis observado yo soy de las personas que acostumbran a escribir comentarios en el código, aunque sean de ejemplo, es una costumbre que por experiencia la recomiendo, que os hartéis de escribir comentarios. Imaginaros que entráis en una empresa donde la persona que estaba anteriormente había hecho una aplicación y no había escrito ningún comentario. Tendrías que desglosar el código ir paso a paso para saber lo que hace realmente la aplicación. Si hubiera puesto comentarios, pues no hace falta desglosar el código, ya tenemos los comentarios que nos guían para saber realmente que hace el programa. Además lo de los comentarios en los códigos es de una profesionalidad absoluta. Así que aunque sean aplicaciones pequeñas recomiendo los comentarios para ir acostumbrándonos a que hay que escribir comentarios a manta.
En la próxima entrada ya será el retoque final de nuestro proyecto, pero no os adelanto nada. Ya lo veremos en la próxima entrada, de momento esto es todo, hasta pronto!

No hay comentarios:

Publicar un comentario