Pecesama.Net [developing the future]
CICESE, Volcán de Colima, Iglesia de Cihuatlán, Ensenada y Manzanillo
 

 

Temas:

  Inicio PHP
  Introducción
  Lenguaje PHP
  Tipos de datos
  Control
  Arreglos
  Formularios
  Archivos
  Bases de datos
  PHP y MySQL
  PHP y ODBC
  Envió de email
  Attachments
  Sesiones
  Servicios Web

Donar:

Extras:

  Licencia

 

Sesiones

Simule un carrito de compras. Para ello, implemente una clase Carrito que contenga métodos para mostrar contenido, agregar y eliminar del carrito, asi como mostrar el monto de lo comprado. Al entrar a la página de la tienda, se mostrarán los artículos disponibles (los cuales puede definirlos estáticamente en un arreglo o leerlos de un archivo). Después de eso el cliente podra tener una sesión típica de compras.

Para verlo funcionando dar clic aqui

El enunciado esta dado, ahora hay que ver como realizar esto, pero primero analicemos lo siguiente.

¿Qué son las sesiones?

Una sesión es considerada como el intervalo de tiempo empleado por un usuario en recorrer nuestras páginas hasta que abandona nuestro sitio o deja de actuar sobre él durante un tiempo prolongado o bien, sencillamente, cierra el navegador.

PHP nos permite almacenar variables llamadas de sesión que, una vez definidas, podrán ser utilizadas durante este lapso de tiempo por cualquiera de los scripts de nuestro sitio. Estas variables serán especificas del usuario de modo que varias variables sesión del mismo tipo con distintos valores pueden estar coexistiendo para cada una de las sesiones que están teniendo lugar simultáneamente. Estas sesiones tienen además su propio identificador de sesión que será único y específico.

Bien ahora ya conocemos que onda con esto de las sesiones, ahora hay que ver como implementar lo que se pidio, lo primero que hice fue una clase que se encarga de manejar el almacen (class.almacen.php) la cual contiene un arreglo el cual tiene toda la información de los productos y cuenta con los métodos suficientes para su manejo.

 

class.almacen.php



<?php    
    
class Almacen
    
{
        var
$tienda = array(
                
"Accesorios"    => array(
                    
"Microfono"        => array("17","Microfono Inalámbrico"),
                    
"Lentes"        => array("22","Para protejer los ojos"),
                    
"Filtro"        => array("10","Filtro para monitor")
                                                ),
                
"Software"        => array(
                    
"Office"        => array("5000","Suite de oficina"),
                    
"Dreamweaver"    => array("6000","Suite para desarrollo web"),
                    
"Matlab"        => array("2000","Suite matemática")
                                                ),
                
"Hardware"    => array(
                    
"Teclado"    => array("250","Teclado Qwerty"),
                    
"Ratón"        => array("80","Ratón Inalámbrico"),
                    
"Monitor"    => array("2000","Pantalla plana")
                )
            );
        
