Vous êtes sur la page 1sur 74

PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

UNIVERSIDAD TECNOLÓGICA NACIONAL


Facultad Regional Córdoba

Secretaria de Extensión Universitaria

Área Tecnológica de Educación Virtual

Coordinador General de Educación Virtual: Magíster Leandro D. Torres

Curso:
PHP, MySQL y E-Commerce
Módulo:
“Diseño de aplicaciones con PHP y MySQL”
Tutor: Ing. Oscar R. Espeche

Autor: Ing. Oscar R. Espeche 1


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Modulo 5:

Diseño de una tienda virtual en Internet


5-1 Diagramación de la página

5-2 Administración del cliente

5-3 la página principal

Autor: Ing. Oscar R. Espeche 2


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Introducción
El comercio electrónico o e-commerce es el nombre que se le asigna al proceso de venta de productos
por Internet. La tecnología en que se basa este comercio on line es el empleado en todos los sitios Web.
Por lo tanto necesitamos disponer por lo menos de un sitio Web más la implementación de algún medio
de pago y de distribución de mercaderías.

La mayoría de los sitios de comercio electrónico piden que el pago se realice mediante tarjetas de
crédito, presentando un formulario con los datos del cliente, de la compra, el número de la tarjeta, de tal
manera que el proceso de compra sea lo más seguro posible.

También el trato con los proveedores y distribuidores de productos que conforman la logística del flujo
de productos desde el fabricante hasta el consumidor se realizan por un medio electrónico.

Veremos a continuación los programas que nos permitirán armar una tienda virtual donde los clientes o
usuarios realizan su compra.

La página principal de esta tienda prototipo tiene la siguiente imagen.

Autor: Ing. Oscar R. Espeche 3


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

5-1 Diagramación de la página


La estructura de las páginas de una aplicación de Web, puede tener diferentes esquemas de
diagramación, que en definitiva dependen del estilo del programador, pero que responden a una
necesidad de optimizar el diseño fundamentalmente en lo que respecta al mantenimiento de la
aplicación. También se tiene en cuenta la modularidad de la misma, para permitir el trabajo en grupo, de
tal manera que sea posible por lo menos desdoblar el trabajo en lo que se refiere a la programación
propiamente dicha que define el comportamiento de la aplicación, como así también al diseño y acceso
a la base de datos, y el diseño gráfico que tiene que ver con la parte artística del proyecto.

También se puede pensar en reconocer tres módulos o capas si se tiene en cuenta como algo crítico el
acceso a las bases de datos. Tenemos así el esquema o estructura de programación conocida como
modelo de tres capas. Dichas capas serían las siguientes.

1. Capa de interacción con el usuario


2. Capa que define las reglas del negocio
3. Capa de acceso a los datos

También hay que aclarar que en una aplicación de Web se reconocen básicamente dos tipos de páginas:

1. Página principal: que se accede mediante un link


2. Página secundaria: que se incluye (mediante las funciones include() o require() ) desde una
página principal.

En nuestro caso, el estilo adoptado para la diagramación de las páginas responde en forma aproximada
al siguiente esquema:

1. Inclusión de librerías básicas (allí se definen las funciones globales a todas las páginas)

2. Inclusión de encabezamientos (páginas que dibujan y procesan el encabezamiento como por ej.
Banners)

3. Procesamiento de variables remotas (obtenidas por los protocolos GET y POST)

4. Otros procesamientos necesarios

5. Definición de variables obtenidas del procesamiento previo, que condicionarán posteriores


inclusiones.

6. Inclusión de páginas secundarias que enviarán información HTML al usuario, personalizadas


por el procesamiento previo.

7. Inclusión del pie de página.

Autor: Ing. Oscar R. Espeche 4


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

8. Funciones locales a la página principal, y secundarias que se incluyeron.

El entendimiento de este esquema es fundamental para la interpretación de las páginas de esta


aplicación.

Tenemos que reconocer que la inclusión de los encabezamientos y pie, en las páginas de una misma
aplicación, facilita la tarea de otorgar al sitio un look característico. Al incluir cabeceras y pie similares
en las páginas, el sitio adquiere un estilo propio que se refleja en todas sus páginas.

Ejemplo del código básico de una página

A continuación mostramos distintas partes básicas del código de la página y trataremos de explicar su
contenido para mostrar como funciona el comercio en un sitio Web.

<?
//***************************INDEX.PHP *************************************************
//*******************************Pagina de inicio del sitio de comercio electronico******

include("aplicacion.php");//************incluye aplicacion.php ************************

$titulo = "ADMINNET/E-SHOP";//*****titulo de la barra central en header.php **********

include("$CFG->templatedir/header.php");//**** incluye HEADER.PHP ***********************

//*****header.php muestra las dos barras superiores de presentacion y banners y la ******


//**** columna de la izquierda ( deja un <td> abierto donde se incluye la sig. tabla)****

?>

En esta parte del código observamos en primer lugar los comentarios que nos permiten realizar un
seguimiento de las alternativas del programa y de cómo se resuelven las distintas situaciones como así
también facilitar un posterior mantenimiento del mismo.

//*************************** INDEX.PHP **************************************


//**************** Pagina de inicio del sitio de comercio electrónico ********************

Vemos que la cadena de caracteres que sigue a las dos barras // son ignoradas por el procesador PHP y
las utilizamos para introducir comentarios al código en cualquier parte de una línea, pero solo hasta el
final de la misma.

Si queremos aislar un comentario del resto del código aunque abarque varias líneas, usamos la
siguiente metodología:

Autor: Ing. Oscar R. Espeche 5


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

/*comentarios ...... ....... ...... .... .... ......... ........ ........... .................... ............ ............................. .......................... ...............
.................................................*/

/*************** comentarios ...... ....... ...... .... .... ......... ........ ........... .................... ............ .............................
.......................... ............... ....................................*******************************/

La sentencia :

include("aplicacion.php");

se usa para incluir el contenido de un archivo, en este caso aplicacion.php. Incluir significa que el
contenido de tal archivo se incorpora temporariamente al contenido de nuestro index.php en el punto de
inclusión y se procesa como si originariamente ambos formaran parte de un solo archivo. Es una forma
simple que se usa también por otros lenguajes para incorporar contenido de una forma flexible.

Normalmente las inclusiones se usan para rehusar código que se centraliza en un archivo por separado
que contiene funciones que se emplean en distintas páginas.

También se emplea la inclusión para incorporar código HTML que se desarrolla posiblemente por
separado por distintas personas que participan de un mismo proyecto y de esa forma las páginas PHP
son confeccionadas por programadores y las páginas con contenido HTML por diseñadores gráficos.

En nuestro caso, el archivo aplicacion.php contiene variables y otras definiciones que se requieren en
varias páginas del proyecto. Otra ventaja del uso de las inclusiones, es que permite definir en forma
centralizada, de tal manera que si se deben realizar cambios posteriores, solo se modifica un archivo
solamente y se asegura que la modificación alcanzan a todos los archivos que están dependientes de
dichas especificaciones.

Otra característica es que el archivo index.php como otros del proyecto, se ocupan de procesar scripts y
realizar definiciones sobre variables que después son tomados por los archivos con contenido HTML
que son incluidos a continuación.

La variable $titulo se usa para definir el título que aparece en el encabezado que se incluye a
continuación.

En el archivo aplicacion.php incluido anteriormente se define la variable $CFG->templatedir que define la


ubicación de una carpeta donde se guardan archivos de “templates” que no son más que archivos con
contenido HTML. La inclusión: include("$CFG->templatedir/header.php") permite incluir el archivo
header.php que contiene la cabecera de las páginas de nuestro sitio. De esta forma unificamos la
presentación de las páginas del sitio en lo que se refiere al logo del sitio, enlaces a lugares claves del
sitio, banners, etc.

Autor: Ing. Oscar R. Espeche 6


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Varias páginas “principales de nuestro sitio comenzarán incluyendo aplicacion.php y header.php, por
los motivos ya señalados.

Autor: Ing. Oscar R. Espeche 7


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

5-2 Administración del cliente


Veremos a continuación las funciones que podemos disponer para interactuar administrativamente con
los clientes para:

• Login del cliente


• Logout del cliente
• Crear una nueva cuenta
• Recordar la contraseña
• Cambiar la contraseña
• Cambiar datos del cliente

Todas estas tareas pueden ser realizadas por los mismos clientes. Algunas tienen sentido si todavía el
cliente no se registró (login) y otras se realizan una vez que el cliente se registró en el sitio.

Login del cliente

Permite registrar la sesión del cliente y de esa manera realizarle el seguimiento mientras navega por el
sitio y asociarle como por ejemplo un carrito de compras donde va registrando los productos de una
posible futura compra.

La página principal para esta acción es login.php que describiremos a continuación. Esta página
también permite como acción secundaria, darle oportunidad al cliente de recordar su clave o crear una
nueva cuenta.

La parte de la imagen que nos permite realizar estas operaciones, es la siguiente:

Autor: Ing. Oscar R. Espeche 8


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

En el encabezamiento (header.php) tenemos un link a esta página como nos muestra la siguiente imagen

Autor: Ing. Oscar R. Espeche 9


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Como podemos apreciar tenemos un formulario para registrar el nombre y la contraseña del usuario y
también opciones de recordar la clave y la creación de una nueva cuenta.

Autor: Ing. Oscar R. Espeche 10


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Página login.php
El código de login.php comienza de la siguiente forma:

<?/* login.php */

/****************** permite el login de los clientes y admin de E_SHOP


***************/

include("aplicacion.php");/*************** incluye aplicacion.PHP


******************/

$db=mysql_connect("localhost","alumno1","alumno");
mysql_select_db("e-shop",$db);

Como vemos, incluimos aplicacion.php para definir todas las variables básicas y las funciones de
librerías como es común en todas las paginas principales del sitio.

Aclaramos que una pagina principal es aquella que se accede por medio de un link, establece la sesión
con el servidor de web e incluye tal vez a otras páginas que llamamos secundarias.

