Página principal | 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 | Sesiones | Servicios Web

 

Sesiones  

 

Simular un carrito de compras 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.

 

El ejercicio 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