        function
getTienda()
        {
            return
$this->tienda;
        }
/* function getTienda() */

        
function getCategorias($arreglo)
        {
            foreach (
$arreglo as $nombre=>$email)
            {
               
$catego[]=$nombre;
            }
            return
$catego;
        }
/* function getCategorias($arreglo) */
        
        
function getElementosCate($arreglo, $strTabla)
        {
            foreach (
$arreglo[$strTabla] as $nombre=>$valores)
            {
                
$ele[]=$nombre;
            }
            return
$ele;
        }
/* function getElementosCate($arreglo, $strTabla)  */
        
        
function getPrecio($arreglo, $strNombre)
        {
            foreach (
$arreglo as $grupo=>$elemento)
            {
                foreach (
$elemento as $nombre=>$datos)
                {
                    if (
$nombre == $strNombre)
                    {
                        return
$datos[0];
                    }
                }    
            }
        }
/* function getPrecio($arreglo, $strNombre) */
        
        
function getDescripcion($arreglo, $strNombre)
        {
            foreach (
$arreglo as $grupo=>$elemento)
            {
                foreach (
$elemento as $nombre=>$datos)
                {
                    if (
$nombre == $strNombre)
                    {
                        return
$datos[1];
                    }
                }    
            }
        }
/* function getDescripcion($arreglo, $strNombre) */
        
        
function despliegaArreglo($arreglo, $separa="", $url="", $estilo="", $param="")
        {
            foreach (
$arreglo as $elemento)
            {
                if (
$url!="")
                {
                    if (
$param!="")
                    {        
                        echo
"<a href=\"".$url."?$param=$elemento\" class=\"$estilo\">$elemento</a>$separa";
                    }
                    else
                    {
                        echo
"<a href=\"".$url."\" class=\"$estilo\">$elemento</a>$separa";
                    }
                }
                else
                {
                    echo
"$elemento$separa";
                }
            }
        }
/* function despliegaArreglo($arreglo, $separa="", $url="", $estilo="", $param="") */
                
          
function &getInstancia()
        {
            static
$instancia;
            if (!isset(
$instancia ))
            {
                  
$instancia =& new Almacen();
            }
            return
$instancia;   
          }        
        
    }
/* class Almacen */
?>

 

Ahora necesitamos la clase que se encargue de manejar el carrito de compra(class.carrito.php) la cual contiene los métodos suficientes para su manejo.

 

class.carrito.php



<?
    session_start
();
    
    class
Carrito
    
{
        function
agregaElemento($producto, $cantidad)
        {
            if (!isset(
$_SESSION["carrito"]))
            {
                
$_SESSION["carrito"][$producto]=$cantidad;
            }
/* if (!isset($_SESSION["carrito"])) */
            
else
            {
                foreach(
$_SESSION["carrito"] as $nombre => $unidades)
                {
                    if (
$_GET["producto"]==$nombre)
                    {
                         
$_SESSION["carrito"][$nombre]+=$cantidad;
                         
$encontrado=1;
                     }
/* if ($_GET["producto"]==$nombre) */
                  
} /* foreach($_SESSION["carrito"] as $nombre => $unidades) */
                  
if (!$encontrado)
                {
                    
$_SESSION["carrito"][$_GET["producto"]]=$cantidad;
                }
/* if (!$encontrado) */
            
}  /* else -> if (!isset($_SESSION["carrito"])) */
        
} /* function agregaElemento($producto) */
        
        
function borraElemento($nombre)
        {
            if (isset(
$_SESSION["carrito"]))
            {
                foreach(
$_SESSION["carrito"] as $nombre => $unidades)
                {
                    if (
$_GET["eliminar"]==$nombre)
                    {
                         if (
$_SESSION["carrito"][$nombre]>0)
                        {
                            
$_SESSION["carrito"][$nombre]--;
                        }
/* if ($_SESSION["carrito"][$nombre]>0) */
                     
} /* if ($_GET["eliminar"]==$nombre) */
                  
} /* foreach($_SESSION["carrito"] as $nombre => $unidades) */
            
} /* if (isset($_SESSION["carrito"])) */        
        
} /* function borraElemento($producto) */
        
        
function mostrarCarrito()
        {
            
$productos =& Almacen::getInstancia();
            foreach(
$_SESSION["carrito"] as $nombre => $unidades)
            {
                if (
$unidades>0)
                {
                    echo
"<tr>";
                    echo
"  <td><div align=\"center\">$unidades</div></td>";
                    echo
"  <td><div align=\"center\">$nombre</div></td>";
                    echo
"  <td><div align=\"right\">$&nbsp;".( number_format( $productos->getPrecio($productos->getTienda(),$nombre)*$unidades ) )."</div></td>";
                    echo
"  <td><div align=\"center\"><a href=\"?eliminar=$nombre\" class=\"enlace\">Eliminar</a></div></td>";
                    echo
"</tr>";
                }
/* if ($unidades>0) */                
            
} /* foreach($_SESSION["carrito"] as $nombre => $unidades) */
        
} /* function mostrarCarrito($formato="") */
        
        
function calcularTotal()
        {
            
$productos =& Almacen::getInstancia();
            foreach(
$_SESSION["carrito"] as $nombre => $unidades)
            {
                
$total = $total + (double)($productos->getPrecio($productos->getTienda(),$nombre)*$unidades);
            }
/* foreach($_SESSION["carrito"] as $nombre => $unidades) */
            
return $total;
        }
/* function calcularTotal() */
            
    
} /* class Carrito */
?>

 