También creamos la conexión con la base de datos e-shop donde se encuentran las tablas de nuestra
tienda virtual.

A continuación se verifica si se procede al procesamiento de la pagina con los datos enviados del
formulario, o si se trata de la presentación del formulario por primera vez.

if (coincide_ref() && isset($HTTP_POST_VARS["cliente"])) {/* si se envio el formulario *******/


$usuario = verificar_login($HTTP_POST_VARS["cliente"], $HTTP_POST_VARS["password"]);

La función verificar_login() comprueba la validez de los datos enviados en el formulario, y si estos son
correctos devuelve el array $usuario con los datos del cliente
Si $usuario existe (entonces existe el cliente con el nombre y la clave indicada en el formulario) se
registra el cliente en una variable de sesión para comenzar con su seguimiento.

if ($usuario) {
$SESSION["usuario"] = $usuario;/**** crea la var de sesión $SESSION["usuario"]
**** que es un array con los datos del usuario **/

Autor: Ing. Oscar R. Espeche 11


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

También se verifica la procedencia del pedido de login para retornarlo al lugar de origen una vez
registrado, o simplemente introducirlo a la página principal de la tienda. Si proviene de una pagina que
solicite el login, entonces se definió la variable $SESSION[“faltalogin”] con la dirección de dicha
pagina.

/* si $SESSION["faltalogin"] esta definida , significa que viene de una pagina


que necesitaba login y debemos volver alli y no volver a la pagina principal */

$goto = empty($SESSION["faltalogin"]) ? $CFG->wwwroot : $SESSION["faltalogin"];


header("Location: $goto");/*** redirección según indique $goto *************/
exit;

Si no se indicó correctamente el nombre y la clave se devuelve una variable $usuario vacía.

} else {/*********** variables usadas por templatedir/login_form.php *************/


$error = "Login invalido, inténtelo nuevamente";/** login fallido *********/
$frm["cliente"] = $HTTP_POST_VARS["cliente"];/**nombre del usuario ********/
}
}

Al final se define el título da la pagina que muestra el formulario de login y se incluyen las paginas con
contenido gráfico.

$titulo = "ADMINNET/E-SHOP";
include("$CFG->templatedir/header.php");//*************** include HEADER.PHP *************
include("$CFG->templatedir/login_form.php");/****** incluye templatedir/LOGIN_FORM.PHP****/
include("$CFG->templatedir/pie.php");//*************** include PIE.PHP

La función verificar_login() tiene el siguiente contenido:

function verificar_login($cliente, $password) {

/* verifica nombre de login y contraseña. También obtiene cliente, nombre, apellido,


* y email del cliente. Retorna un array con los datos del usuario *********************/

$qid = db_query("
SELECT cliente, nombre, apellido, email, priv
FROM usuarios
WHERE cliente = '$cliente' AND password = '" . md5($password) . "'

Autor: Ing. Oscar R. Espeche 12


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

");

return db_fetch_array($qid);
}

La pagina templates/login_form.php muestra el formulario para enviar nombre y contraseña como asi
también funciones complementarias como recordar la contraseña y crear una nueva cuenta.

Autor: Ing. Oscar R. Espeche 13


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Pagina logout.php
Una vez que el cliente está conectado y por lo tanto definida la variable de sesión SESSION[“usuario”]
con los datos del cliente, aparece en la pantalla un link a la página logout.php.

Haciendo clic en dicho link se accede a dicha página y se deshabilita la variable SESSION[“usuario”]
con lo que el cliente pierde su sesión.

<?/* logout.php */

include("aplicacion.php");

/* unset la variable SESSION["usuario"] para sacar de sesión al usuario */

unset($SESSION["usuario"]);

header("Location: $CFG->wwwroot");//redirección a la página principal del sitio


?>

Autor: Ing. Oscar R. Espeche 14


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Pagina recordar.php
Si el cliente no recuerda su clave de acceso no podrá entrar en sesión en la tienda virtual que lo habilita
para realizar su compra. Bajo esta circunstancia puede cambiar su clave, pero en forma indirecta.
Indicando su dirección de correo, el sistema de la tienda virtual cambia su contraseña eligiendo una al
azar y se la envía a su dirección de correo.

En la pantalla que le muestra el formulario de login, tiene links que le permiten acceder a la página
recordar.php que realiza la tarea descripta anteriormente.

Esta página le muestra al cliente un formulario para que indique su dirección de correo donde enviará la
nueva clave.

<? /* recordar.php */
/*********************** cambia la clave y la envía por correo al cliente ***************/
//**variables remotas:
//** $email
//**

include("../aplicacion.php");/************* incluye aplicacion.php **********************/

/* si el formulario ya fue enviado y se esperan los datos provenientes de él*/

if (coincide_ref() && isset($HTTP_POST_VARS["email"])) {


$frm = $HTTP_POST_VARS; //array con las variables enviadas al formulario
$error = validar_form($frm, $errores);/*** valida el envío del formulario *******/

//$error está vacío si no hay error. Si sino, es un texto con los errores.
//$errores es un array que se crea por referencia que contiene indicación de los campos
//erróneos del formulario.
//Si no vino ninguna variable remota o si hubo error se ejecuta la página html con el formulario,
//quién a su vez ejecuta la página form_header.php que se encarga de revisar las variables de
error //si existen para marcar los errores si corresponde.

if (empty($error)) { //si no hubo errores


$cliente = obtiene_cliente($HTTP_POST_VARS["email"]);
reset_pass_cliente($cliente);/****cambia la clave y la envía por mail ****/

Autor: Ing. Oscar R. Espeche 15


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

$titulo = "Cambio de Contraseña";


include("$CFG->templatedir/header.php");/* incluye HEADER.PHP ************/
//HTML que indica que la acción se realizó con exito
include("templates/recordar_exito.php");/* incluye RECORDAR_EXITO.PHP ****/
include("$CFG->templatedir/pie.php");/* incluye PIE.PHP ******************/
die;//fin si se recibió la dirección de mail y se cambió la contraseña***
}
}
//si debe enviarse el formulario a la pantalla
include("templates/recordar.php");/*** incluye templates/recordar.php *******************/

En el código vemos que después de validar el formulario, obtiene el nombre de login del cliente
mediante la función obtiene_cliente($HTTP_POST_VARS["email"]) y luego con el retorno de dicha
función ejecuta la función reset_pass_cliente($cliente) que cambia la contraseña y la envía al mail del
cliente.

La función validar_form() como su nombre lo indica valida el envío del formulario por parte del cliente,
y en el caso de que haya un error o el formulario esté en blanco o falten datos, muestra nuevamente el
formulario con un mensaje de advertencia para que el usuario corrija su error.

A continuación analizamos dicha función.

function validar_form(&$frm, &$errores) {

/* valida la entrada del usuario (email)*//* debería corregirse, para validar


una palabra clave y no la dirección de correo, para evitar que un usuario cambie
la clave de otro (si conoce su dirección), aunque nunca pueda conocer la nueva
clave, pero el usuario damnificado recibirá su nueva clave por correo y no
le agradará nada el cambio **************************************************************/

$errores = new Objeto;


$error = "";

if (empty($frm["email"])) {
$errores->email = true;//el nombre de la propiedad debe ser igual al nombre del
//campo que se verifica
$error .= "debe indicar una dirección de correo válida";

} elseif (! existe_email($frm["email"])) {
$errores->email = true;
$error .= "No existe tal dirección en su registro";
}

return $error; //se retorna el texto de error y se graba el objeto $errores


}

Se crea el objeto $errores con una propiedad para cada casillero del formulario que será “true” si el
casillero está incorrecto. Luego en el formulario que se le presenta nuevamente al cliente se analiza la
propiedad asociada a dicho casillero y si es “true” dibuja una marca al lada de casillero respectivo.

También se genera un mensaje de error que se agrega a la variable $error, con el texto que señale los
errores cometidos. El listado de mensajes de errores será analizado y enviado a la pantalla por el código

Autor: Ing. Oscar R. Espeche 16


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

de la página form_header.php que se incluye en templates/recordar.php, cuando se muestra el


formulario.

El formulario de recordar.php tiene el siguiente código:


<!—templates/recordar.php -->
<html>
<head>
<title>Recuperación de la Contraseña</title>
</head>
<!--*********formulario que permite indicar la dirección de correo ************************-->
<!--*********si se escribe una dirección errónea se detecta en la pagina principal
*********y se incluye un mensaje de advertencia ****************************************-->
<style>
.h1 { font-family: Arial, sans-serif; font-size: 14pt; font-weight: bold; }
.label { font-family: Arial, sans-serif; font-size: 10pt; font-weight: bold; }
.normal { font-family: Arial, sans-serif; font-size: 10pt; }
.warning { font-family: Arial, sans-serif; font-size: 12pt; font-weight: bold; color: #ff0000; }
</style>

<body bgcolor="yellow" link=#0000ff vlink=#000099 alink=#ff0000>

<?
include("$CFG->templatedir/headeradminnet.php");//**** include HEADERADMINNET.PHP *******

?>

<div class=h1>Recuperación de la Contraseña <hr size=3></div>

<?
include("$CFG->templatedir/form_header.php");/**** incluye FORM_HEADER.PHP ***************/
?>

<p>

<table cellpadding=20>
<tr valign=top>
<td width=300 class=normal>
<p>Indique su dirección de correo para obtener una nueva contraseña.
La nueva contraseña será enviada a su dirección de correo

<p>Si lo desea puede retornar a la pagina de


<a href="<?=$CFG->wwwroot?>/login.php">E-SHOP/Login</a> o a
<a href="<?=$CFG->wwwroot?>">E-SHOP</a>.
</td>

<td bgcolor="#FDE90D">
<? if (! empty($msg)) { ?>
<div class=warning align=center><? pv($msg) ?></div>
<? } ?>

<form method="post" action="<?=$ME?>">


<table>
<tr>
<td class=label>Direccion de correo:</td>
<td><input type="text" name="email" size=30 value="<? pv($frm["email"]) ?>"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="OK">
<input type="button" value="<--Pag.Ant." onClick="javascript: history.go(-1)">
<p class=normal>
<a href="<?=$CFG->wwwroot?>/login.php">E-SHOP/Login</a>
| <a href="<?=$CFG->wwwroot?>/index.php">E-SHOP</a></td>

Autor: Ing. Oscar R. Espeche 17


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

</tr>
</table>
</form>
</td>
</tr>
</table>

La función obtener_cliente() retorna el nombre de login del cliente que se almacena en el campo
“cliente”de la tabla “usuarios”.
function obtiene_cliente($email) {
/* obtiene los datos del usuario en base a su dirección de email ******************/

$qid = db_query("SELECT cliente FROM usuarios WHERE email = '$email'");


$usuario = db_fetch_object($qid);

return $usuario->cliente; }

La función reset_pass_cliente($cliente)

function reset_pass_cliente($cliente) {

/* cambia el password del cliente con $cliente, y le envía la nueva clave por mail *****/

global $CFG;

/* obtiene los datos del usuario */


$qid = db_query("SELECT cliente, nombre, apellido,
email FROM usuarios WHERE cliente = '$cliente'");
$user = db_fetch_object($qid);

/* cambia la clave */
$nuevapassword = genera_password();
$qid = db_query("UPDATE usuarios SET password = '" .
md5($nuevapassword) ."' WHERE cliente = '$cliente'");

/* envía email con la nueva clave */


$var = new Objeto;
$var->cliente = $user->cliente;
$var->nombre = $user->nombre . " " . $user->apellido;
$var->nuevapassword = $nuevapassword;
$var->admin = $CFG->admin;

//genera el mensaje ***


$mensaje = read_template("$CFG->templatedir/email/reset_password.php", $var);

mail(
"$var->nombre <$user->email>",
"Informacion confidencial de ADMINNET/E-SHOP",
$mensaje,
"From: $var->admin");
}

Vemos que usa la función genera_password() para obtener la nueva clave en forma aleatoria como se
muestra a continuación.

Autor: Ing. Oscar R. Espeche 18


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

function genera_password($maxlong=10) {

/* retorna un password generado aleatoriamente de longitud $maxlong. */

global $CFG;

$relleno = "1234567890!@#$%&*-_=+^";
$lista = file($CFG->lista);
srand((double) microtime() * 1000000);
$palabra1 = trim($lista[rand(0, count($lista) - 1)]);//sel. palabra al azar
$palabra2 = trim($lista[rand(0, count($lista) - 1)]);//sel. otra pal. Al azar
$relleno1 = $relleno[rand(0, strlen($relleno) - 1)];//sel. caracter al azar
//retorna los 10 primeros caracteres de $palabra1.relleno1.$palabra2 ****
return substr($palabra1 . $relleno1 . $palabra2, 0, $maxlong);
}

A continuación graba la nueva clave en la tabla donde están los datos del usuario con:

$qid = db_query("UPDATE usuarios SET password = '" .


md5($nuevapassword) ."' WHERE cliente = '$cliente'");

Y finalmente envía al cliente un mensaje por correo electrónico donde le indica el cambio de clave y le
muestra su valor.

Para ello usa la función mail() nativa de PHP:

mail(
"$var->nombre <$user->email>",
"Informacion confidencial de ADMINNET/E-SHOP",
$mensaje,
"From: $var->admin");

El mensaje donde le indica el nuevo valor de la clave se coloca en $mensaje que se obtiene con la
función read_template($archivo, &$var) que se muestra a continuación.

Autor: Ing. Oscar R. Espeche 19


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

function read_template($archivo, &$var) {


/* retorna un (big) string con el contenido de un archivo template con todas las
* variables resueltas. Todas la variables deben estar dentro de $var[] array u
* objeto (según lo que se decida usar).
*
* OJO: se usa con archivos chicos!! *******************************************/

//escape de la doble barra invertida


$temp = str_replace("\\", "\\\\", implode(file($archivo), ""));

//escape de las doble comillas


$temp = str_replace('"', '\"', $temp);

//reemplaza las variables por su contenido mediante la función eval()


eval("\$template = \"$temp\";");

//retorna el texto con los valores de las variables personalizados


return $template;

//el parámetro &$var permite el acceso a las variables del objeto $var que contiene las variables
a reemplazar.
}

Esta función retorna un string con el contenido de un archivo de texto que se indica como argumento,
donde previamente se reemplazan las variables dentro de él con las componentes de la variable $var que
contiene los datos del cliente.

El archivo al que se hace referencia como "$CFG->templatedir/email/reset_password.php" tiene el


siguiente contenido donde se pueden apreciar las variables mencionadas, que serán resueltas antes de
generar el string $mensaje.

Hola: $var->nombre,

Su clave de E-SHOP ha sido modificada de acuerdo a vuestra solicitud


Sus datos de Login son:

Nombre de Login: $var->cliente


Contrasena: $var->nuevapassword

Es recomendable que mantenga estos datos en un lugar seguro y privado.


Si tiene problemas comuniquese con $var->admin.

Atentamente,
Su Ayuda de E-SHOP: ($var->admin)

Autor: Ing. Oscar R. Espeche 20


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

La función mail por lo tanto envía un mensaje según el contenido de sus argumentos donde se indica lo
siguiente:

Dirección de correo: "$var->nombre <$user->email>"

Asunto: "Información confidencial de ADMINNET/E-SHOP"

Mensaje: $mensaje

Remitente: "From: $var->admin")

Nota sobre otras funciones:

eval

(PHP 3, PHP 4, PHP 5 )

eval -- Evalúa una cadena de carácteres como código PHP


Descripción
void eval ( string code_str)

eval() evalúa la cadena de carácteres dada en code_str como código PHP. Entre otras cosas, ésto
puede ser útil para almacenar código en un campo de texto de base de datos para una ejecución
posterior.

Hay algunos aspectos a tener en cuenta cuando se utiliza eval(). Recuerde que la cadena de carácteres
pasada debe ser código PHP válido, incluyendo aspectos como sentencias de terminación con un punto
y coma para que el parser no finalice en la línea después de eval(), y secuencias de formato correctas en
code_str.

Recuerde también que las variables a las que se les da valor en eval() retendrán estos valores
posteriormente en el script principal.

Ejemplo

<?php
$string = 'cup';
$name = 'coffee';
$str = 'This is a $string with my $name in it.<br>';
echo $str;
eval( "\$str = \"$str\";" );
echo $str;
?>

Autor: Ing. Oscar R. Espeche 21


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

El ejemplo anterior mostrará:

This is a $string with my $name in it.


This is a cup with my coffee in it.

microtime

(PHP 3, PHP 4 , PHP 5)

microtime -- devuelve el valor timestamp UNIX actual con microsegundos


Descripción
string microtime ( void )

Devuelve la cadena "msec sec", donde sec es la hora actual en número de segundos desde el valor Unix
Epoch (0:00:00 del 1 de enero de 1970, hora GMT), y msec es la parte de microsegundos.

srand

(PHP 3, PHP 4 , PHP 5)

srand -- introduce la semilla del generador de números aleatorios


Descripción
void srand ( int seed)

Inicializa el generador de números aleatorios con seed.

// seed son los microsegundos desde el último segundo "entero"


srand((double)microtime()*1000000);
$randval = rand();

rand

(PHP 3, PHP 4 , PHP 5)

rand -- genera un valor aleatorio


Descripción
int rand ( [int min [, int max]])

Si es llamada sin los argumentos opcionales min y max, rand() devuelve un valor pseudo-aleatorio entre
0 y RAND_MAX. Si quiere un número aleatorio entre 5 y 15 (inclusive), por ejemplo, use rand(5,15).

Recuerde introducir la semilla del generador de números aleatorios antes de usar srand().

Autor: Ing. Oscar R. Espeche 22


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Autor: Ing. Oscar R. Espeche 23


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Crear una nueva cuenta de cliente


Si un usuario no tiene una cuenta en la tienda virtual debe crearla para convertirse realmente en un
cliente y así poder registrarse en la tienda cuando desee realizar una compra. En esta cuenta deben
figurar los datos que necesita la administración del comercio para realizar todas las operaciones
relacionadas con los clientes como por ejemplo enviar la compra a su domicilio particular, enviarle un
mail para avisarle el envío de la compra, etc.

La creación y mantenimiento de las cuentas de los clientes también forma parte de las tareas
administrativas del encargado de dicha función, como se explicará oportunamente cuando se explique la
funcionalidad de administración remota de la tienda virtual.

Por lo pronto vemos que un visitante cualquiera del sitio Web puede voluntariamente convertirse en
cliente mediante la página registrar.php que le permite al visitante introducir sus datos en un
formulario para ser registrado como cliente de la tienda virtual.

Autor: Ing. Oscar R. Espeche 24


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

La página registrar.php

Esta página simplemente permite el alta de los datos del cliente mediante un formulario como se
muestra a continuación.

<? /* registrar.php */
/************crea cuenta de usuarios con nombre de login unicos*********************/

include("../aplicacion.php");/********incluye aplicacion.php**********************/

/* **********si el formulario ya fue enviado*************************************** */

if (coincide_ref() && isset($HTTP_POST_VARS["cliente"])) {


$frm = $HTTP_POST_VARS;
$error = validar_form($frm, $errores);
//si el formulario fue llenado correctamente *****
if (empty($error)) {
agregar_usuario($frm);

$titulo = "Bienvenido nuevo Cliente de E-SHOP";


include("$CFG->templatedir/header.php");/**incluye HEADER.PHP******/
include("templates/registro_exitoso.php");/**incluye REGISTRO_EXITOSO.PHP**/
include("$CFG->templatedir/pie.php");/**incluye PIE.PHP******/
exit;
}
}
//si el formulario se presenta por perimera vez o fue llenado incorrectamente *****
$titulo = "Agregar un nuevo Cliente";

Autor: Ing. Oscar R. Espeche 25


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

include("$CFG->templatedir/header.php");/**incluye HEADER.PHP******/
include("$CFG->templatedir/form_header.php");/**incluye FORM_HEADER.PHP******/
include("templates/registrar.php");/**incluye templates/REGISTRAR.PHP******/
include("$CFG->templatedir/pie.php");/**incluye PIE.PHP******/

Autor: Ing. Oscar R. Espeche 26


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

La función validar_form.php
Como ya vimos, esta función permite obtener el mensaje que se presenta en el formulario, para
comunicarle al cliente que cometió errores en el llenado del mismo. También se indica aquellos campos
del formulario que deben corregirse.

A continuación mostramos el código que se explica a través de los comentarios en el mismo.

Autor: Ing. Oscar R. Espeche 27


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

function validar_form($frm, &$errores) {

/* valida el formulario, crea variable (objeto) de error, genera el mensaje de error


** y devuelve "" si no hay error ************************************************/

$errores = new Objeto;


$msg = "";

/*Analiza cada campo obligatorio. Si hay error, crea el trozo de mensaje correspondiente ($msg) y
crea la propiedad correspondiente del objeto $errores como “true”. Todo esto luego será tenido en
cuenta por el código de la página form_header.php para indicarle al usuario cuales son y donde
están los errores.**/

if (empty($frm["cliente"])) {
$errores->cliente = true;
$msg .= "<li>Ud. no especificó el nombre del Cliente";

} if (cliente_existe($frm["cliente"])) {
$errores->cliente = true;
$msg .= "<li>El Cliente <b> " . ov($frm["cliente"]) ."
</b> ya existe";

} if (empty($frm["password"])) {
$errores->password = true;
$msg .= "<li>No especifico la contraseña";

} if (empty($frm["nombre"])) {
$errores->nombre = true;
$msg .= "<li>Falta especificar su primer nombre";

} if (empty($frm["apellido"])) {
$errores->apellido = true;
$msg .= "<li>Falta indicar su apellido";

} if (empty($frm["email"])) {
$errores->email = true;
$msg .= "<li>Olvido indicar su direccion de correo";

} if (existe_email($frm["email"])) {
$errores->email = true;
$msg .= "<li>La dirección de correo<b> ".ov($frm["email"])." </b>ya existe";

} if (empty($frm["telefono"])) {
$errores->telefono = true;
$msg .= "<li>No indicó su número de teléfono";
Autor: Ing. Oscar R. Espeche 28
PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

} if (empty($frm["direccion"])) {
$errores->direccion = true;
$msg .= "<li>Falta especificar su domicilio particular";
}

return $msg;
}

A continuación vemos el código da la función que accede a la base de datos para agregar un registro
que contenga la cuenta de un usuario

function agregar_usuario(&$frm) {

/* agregar datos del nuevo cliente a la base de datos */

$qid = db_query("
INSERT INTO usuarios (
cliente, password, nombre, apellido, email, telefono, direccion,
pais,
provincia, ciudad
) VALUES (
'$frm[cliente]'
,'" . md5($frm[password]) ."'
,'$frm[nombre]'
,'$frm[apellido]'
,'$frm[email]'
,'$frm[telefono]'
,'$frm[direccion]'
,'$frm[pais]'
,'$frm[prov]'
,'$frm[ciudad]'
)");
}

?>

A continuación vemos a título informativo el contenido de la tabla usuarios como podría verse
con la herramienta MySQLcc

Autor: Ing. Oscar R. Espeche 29


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Autor: Ing. Oscar R. Espeche 30


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

La página templates/registrar.php
Esta es una página secundaria incluida por registrar.php que como ya anticipamos sirve para contener
la parte de HTML de esta sección del código. Su contenido se incluye si el formulario para agregar
cliente se muestra por primera vez, o se repite mostrando los errores cometidos en un llenado previo
del formulario. La imagen proporcionada por esta página ya fue mostrada anteriormente. El código es el
siguiente.

Autor: Ing. Oscar R. Espeche 31


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

<p class=normal>
Por favor complete el formulario. Todos los campos son obligatorios.
</p>

<form method="post" action="<?=$ME?>">


<table>
<tr>
<td class=label>Nombre de login:</td>
<td><input type="text" name="cliente" size=25 value="<? pv($frm["cliente"]) ?>">
<?err($errors->cliente)?></td>
</tr>
<tr>
<td class=label>Contraseña:</td>
<td><input type="password" name="password" size=25>
<?err($errors->password)?></td>
</tr>
<tr>
<td class=label>Nombre:</td>
<td><input type="text" name="nombre" size=25 value="<? pv($frm["nombre"]) ?>">
<?err($errors->nombre)?></td>
</tr>
<tr>
<td class=label>Apellido:</td>
<td><input type="text" name="apellido" size=25 value="<? pv($frm["apellido"]) ?>">
<?err($errors->apellido)?></td>
</tr>
<tr>
<td class=label>E-mail:</td>
<td><input type="text" name="email" size=25 value="<? pv($frm["email"]) ?>">
<?err($errors->email)?>
</td>
</tr>
<tr>
<td class=label>Teléfono:</td>
<td><input type="text" name="telefono" size=25 value="<? pv($frm["telefono"]) ?>">
<?err($errors->telefono)?></td>
</tr>

Autor: Ing. Oscar R. Espeche 32


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

<? mysql_select_db("e-shop",$db);?>

<tr>

<td class=label>País:</td>
<td><select name="pais">
<?php
$qid=db_query("select * from pais");
while ($row=db_fetch_array($qid)) { ?>
<option <? echo $row["pnombre"]; if ($row["pnombre"]==pv($frm["pais"]))
{?> selected<?}?>><?=$row["pnombre"]?>
<?}?>
</select></td>
</tr>
<tr>
<td class=label>Provincia:</td>
<td><select name="prov">
<?php
$qid=db_query("select * from provincia");
while ($row=db_fetch_array($qid)) { ?>
<option <? echo $row["prov_nom"]; if
($row["prov_nom"]==pv($frm["provincia"]))
{?> selected<?}?>><?=$row["prov_nom"]?>
<?}?>
</select></td>
</tr>
<tr>
<td class=label>Ciudad:</td>
<td><select name="ciudad">
<?php
$qid=db_query("select * from ciudad");
while ($row=db_fetch_array($qid)) { ?>
<option <? echo $row["cnombre"]; if ($row["cnombre"]==pv($frm["ciudad"]))
{?> selected<?}?>><?=$row["cnombre"]?>
<?}?>
</select></td>
</tr>

<tr valign=top>
<td class=label>Domicilio Particular:</td>
<td><textarea name="direccion" cols=50 rows=5><? pv($frm["direccion"]) ?></textarea>
<?err($errors->direccion)?></td>

</tr>

Autor: Ing. Oscar R. Espeche 33


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

<tr>
<td></td>
<td><input type="submit" value="Crear la Cuenta de Cliente"></td>
</tr>
</table>
</form>

La variable $ME fue definida en aplicación.php y contiene el valor de la página actual.

La función pv() es la siguiente , tal como está definida en la librería lib/lib.php, que define funciones
globales.

function pv(&$var) {
/* imprime $var con los caracteres HTML (como "<", ">", etc.) propiamente
* delimitados, si $var no esta definida, imprime un string vacio.
* para strings normales o funciones usar ov() ****************************/

echo isset($var) ? htmlSpecialChars(stripslashes($var)) : "";


}

La función err() es la siguiente , tal como está definida en la librería lib/e-shop.php, que define
funciones globales.

Autor: Ing. Oscar R. Espeche 34


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

function err(&$errorvar) {

/* if $errorvar esta definida, imprime la marca << */

if (isset($errorvar)) {
echo "<font color=#ff0000>&lt;&lt;</font>";
}
}

Esta función es la que genera la marca “<<” que se dibuja en el formulario al lado del campo que
contiene error.

Autor: Ing. Oscar R. Espeche 35


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

El siguiente código se usa para generar los select HTML para elegir en el formulario país, provincia y
ciudad de una lista.

<? mysql_select_db("e-shop",$db);?>

<tr>
<td class=label>País:</td>
<td><select name="pais">
<?php
$qid=db_query("select * from pais");
while ($row=db_fetch_array($qid)) { ?>
<option <? echo $row["pnombre"]; if ($row["pnombre"]==pv($frm["pais"]))
{?> selected<?}?>><?=$row["pnombre"]?>
<?}?>
</select></td>
</tr>
Autor: Ing. Oscar R. Espeche 36
PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

<tr>
<td class=label>Provincia:</td>
<td><select name="prov">
<?php
$qid=db_query("select * from provincia");
while ($row=db_fetch_array($qid)) { ?>
<option <? echo $row["prov_nom"]; if ($row["prov_nom"]==pv($frm["provincia"]))
{?> selected<?}?>><?=$row["prov_nom"]?>
<?}?>
</select></td>
</tr>
<tr>
<td class=label>Ciudad:</td>
<td><select name="ciudad">
<?php
$qid=db_query("select * from ciudad");
while ($row=db_fetch_array($qid)) { ?>
<option <? echo $row["cnombre"]; if ($row["cnombre"]==pv($frm["ciudad"]))
{?> selected<?}?>><?=$row["cnombre"]?>
<?}?>
</select></td>
</tr>

Autor: Ing. Oscar R. Espeche 37


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

La página form_header.php
Esta página es la encargada de mostrar el mensaje de los errores cometidos en un formulario.

<?
/******muestra la lista de errores de $error y/o mensaje de $mensaje ********/
if (!empty($error)) {
echo "<h2 style='color: #ff0000'>Error</h2>";
echo "<div class=normal>";
echo $error;
echo "</div>";
}

if (isset($mensaje)) {/*****mensaje del resultado de la accion*************/


?>
<div2 class = "notice2">
<?=$mensaje?>
<?
;}
?>
</div2>

Autor: Ing. Oscar R. Espeche 38


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

La página templates/registro_exitoso .php


Esta página secundaria se incluye para dar la bienvenida al usuario que se convirtió en cliente una vez
que llenó exitosamente el formulario de registro.

<h1>Bienvenido &nbsp;<? pv($frm["nombre"]) ?></h1>


<p class=normal>
Gracias por elegirnos! La información de su cuenta es :
</p>

<table>
<tr>
<td class=normal>Nombre de login:</td>
<td class=normal><b><? pv($frm["cliente"]) ?></b></td>
</tr>
<tr>
<td class=normal>Contraseña:</td>
<td class=normal><b><? pv($frm["password"]) ?></b></td>
</tr>
</table>

<p class=normal>
Por favor memorice estos datos y manténgalos en privado!!
</p>

<p class=normal>
Si lo desea, ahora si puede conectarse con el sistema &nbsp;<a href=
"<?=$CFG->wwwroot?>/login.php">login</a>.
</p>
Autor: Ing. Oscar R. Espeche 39
PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

La página usuarios/cambiar datos.php


Esta página principal permite la actualización de los datos personales del cliente por el propio cliente.
Sin embargo solo se podrán cambiar solo algunos datos tal cual se muestra en la imagen del formulario.
Los datos fundamentales que individualizan al cliente no se pueden cambiar. Se trata de que se puedan
actualizar datos que cambian frecuentemente como es el domicilio o la cuenta de correo del usuario.

El código con los comentarios explicativos se muestran a continuación.

Autor: Ing. Oscar R. Espeche 40


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

<?
/**** actualiza los datos del propio cliente**************************/

include("../aplicacion.php");/********** incluye aplicacion.php********************/


requiere_login();

/* si el formulario ya se envio, se chequea lo enviado */

if (coincide_ref() && isset($HTTP_POST_VARS["email"])) {


$frm = $HTTP_POST_VARS;
$error = validar_form($frm, $errores);

if (empty($error)) {
actualizar_datos($frm);
$mensaje = "Se actualizaron los datos exitosamente";
}

Autor: Ing. Oscar R. Espeche 41


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Autor: Ing. Oscar R. Espeche 42


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

} else {
$frm = carga_perfil_usuario();
}

$titulo = "Actualizacion de datos personales";


include("$CFG->templatedir/header.php");/**** incluye HEADER.PHP**********/
include("$CFG->templatedir/form_header.php");/**** incluye
FORM_HEADER.PHP**********/
include("templates/cambiar_datos.php");/* incluye CAMBIAR_DATOS.PHP*******/
include("$CFG->templatedir/pie.php");/**** incluye PIE.PHP**********/

/******************************************************************************
* FUNCIONES
*****************************************************************************/

function carga_perfil_usuario() {

/* carga los datos actuales del usuario */

global $SESSION;

$cliente = $SESSION["usuario"]["cliente"];
$qid = db_query("SELECT * FROM usuarios WHERE cliente = '$cliente'");
return db_fetch_array($qid);
}

function validar_form(&$frm, &$errores) {

/* valida el formulario, devolviendo el mensaje de error si lo hubiere,


tambien crea el objeto $errores donde se ectivan/desactivan las variables
que marcan cada uno de los errores */

global $SESSION;

$errores = new Objeto;


$msg = "";

if (empty($frm["email"])) {
$errores->email = true;
$msg .= "<li>Falta indicar su direccion de correo";

} elseif (existe_email($frm["email"]) && $frm["email"] !=


$SESSION["usuario"]["email"]) {
$errores->email = true;
$msg .= "<li>La direccion de correo<b>" . ov($frm["email"]) ."</b> ya existe";

Autor: Ing. Oscar R. Espeche 43


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Autor: Ing. Oscar R. Espeche 44


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

} elseif (empty($frm["telefono"])) {
$errores->telefono = true;
$msg .= "<li>Falta indicar el numero de su telefono";

} elseif (empty($frm["direccion"])) {
$errores->direccion = true;
$msg .= "<li>Falta indicar el numero de su direccion personal";
}

return $msg;
}

function actualizar_datos(&$frm) {

/* actualiza los datos del usuario en la tabla usuarios*/

global $SESSION;

$cliente = $SESSION["usuario"]["cliente"];

$qid = db_query("
UPDATE usuarios SET
email = '$frm[email]'
,telefono = '$frm[telefono]'
,direccion = '$frm[direccion]'
WHERE cliente = '$cliente'
");
}

?>

Autor: Ing. Oscar R. Espeche 45


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Se leen los datos del formulario. Se validan con

$error = validar_form($frm, $errores);

Si no hubo errores: se actualizan los datos con

actualizar_datos($frm);

Se define la variable

$mensaje = "Se actualizaron los datos exitosamente";

Que se muestra en pantalla, en la página secundaria templates/form_header.php

Se realizan las siguientes inclusiones.


include("$CFG->templatedir/header.php");/**** incluye HEADER.PHP**********/
include("$CFG->templatedir/form_header.php");/**** incluye FORM_HEADER.PHP**********/
include("templates/cambiar_datos.php");/* incluye CAMBIAR_DATOS.PHP*******/
include("$CFG->templatedir/pie.php");/**** incluye PIE.PHP**********/

Si el formulario no fue llenado correctamente:

Se cargan los datos del usuario con

carga_perfil_usuario();

Autor: Ing. Oscar R. Espeche 46


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Donde se obtienen los datos registrados del usuario para llenar los campos correspondientes del
formulario.

Luego se realizan las siguientes inclusiones.

include("$CFG->templatedir/header.php");/**** incluye HEADER.PHP**********/


include("$CFG->templatedir/form_header.php");/**** incluye FORM_HEADER.PHP**********/
include("templates/cambiar_datos.php");/* incluye CAMBIAR_DATOS.PHP*******/
include("$CFG->templatedir/pie.php");/**** incluye PIE.PHP

Donde se le informa al usuario de las fallas del formulario para que corrija.

Autor: Ing. Oscar R. Espeche 47


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

La página templates/cambiar_datos.php
Muestra el formulario para cambiar los datos personales del cliente. Se muestran datos fijos que se
obtienen de la variable de sesión $SESSION[“usuario”] y los datos modificables de la base de datos de
usuarios, cuando se muestran por primera vez. Cuando se modifican los datos se muestra el formulario
modificado con los nuevos datos que se obtienen de la variable $HTTP_POST_VARS.

<form method="post" action="<?=$ME?>">


<table>
<tr>
<td class=label>Nombre de login:</td>
<td class=normal><? pv($SESSION["usuario"]["cliente"]) ?></td>
</tr>
<tr>
<td class=label>Nombre:</td>
<td class=normal><? pv($SESSION["usuario"]["nombre"]) ?></td>
</tr>
<tr>
<td class=label>Apellido:</td>
<td class=normal><? pv($SESSION["usuario"]["apellido"]) ?></td>
</tr>
<tr>
<td class=label>Pais:</td>
<td class=normal><? pv($SESSION["usuario"]["pais"]) ?></td>
</tr>
<tr>
<td class=label>Provincia:</td>
<td class=normal><? pv($SESSION["usuario"]["provincia"]) ?></td>
</tr>
<tr>
<td class=label>Ciudad:</td>
<td class=normal><? pv($SESSION["usuario"]["ciudad"]) ?></td>
</tr>

<!--valores modificables -->

<tr>
<td class=label>Direccion de correo:</td>
<td><input type="text" name="email" size=25 value="<? pv($frm["email"]) ?>">
<?err($errors->email)?>
</td>
</tr>

Autor: Ing. Oscar R. Espeche 48


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Autor: Ing. Oscar R. Espeche 49


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

<tr>
<td class=label>Teléfono:</td>
<td><input type="text" name="telefono" size=25 value="<? pv($frm["telefono"]) ?>">
<?err($errors->telefono)?>
</td>
</tr>
<tr valign=top>
<td class=label>Dirección postal:</td>
<td><textarea name="direccion" cols=50 rows=5><? pv($frm["direccion"]) ?></textarea>
<?err($errors->direccion)?>
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Actualizar los datos"></td>
</table>

</form>

Autor: Ing. Oscar R. Espeche 50


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

La página usuarios cambiar_clave.php


Permite al usuario cambiar su clave si se acuerda de la clave anterior.

Esta operación solo se puede realizar si el usuario ya está logueado.

El código es el siguiente.

<?
/******** permite cambiar la contraseña, si conoce la contraseña anterior*********/

include("../aplicacion.php");/******** incluye aplicacion.php*********************/


requiere_login();

/* si el formulario ya fue enviado, verificar si esta OK */

if (coincide_ref() && isset($HTTP_POST_VARS["viejapassword"])) {


$frm = $HTTP_POST_VARS;
$error = validar_form($frm, $errores);

if (empty($error)) {/***** si no hay errores( mensaje de error vacio)*****/


actualiza_clave($frm["nuevapassword"]);/****cambia la clave*******/
$mensaje = "Se cambio la Clave exitosamente";
}
}

$titulo = "Cambio de Clave";


include("$CFG->templatedir/header.php");/******* incluye HEADER.PHP**************/
include("$CFG->templatedir/form_header.php");/*** incluye FORM_HEADER.PHP********/
include("templates/cambiar_clave.php");/* incluye CAMBIAR_CLAVE.PHP*******/
include("$CFG->templatedir/pie.php");/******* incluye PIE.PHP*****************/
Autor: Ing. Oscar R. Espeche 51
PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

/******************************************************************************
* FUNCIONES
*****************************************************************************/

function validar_form(&$frm, &$errores) {

/* valida el formulario, creando el mensaje de error si lo hubiere, creando las


variables que marcan cada error (objeto $errores), y devuelve el mensaje de error*/

$errores = new Objeto;


$msg = "";

if (empty($frm["viejapassword"])) {//error si el campo de la vieja clave está vacío


$errores->viejapassword = true;
$msg .= "<li>No especifico la clave anterior";

} elseif (! valida_clave($frm["viejapassword"])) {//error si no es correcta la vieja clave y el


nombre
$errores->viejapassword = true;
$msg .= "<li>la clave indicada no es valida";

} if (empty($frm["nuevapassword"])) {//error si está vacía la nueva clave


$errores->nuevapassword = true;
$msg .= "<li>No indico la nueva clave";

} if (empty($frm["nuevapassword2"])) {//error si está vacía la repetición de la nueva clave


$errores->nuevapassword2 = true;
$msg .= "<li>No confirmo la nueva clave";

} if ($frm["nuevapassword"] != $frm["nuevapassword2"]) {//error si no son iguales


$errores->nuevapassword = true;
$errores->nuevapassword2 = true;
$msg .= "<li>Las claves nuevas no coinciden";
}

return $msg;
}

function valida_clave($password) {

/* retorna true si la la contraseña es válida */

global $SESSION;

$cliente = $SESSION["usuario"]["cliente"];
$password = md5($password);
Autor: Ing. Oscar R. Espeche 52
PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

$qid = db_query("SELECT 1 FROM usuarios


WHERE cliente = '$cliente'
AND password = '$password'");
return db_num_rows($qid);
}

function actualiza_clave($nuevapassword) {

/* cambia la contrasena */

global $SESSION;

$cliente = $SESSION["usuario"]["cliente"];
$nuevapassword = md5($nuevapassword);

$qid = db_query("UPDATE usuarios SET password = '$nuevapassword'


WHERE cliente = '$cliente'");
}

?>

Autor: Ing. Oscar R. Espeche 53


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Pagina usuarios/templates/cambiar_clave.php
Es la página secundaria de usuarios/cambiar_clave.php, que muestra el formulario para cambiar la
clave. El código es el siguiente.

<form method="post" action="<?=$ME?>">


<table>
<tr>
<td class=label>Clave anterior:</td>
<td><input type="password" name="viejapassword" size=40>
<?err($errores->viejapassword)?>
</td>
</tr>
<tr>
<td>&nbsp;</td>
</tr>
<tr>
<td class=label>Nueva Clave:</td>
<td><input type="password" name="nuevapassword" size=40>
<?err($errores->nuevapassword)?>
</td>
</tr>
<tr>
<td class=label>Confirmar nueva Clave:</td>
<td><input type="password" name="nuevapassword2" size=40>
<?err($errores->nuevapassword2)?>
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="OK"><br>
<input type="reset" value="Borrar casilleros">
</td>
</table>
</form>

Autor: Ing. Oscar R. Espeche 54


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

5-3 la página principal


A continuación veremos el esquema de la página principal y la conexión con el resto de las páginas del
sitio.

Página index.php
Es la página principal del sitio de la tienda virtual ADMINNET/E_SHOP que se dedica a la venta de
software por Internet. Este tipo de comercio virtual es uno de los más simples y convenientes desde el
punto de vista de su facilidad administrativa.

En este tipo de comercio se simplifica notablemente el manejo de stocks como así también la logística
de distribución del producto, ya que se baja directamente por la red desde el sitio hasta el consumidor
final.

Sin embargo en el transcurso del desarrollo del curso haremos mención las distintas cuestiones
relacionadas con un comercio más complejo en donde se deban administrar relaciones con los
proveedores y distribución de la mercadería por diferentes medios de transporte.

A continuación mostramos distintas partes del código de la página y trataremos de explicar su contenido
para mostrar como funciona el comercio en un sitio Web.

<?
//***************************INDEX.PHP *************************************************
//*******************************Pagina de inicio del sitio de comercio electronico******

include("aplicacion.php");//************incluye aplicacion.php ************************

$titulo = "ADMINNET/E-SHOP";//*****titulo de la barra central en header.php **********

include("$CFG->templatedir/header.php");//**** incluye HEADER.PHP ***********************

//*****header.php muestra las dos barras superiores de presentacion y banners y la ******


//**** columna de la izquierda ( deja un <td> abierto donde se incluye la sig. tabla)****

?>

En esta parte del código observamos en primer lugar los comentarios que nos permiten realizar un
seguimiento de las alternativas del programa y de cómo se resuelven las distintas situaciones como así
también facilitar un posterior mantenimiento del mismo.

En el archivo aplicacion.php incluido anteriormente se define la variable $CFG->templatedir que define la


ubicación de una carpeta donde se guardan archivos de “templates” que no son más que archivos con
contenido HTML. La inclusión: include("$CFG->templatedir/header.php") permite incluir el archivo
header.php que contiene la cabecera de las páginas de nuestro sitio. De esta forma unificamos la
presentación de las páginas del sitio en lo que se refiere al logo del sitio, enlaces a lugares claves del
sitio, banners, etc.

Autor: Ing. Oscar R. Espeche 55


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

La inclusión del encabezamiento realiza la siguiente tarea de mostrar en pantalla links a distintas
páginas principales como se muestra a continuación.

Varias páginas “principales de nuestro sitio comenzarán incluyendo aplicacion.php y header.php, por
los motivos ya señalados.

A continuación se elabora una tabla que contiene la parte central de la página index.php.

<table class = normal width=100%>


<tr valign="top">
<td class = normal> <h1>Bienvenido a ADMINNET/E-SHOP</h1>

<!-------------------------Aqui la pagina HOME PAGE del sitio --------------------------->

<a href="shopping/index.php">
<img src="images/webmail.png" border=0 width=440 height=350></a>

<!--------------------------------------------------------------------------------------->

<p> <a class = normal href="shopping/index.php">


<img src="shopping/images/producto.gif" border=0 width=60 height=60><br>
<img src="shopping/images/up.png" border=0 width=20 height=20>Entrar al SHOPPING!!</a>
</td>

Autor: Ing. Oscar R. Espeche 56


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

En la parte fina de la tabla se incluye un campo donde se ubican las promociones del día de los
productos totales del sitio. O sea las promociones más importantes que se usan para atraer a los clientes
a nuestro sitio.

<!------------------------ Las promociones!!---------------------------->


<td width=10 nowrap></td>

<td valign="top" align=left width = 250>


<h3>Ofertas del dia!!</h3>

<? promociones(); ?>


</td>
</tr>
</table>

Autor: Ing. Oscar R. Espeche 57


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

La función promociones() se ocupa de mostrar dichas ofertas como se muestra en la figura

Al final se incluye el archivo pie.php que contiene la terminación de varias de las páginas del sitio.

Debe notarse que la estructura de la página está implementada por tres partes básicas que son:

ƒ El encabezamiento.
ƒ Las imágenes centrales.
ƒ El pie

Autor: Ing. Oscar R. Espeche 58


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Bajo el punto de vista estructural del contenido, podemos observar prestando atención al código HTML,
que las tres partes mencionadas están conectadas entre si por el hecho de formar parte de una tabla que
comienza en el encabezado, continúa en la parte central y termina en el pie.

Esto permite en las subsiguientes páginas elaborar solamente la parte central y armar el conjunto total
simplemente incluyendo al comienzo el encabezamiento y terminar finalmente incluyendo el pie.

La parte central debe ser un campo de dicha tabla, que normalmente debería contener una tabla donde
se estructura el contenido.

Todo esto permite lograr una buena eficiencia en el diseño del código como así también delegar tareas
que se procesen en forma paralela a varios integrantes del proyecto.

Al final del código vemos la definición de la función promociones(), que como se observará se puede
implementar después de hacer un llamado a dicha función (en un campo de la tabla). También se puede
implementar la definición de la función antes de su llamado.

function promociones() {
/******************************* muestra la lista de las promociones *************************/
global $CFG;
mysql_select_db("e-shop");//*************conexion con la base de datos*****************
//*******************************selecciona los productos en oferta ***************************
$qid = db_query("SELECT id, nombre, descripcion, oferta_especial, precio FROM productos
WHERE oferta_especial = 1");
include("$CFG->templatedir/promociones.php");//**** incluye PROMOCIONES.PHP ***********
}

Vemos que la variable $CFG se define como global ya que fue definida fuera del cuerpo de la función
actual.

Se usa la función mysql_select_db("e-shop") para seleccionar a la base de datos e-shop que permite a
continuación realizar la consulta :
$qid = db_query("SELECT id, nombre, descripcion, oferta_especial, precio FROM productos
WHERE oferta_especial = 1");

$qid contiene el handle (habilitador) que permite el acceso al resultado de la consulta conocido como
“recordset”.

Dicho resultado será accedido y manejado por el archivo templates/promociones.php que se incluye a
continuación. Este archivo tiene contenido HTML que permite visualizar en el navegador un listado de
las ofertas globales de la tienda virtual, como será explicado oportunamente.

En definitiva, la página index.php es una página principal (incluye a otras secundarias) que procesa
información en el servidor de Web mediante el procesador PHP y que envía contenido gráfico al
navegador como se aprecia a continuación.

Autor: Ing. Oscar R. Espeche 59


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

A continuación se muestra el código completo.

<?
//***************************INDEX.PHP
*************************************************
//*******************************Pagina de inicio del sitio de comercio electronico******

include("aplicacion.php");//************incluye aplicacion.php ************************

$titulo = "ADMINNET/E-SHOP";//*****titulo de la barra central en header.php **********

include("$CFG->templatedir/header.php");//**** incluye HEADER.PHP


***********************

//****header.php incluye aheaderadminnet.php y este a banner.php quien dibuja el banner con el


//****link hacia la página asociada.
//*****header.php muestra las dos barras superiores de presentacion y banners y la ******
//**** columna de la izquierda que deja un <td> abierto donde se incluye la sig. tabla****

?>
<table class = normal width=100%>
<tr valign="top">
<td class = normal> <h1>Bienvenido a ADMINNET/E-SHOP</h1>

Autor: Ing. Oscar R. Espeche 60


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

<!-------------------------Aqui la pagina HOME PAGE del sitio --------------------------->

<a href="shopping/index.php">
<img src="images/webmail.png" border=0 width=440 height=350></a>

<!--------------------------------------------------------------------------------------->

<p> <a class = normal href="shopping/index.php">


<img src="shopping/images/producto.gif" border=0 width=60 height=60><br>
<img src="shopping/images/up.png" border=0 width=20 height=20>Entrar al SHOPPING!!</a>
</td>
<!------------------------ Las promociones!!--------------------------------------------->
<td width=10 nowrap></td>

<td valign="top" align=left width = 250>


<h3>Ofertas del dia!!</h3>

<? promociones(); ?>


</td>
</tr>
</table>

<?
include("$CFG->templatedir/pie.php");//*************** incluye PIE.PHP ******************

/*********************************************************************************
*******
* FUNCIONES

**********************************************************************************
******/

function promociones() {
/******************************* muestra la lista de las promociones ********************/
global $CFG;
mysql_select_db("e-shop");//*************conexion con la base de datos***********
//*******************************selecciona los productos en oferta *********************
$qid = db_query("SELECT id, nombre, descripcion, oferta_especial, precio FROM productos
WHERE oferta_especial = 1");
include("$CFG->templatedir/promociones.php");//**** incluye PROMOCIONES.PHP
******
}

?>
Autor: Ing. Oscar R. Espeche 61
PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Página aplicacion.php
En esta página se definen valores iniciales de configuración como se muestran a continuación:

/************************** define el objeto de configuracion ****************************/


$CFG = new Objeto;

$CFG->dbhost = "localhost";
$CFG->dbnombre = "e-shop";
$CFG->dbusuario = "root";
$CFG->dbpass = "password";
$CFG->wwwroot = "/ecommerce";
$CFG->dirroot = "/mnt/hda4/ecommerce/ecommerce";
$CFG->templatedir = "$CFG->dirroot/templates";
$CFG->libdir = "$CFG->dirroot/lib";
$CFG->imagedir = "$CFG->wwwroot/images";
$CFG->lista = "$CFG->libdir/lista.txt";
$CFG->admin = "oespeche@adminnet.edu.ar";

Vemos que se crea un objeto genérico y se le asignan valores a sus propiedades que consisten en
definiciones generales para un sitio determinado que serán diferentes para otros sitios ya que
representan los valores típicos de la configuración del sitio y el acceso a la base de datos.

Cabe notar que $CFG->wwwroot se refiere a un PATH interpretado por http y $CFG->dirroot se refiere
a un PATH interpretado por el sistema de archivos del sistema operativo.

Luego se usa el poder de inclusión para incorporar a las funciones de librerías comunes que se usarán en
la mayoría de las páginas del sitio.

/******************************** carga las librerias comunes ***************************/


require("$CFG->libdir/lib.php");//*************incluye lib.php **************************
require("$CFG->libdir/base.php");//**************incluye base.php ************************
require("$CFG->libdir/e-shop.php");//*************incluye E-SHOP.PHP *********************
require("$CFG->libdir/carro.php");//***************incluye carro.php *********************

Como vemos los archivos de librerías se usan para agrupar funciones de acuerdo a su ámbito de
cometido.

Como en todo sitio Web usaremos las variables de sesión que permiten asociar contenido a una sesión,
que consiste en varios accesos a distintas páginas del sitio.

El protocolo http tiene la particularidad que no memoriza el acceso a sus páginas, de tal manera que
cuando un usuario accede a una página, es como si lo hiciera por primera vez, sin tener en cuenta lo
accedido anteriormente. Se dice que el protocolo http es “sin estado”.

Para incorporar un estado consistente, en varios accesos al sitio que conforman una sesión, de tal
manera que los distintos accesos se puedan relacionar, se crearon las variables de sesión que se guardan
en un archivo o directorio temporario del servidor y que es accedido cada vez que se indica la variable
de sesión correspondiente.

Autor: Ing. Oscar R. Espeche 62


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Las variables se localizan en base a un número que caracteriza a la sesión que es enviado al navegador
del cliente, y que es devuelto en la siguiente conexión que forma parte de la sesión. De esa forma es
posible relacionar varias conexiones como pertenecientes a una misma sesión y localizar las variables
de sesión correspondientes.

/* establece la variable SESSION que se usara como array asociativo*********************


****** que engloba todas las variables de sesion ***************************************/
session_start();
session_register("SESSION");

La función session_start() activa el manejo de sesiones, y la función session_register() registra la


variable que se indica entre paréntesis.

/* inicializa la variable de sesion */


if (! isset($SESSION)) {
$SESSION = array();
}

Luego, en nuestro caso particular definimos a la variable $SESSION como un array, que nos permitirá
alojar múltiples variables.

Al final realizamos la conexión con la base de datos:

/* conexin con la base de datos */


db_connect($CFG->dbhost, $CFG->dbnombre, $CFG->dbusuario, $CFG->dbpass);

Todas estas acciones se realizarán cada vez que un archivo incluya a aplicacion.php. A continuación
vemos el código completo de aplicación.php.

<?
//***************************APLICACION.PHP
//********* define variables globales, incluye librerias y conecta con la base ***********

/************************* el modo (15) activa la muestra de todos los errores **********/


error_reporting(15);

/***************************** define una clase generica


*********************************/
class Objeto{};

/************************** define el objeto de configuracion


****************************/
$CFG = new Objeto;
Autor: Ing. Oscar R. Espeche 63
$CFG->dbhost = "localhost";
$CFG->dbnombre = "e-shop";
PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

$CFG->wwwroot = "/ecommerce";
$CFG->dirroot = "E:/Tecnologica/comercio electronico/Ejercicios/ecommerce";
$CFG->templatedir = "$CFG->dirroot/templates";
$CFG->libdir = "$CFG->dirroot/lib";
$CFG->imagedir = "$CFG->wwwroot/images";
$CFG->lista = "$CFG->libdir/lista.txt";
$CFG->admin = "oespeche@adminnet.edu.ar";

/************************************ activa el debuging ********************************/


$DB_DEBUG = true;
$DB_EXIT_FALLA = true;

/******************************** carga las librerias comunes


***************************/
require("$CFG->libdir/lib.php");//*************incluye lib.php ********************
require("$CFG->libdir/base.php");//**************incluye base.php**********************
require("$CFG->libdir/e-shop.php");//*************incluye E-
SHOP.PHP*********************
require("$CFG->libdir/carro.php");//***************incluye
carro.php***********************

/*************************** define algunas variables globales


**************************/
$ME = pag_actual();//**devuelve la pagina actual

/* establece la variable SESSION que se usara como array asociativo*********************


****** que engloba todas las variables de sesion ***************************************/
session_start();
session_register("SESSION");

/* inicializa la variable de sesion */


if (! isset($SESSION)) {
$SESSION = array();
}
/* inicializa la variable de sesion para el carrito */
if (! isset($SESSION["carro"])) {
$SESSION["carro"] = new Carro;
}
/* inicializa la variable de sesion para el producto */
if (! isset($SESSION["prod"])) {
$SESSION["prod"] = new Objeto;
}
/* inicializa la variable de sesion para las partes de una orden (lotes) */
if (! isset($SESSION["part"])) {
$SESSION["part"] = new Objeto;
}

Autor: Ing. Oscar R. Espeche 64


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Página header.php
Este archivo se incluye en todas aquellas páginas que deben mostrar un encabezado con el logo del sitio
y otras promociones propias del mismo.

A su vez incluye a otro encabezado que contiene el banner u otros banner que se deseen incorporar para
promocionar sitios y/o productos. Ambos encabezados definen de alguna manera el estilo gráfico de la
presentación visual de la tienda virtual.

<?php
//***************************HEADER.PHP
//******************incluye header de ADMINNET que coloca la barra superior**************
include ("/mnt/hda4/ecommerce/ecommerce/templates/headeradminnet.php");
?>

Esta página es un ejemplo de página secundaria que será solamente mostrada como una inclusión de
otra que será la página principal tomada por el navegador. La página principal es accedida mediante un
link o un URL definido como dirección de acceso en el navegador.

Como se trata de un archivo que se incluye al comienzo de páginas que desean una salida gráfica, se
aprovecha para definir estilos de fuentes que se usarán en el resto de la página principal.

<style>
h1 { font-family: Arial, sans-serif; font-size: 14pt; font-weight: bold;
color: #006699; }
h2 { font-family: Arial, sans-serif; font-size: 12pt; font-weight: bold; }
th { font-family: Arial, sans-serif; font-size: 10pt; font-weight: bold;
text-align: center; }
.h1 { font-family: Arial, sans-serif; font-size: 14pt; font-weight: bold; }
.h2 { font-family: Arial, sans-serif; font-size: 12pt; font-weight: bold; }
.label { font-family: Arial, sans-serif; font-size: 10pt; font-weight: bold; }
.normal { font-family: Arial, sans-serif; font-size: 10pt; }
.notice { font-family: Arial, sans-serif; font-size: 10pt; color: #006699; }
</style>

Esto es solo un ejemplo de cómo se puede simplificar la definición de estilo en páginas HTML.

A continuación se muestra como se resuelve parte de este encabezado en nuestra tienda virtual:

<!----------------------comienza la barra central roja----------------------------------->


<table width=100% cellspacing=0 border = 0>
<tr>
<td width = 100% bgcolor="#C70D11" class=h1><? pv($titulo) ?></td>

<td nowrap width = 100% bgcolor="#C70D11" align=right class=normal>


<? if (si_login()) {

Autor: Ing. Oscar R. Espeche 65


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

p($SESSION["usuario"]["nombre"] . " " . $SESSION["usuario"]["apellido"]) ?>


| <a class=normal href="<?=$CFG->wwwroot?>/logout.php">Logout</a>
<? } else { ?>
<a class=normal href="<?=$CFG->wwwroot?>/login.php">Login</a>
| <a class=normal href="<?=$CFG->wwwroot?>/usuarios/registrar.php">
Crear cuenta</a>
<? } ?>
</td>

<td width = 100% bgcolor="#C70D11" >&nbsp;</td>


</tr>
</table>

<!---******************* fin de la barra central roja **********************************-->

Vemos que existe una toma de decisión que permite mostrar el nombre del cliente registrado y su
posibilidad de desconexión, o la opción de login y la posibilidad de crear una cuenta de cliente si el
usuario todavía no está logueado. Esto se muestra en la siguiente figura:

Se ha marcado la tabla con border=”1” para poner en evidencia los límites de la tabla. Vemos que la
mitad del borde rojo corresponde a header.php y la mitad superior a headeradminnet.php.

También observamos que $titulo se define en la página principal previo a la inclusión de header.php,
para desplegar el título de la página en forma normalizada.

Luego sigue la elaboración de la salida que se muestra en la barra vertical de la izquierda donde
primeramente mostramos las opciones:

ƒ Home
ƒ Entrar al shopping
ƒ Cambiar contraseña
ƒ Actualizar datos
ƒ Logout

Con el siguiente código:

<!--*************** comienzo de las opciones del sitio ( col. izquierda)***************-->


<table><tr><td class=normal nowrap>
<li> <a href="<?=$CFG->wwwroot?>">Home</a>
<li> <a href="<?=$CFG->wwwroot?>/shopping">Entrar al Shopping</a>

<? if (si_login()) { ?>


<li> <a href="<?=$CFG->wwwroot?>/usuarios/cambiar_clave.php">Cambiar clave</a>
<li> <a href="<?=$CFG->wwwroot?>/usuarios/cambiar_datos.php">Actualizar datos </a>
<li> <a href="<?=$CFG->wwwroot?>/logout.php">Logout</a>

Autor: Ing. Oscar R. Espeche 66


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Se genera la siguiente salida si el usuario ya está registrado (log in):

Seguidamente se realiza una toma de decisión para incorporar opciones si el usuario es un


administrador del sitio o un cliente común.

<!--*********************** si es un Admin administrar el sitio **********************-->


<? if (tiene_priv("admin")) { ?>
</td>
</tr>

<tr><td bgcolor="#C70D11" colspan=1><hr size=1></td></tr>

<tr><td nowrap bgcolor="#C70D11" class=normal>


<li> <a href="<?=$CFG->wwwroot?>/admin">Administrar el Sitio</a>
<? } ?>

Con la siguiente salida:

Pero si no está registrado:

<? } else { ?>


<li> <a href="<?=$CFG->wwwroot?>/login.php">Login</a>
<li> <a href="<?=$CFG->wwwroot?>/usuarios/registrar.php">Crear cuenta</a>
<? } ?>

Si el usuario es un administrador se muestra el enlace Administrar el sitio en caso contrario se usa ese
lugar para darle al usuario la posibilidad de registrarse o crear una cuenta.

Autor: Ing. Oscar R. Espeche 67


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

A continuación se muestra un resumen del contenido en el carrito o cesta de compras que le permite al
cliente ver la cantidad de productos seleccionados para la compra y el monto total de la misma.

También se incluye un acceso a la página principal del carrito de compras donde el cliente podrá ver los
detalles de la compra como así también modificar la misma.

<!--************************** Carrito de compras *************************************-->


<table>
<tr>
<td nowrap colspan=2 class=label><a href="<?=$CFG->wwwroot?>
/shopping/ver_carrito.php">Carrito de Compras</a></td>
</tr>

<tr>
<td class=normal>Items:</td>
<td class=label><?=$SESSION["carro"]->cantitems()?></td>
</tr>

<tr>
<td class=normal>Total:</td>
<td class=label><? printf("$%.2f", $SESSION["carro"]->total); ?></td>
</tr>

<tr>
<td nowrap colspan=2 class=label><br><a href="<?=$CFG->wwwroot?>
/shopping/comprar.php">Compre YA!!</a></td>
</tr>

</table>

La función de la clase Carro (se explicará luego con los detalles de la cesta de compra)
$SESSION["carro"]->cantitems() muestra la cantidad de ítems que contiene actualmente la cesta de
compras, y la variable $SESSION["carro"]->total muestra el monto total de la compra hasta este
momento. Estos valores son actualizados cada vez que se incorpora un producto a la cesta de compras
(carrito). La salida es la siguiente:

Accediendo a la tienda virtual podrá comprobar que cada vez que selecciona un producto para ser
incluido en el carrito, se actualizan estos valores.

Finalmente se termina el encabezado abriendo un campo de la tabla, que contendrá a la parte central de
la página.

Autor: Ing. Oscar R. Espeche 68


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

<td width=100%>
<!--**********en este campo se coloca la imagen central de la pagina, en index.php**************-
->

Como fue explicado previamente, la tabla se cierra recién en el pie da la página (pie.php) que
obligatoriamente deberá ser incluido.

Autor: Ing. Oscar R. Espeche 69


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

El código de header.php es el siguiente.

<?php
//***************************HEADER.PHP
//******************incluye header de ADMINNET que coloca la barra superior**************
$title=$titulo;
include ("$CFG->templatedir/headeradminnet.php");//entre otras cosas dibuja el banner ****
?>
<html>
<head>
<title><? pv($titulo) ?></title>
</head>
<!--**********************define estilos de texto**************************************--
>
<style>
h1 { font-family: Arial, sans-serif; font-size: 14pt; font-weight: bold;
color: #006699; }
h2 { font-family: Arial, sans-serif; font-size: 12pt; font-weight: bold; }
th { font-family: Arial, sans-serif; font-size: 10pt; font-weight: bold;
text-align: center; }
.h1 { font-family: Arial, sans-serif; font-size: 14pt; font-weight: bold; }
.h2 { font-family: Arial, sans-serif; font-size: 12pt; font-weight: bold; }
.label { font-family: Arial, sans-serif; font-size: 10pt; font-weight: bold; }
.normal { font-family: Arial, sans-serif; font-size: 10pt; }
.notice { font-family: Arial, sans-serif; font-size: 10pt; color: #006699; }
.notice2 { font-family: Arial, sans-serif; font-size: 14pt; color: #006699; }
</style>
<body bgcolor="yellow" link=#0000ff vlink=#000099 alink=#ff0000>
<!----------------------comienza la barra central roja------------------------------------------------------------>
<table width=100% cellspacing=0 border = 1>
<tr>
<td width = 100% bgcolor="#C70D11" class=h1><? pv($titulo) ?></td>

<td nowrap width = 100% bgcolor="#C70D11" align=right class=normal>


<? if (si_login()) {
p($SESSION["usuario"]["nombre"] . " " . $SESSION["usuario"]["apellido"]) ?>
| <a class=normal href="<?=$CFG->wwwroot?>/logout.php">Logout</a>
<? } else { ?>
<a class=normal href="<?=$CFG->wwwroot?>/login.php">Login</a>
| <a class=normal href="<?=$CFG->wwwroot?>/usuarios/registrar.php">
Crear cuenta</a>
<? } ?>
</td>

<td width = 100% bgcolor="#C70D11" >&nbsp;</td>


</tr>
Autor: Ing. Oscar R. Espeche 70
PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

</table>

<!---******************* fin de la barra central roja**********************************-->

<!--*************** tabla de la parte central de la pagina*****************************-->

<table width = 100% cellspacing=0 cellpadding=5 >


<tr valign=top>
<td bgcolor="#C70D11" class=normal nowrap>

<!--*************** comienzo de las opciones del sitio ( col. izquierda)***************-->


<table><tr><td class=normal nowrap>
<li> <a href="<?=$CFG->wwwroot?>/index.php">Home</a>
<li> <a href="<?=$CFG->wwwroot?>/shopping/index.php">Entrar al Shopping</a>

<? if (si_login()) { ?>


<li> <a href="<?=$CFG->wwwroot?>/usuarios/cambiar_clave.php">Cambiar clave</a>
<li> <a href="<?=$CFG->wwwroot?>/usuarios/cambiar_datos.php">Actualizar datos </a>
<li> <a href="<?=$CFG->wwwroot?>/logout.php">Logout</a>

<!--*********************** si es un Admin administrar el sitio **********************-->


<? if (tiene_priv("admin")) { ?>
</td>
</tr>

<tr><td bgcolor="#C70D11" colspan=1><hr size=1></td></tr>

<tr><td nowrap bgcolor="#C70D11" class=normal>


<li> <a href="<?=$CFG->wwwroot?>/admin/">Administrar el Sitio</a>
<? } ?>
<!--**********************************************************************-->
<? } else { ?>
<li> <a href="<?=$CFG->wwwroot?>/login.php">Login</a>
<li> <a href="<?=$CFG->wwwroot?>/usuarios/registrar.php">Crear cuenta</a>
<? } ?>

</td>
</tr>
<tr><td bgcolor="#C70D11" colspan=1><hr size=1></td></tr>

<tr><td nowrap bgcolor="#C70D11" class=normal></td>


</tr>
</table>

Autor: Ing. Oscar R. Espeche 71


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

<!--************************** Carrito de compras *************************************-


->
<table>
<tr>
<td nowrap colspan=2 class=label><a href="<?=$CFG->wwwroot?>
/shopping/ver_carrito.php">Carrito de Compras</a></td>
</tr>

<tr>
<td class=normal>Items:</td>
<td class=label><?=$SESSION["carro"]->cantitems()?></td>
</tr>

<tr>
<td class=normal>Total:</td>
<td class=label><? printf("$%.2f", $SESSION["carro"]->total); ?></td>
</tr>

<tr>
<td nowrap colspan=2 class=label><br><a href="<?=$CFG->wwwroot?>
/shopping/comprar.php">Compre YA!!</a></td>
</tr>

</table>

</td>
<td width=15 nowrap></td>
<td width=100%>
<!--**********en este campo se coloca la imagen central de la pagina, en index.php**************--
>

Autor: Ing. Oscar R. Espeche 72


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Autor: Ing. Oscar R. Espeche 73


PHP,MySQL y E-COMMERCE Diseño de una tienda virtual

Página pie.php
Es una página que se usa para terminar las páginas de la tienda virtual, que contiene cierta información
que se desee incluir en todas las páginas.

En nuestro caso simplemente contiene una línea de terminación y el nombre del sitio como firma
distintiva del sitio.

<!--PIE.PHP-->
<!--**************************pie de la pagina principal ***********->

<!--********************cierra la tabla abierta en header.php *****-->


</td>
</tr>
</table>

<p>
<hr size=1>
<div align=right class=normal>ADMINNET/E-SHOP</div>
</body>
</html>

También se observa que en este archivo se termina la página HTML, cerrando así el contenido gráfico
que fue iniciado en heder.php.

Autor: Ing. Oscar R. Espeche 74

Vous aimerez peut-être aussi