La forma de invocarlas en el código es de la siguiente manera:

<?php    
    
include("class.almacen.php");    
    include(
"class.carrito.php");
    
$productos=new Almacen;
    
$compra=new Carrito;
?>
<html>
  <head>
    <title>Ejemplo de carrito de compras con PHP y sesiones by Pecesama</title>
  </head>
  <body>
  <table width=95% border=0 align="center" cellpadding=0 cellspacing=0>
  <tbody>
    <tr>
      <td width="20%" valign=top><br>
        <table width="95%" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#6699cc">
          <tr>
            <td><table width="95%" border="0" align="center" cellpadding="0" cellspacing="0">
                <tr>
                  <td width="71%"> <p align="center"> <br>
                      <font color="#000099" face="Courier New"><strong><font size="4">Elegir
                      categor&iacute;a </font></strong></font>
                    <p>
                        <?php
$productos
->despliegaArreglo($productos->getCategorias($productos->getTienda()),"<br>",$_SERVER["PHP_SELF"], "enlace", "categoria");
                        
?>
                        </p>
                        <br>
                    </p>
                  </td>
                </tr>
              </table></td>
          </tr>
        </table>
        <p>&nbsp;</p></td>
      <td height="100%" vAlign=top><br>
        <table width="95%" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#6699cc">
          <tr>
            <td><table width="95%" border="0" align="center" cellpadding="0" cellspacing="0">
                <tr>
                  <td width="71%"><div align="left">
                      <p align="center"><br><font color="#000099">
                        <strong><font size="4">Elegir producto / cantidad
                        </font></strong></font></p>
                        
                      <?php
                            
if ($_GET["categoria"])
                            {
                                echo
"<center>| ";
                                
$productos->despliegaArreglo($productos->getElementosCate($productos->getTienda(), $_GET["categoria"]), " | ", $_SERVER["PHP_SELF"], "enlace", "producto");
                                echo
"<center>";
                            }
                            if (
$_GET["producto"])
                            {                                
                      
?>
                                <form name="frmAgregarProducto" action="" method="post">          
                                  <table width="95%" border="0" align="center" cellpadding="0" cellspacing="0">
                                    <tr bgcolor="#CCCCCC">
                                      <td> <div align="center"><font face="Courier New"><strong><font color="#FFFFFF">Cantidad</font></strong></font></div></td>
                                      <td> <div align="center"><font face="Courier New"><strong><font color="#FFFFFF">Producto</font></strong></font></div></td>
                                      <td> <div align="center"><font face="Courier New"><strong><font color="#FFFFFF">Descripci&oacute;n</font></strong></font></div></td>
                                      <td> <div align="center"><font face="Courier New"><strong><font color="#FFFFFF">Precio</font></strong></font></div></td>                              
                                    </tr>
                                    <tr>
                                      <td><div align="center">&nbsp;</div></td>
                                      <td><div align="center">&nbsp;</div></td>
                                      <td><div align="center">&nbsp;</div></td>
                                      <td><div align="center">&nbsp;</div></td>
                                    </tr>
                                    <tr>
                                      <td><div align="center">
                                        <input name="txtCantidad" type="text" id="txtCantidad" size="2" value="1">
                                      </div></td>
                                      <td><div align="center"></div></td>
                                      <td><div align="center"><?php echo $productos->getDescripcion($productos->getTienda(),$_GET["producto"]) ?></div></td>
                                      <td><div align="center"><?php echo "$&nbsp;".number_format($productos->getPrecio($productos->getTienda(),$_GET["producto"])) ?></div></td>
                                    </tr>
                                    <tr>
                                      <td><div align="center">&nbsp;</div></td>
                                      <td><div align="center">&nbsp;</div></td>
                                      <td><div align="center">&nbsp;</div></td>
                                      <td><div align="center">&nbsp;</div></td>
                                    </tr>
                                    <tr>
                                      <td><div align="center"><font face="Courier New">&nbsp;</font></div></td>
                                      <td><div align="center"><font face="Courier New">&nbsp;</font></div></td>
                                      <td><div align="center"><font face="Courier New">&nbsp;</font></div></td>
                                      <td><div align="center"><font face="Courier New">
                                        <input type="submit" name="btnAgregar" value="Agregar">
                                        &nbsp;</font></div></td>
                                    </tr>
                                  </table>
                                  </form>
                      <?php
                              
}
                      
?>
                      <br>                            
                        </p>
                    </div></td>
                </tr>
              </table></td>
          </tr>
        </table>
        <br>
        <table width="95%" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#6699cc">
          <tr>
            <td><table width="95%" border="0" align="center" cellpadding="0" cellspacing="0">
                <tr>
                  <td width="71%"><div align="left">
                      <p align="center"><font color="#000099" face="Courier New"><br>
                        <strong><font size="4">Nuestro carrito</font></strong></font></p>
                        <?php
                            
if ($_GET["producto"] and $_POST["btnAgregar"]!="")
                            {
                                
$compra->agregaElemento($_GET["producto"], $_POST["txtCantidad"]);
                            }
                                                    
                            if (isset(
$_SESSION["carrito"]))
                            {
                                if (
$_GET["eliminar"])
                                {
                                    
$compra->borraElemento($_GET["eliminar"]);
                                }
                        
?>                     
                              <table width="95%" border="0" align="center" cellpadding="0" cellspacing="0">
                                <tr bgcolor="#CCCCCC">
                                  <td> <div align="center"><font face="Courier New"><strong><font color="#FFFFFF">Cantidad</font></strong></font></div></td>
                                  <td> <div align="center"><font face="Courier New"><strong><font color="#FFFFFF">Producto</font></strong></font></div></td>
                                  <td> <div align="center"><font face="Courier New"><strong><font color="#FFFFFF">Subtotales</font></strong></font></div></td>
                                  <td> <div align="center"><font face="Courier New"><strong></strong></font></div></td>
                                </tr>
                                <tr>
                                  <td>&nbsp;</td>
                                  <td>&nbsp;</td>
                                  <td>&nbsp;</td>
                                  <td>&nbsp;</td>
                                </tr>
                                <?php echo $compra->mostrarCarrito();    ?>
                                <tr>
                                  <td><hr noshade></td>
                                  <td><hr noshade></td>
                                  <td><hr noshade></td>
                                  <td><hr noshade></td>
                                </tr>
                                <tr>
                                  <td><font face="Courier New">&nbsp;</font></td>
                                  <td><div align="right"><font face="Courier New"><b>&nbsp;Total:
                                      &nbsp;</b></font></div></td>
                                  <td><div align="right"><b><?php echo "$&nbsp;".$compra->calcularTotal(); ?></b></div></td>
                                  <td><div align="right"><font face="Courier New">&nbsp;</font></div></td>
                                </tr>
                              </table>                            
                        <?php                     
                            
}
                        
?>                       
                        <br>                        
                    </div></td>
                </tr>
              </table></td>
          </tr>
        </table>
        </td>
    </tr>
    <!--Inicio de las secciones-->
    <!--Fin de las secciones-->
  </tbody>
</table>
</body>
</html>

 

 

Veamos como quedó la utilería en un screenshot




 

 

(cc) 2002-2006 Pedro Santana. Some Rights Reserved.
Visitante 1182652 a partir del 17/Oct/2002

Sitio orgullosamente mexicano