21.- Área de edición de carrito de compra de nuestro ecommerce en PHP
En este tutorial vamos a crear una area de edición de carrito de compra de nuestro ecommerce en PHP. Vamos a mostrar la lista de productos que el usuario agrego a su carrito pero adema vamos a permitir agregar mas cantidad o borrar un producto en particular de su carrito.
Codigo: https://github.com/programadornovato/ecommerce/commit/197669ea87fad5ab9b49bad7fc2cfd7dd15ec4eb
admin/js/ecommerce.js
$(document).ready(function () { $.ajax({ type: "post", url: "ajax/leerCarrito.php", dataType: "json", success: function (response) { llenaCarrito(response); } }); $.ajax({ type: "post", url: "ajax/leerCarrito.php", dataType: "json", success: function (response) { llenarTablaCarrito(response); } }); function llenarTablaCarrito(response){ var TOTAL=0; response.forEach(element => { var totalProd=element['cantidad']*element['precio']; TOTAL=TOTAL+totalProd; $("#tablaCarrito").append( ` <tr> <td><img src="${element['web_path']}" class="img-size-50"/></td> <td>${element['nombre']}</td> <td>${element['cantidad']}</td> <td>${element['precio']}</td> <td>${totalProd}</td> <td><i class="fa fa-trash text-danger"></i></td> <tr> ` ); }); $("#tablaCarrito").append( ` <tr> <td colspan="4" class="text-right"><strong>Total:</strong></td> <td>${TOTAL}</td> <td></td> <tr> ` ); } $("#agregarCarrito").click(function (e) { e.preventDefault(); var id=$(this).data('id'); var nombre=$(this).data('nombre'); var web_path=$(this).data('web_path'); var cantidad=$("#cantidadProducto").val(); var precio=$(this).data('precio'); $.ajax({ type: "post", url: "ajax/agregarCarrito.php", data: {"id":id,"nombre":nombre,"web_path":web_path,"cantidad":cantidad,"precio":precio}, dataType: "json", success: function (response) { llenaCarrito(response); $("#badgeProducto").hide(500).show(500).hide(500).show(500).hide(500).show(500); $("#iconoCarrito").click(); } }); }); function llenaCarrito(response){ var cantidad=Object.keys(response).length; if(cantidad>0){ $("#badgeProducto").text(cantidad); }else{ $("#badgeProducto").text(""); } $("#listaCarrito").text(""); response.forEach(element => { $("#listaCarrito").append( ` <a href="index.php?modulo=detalleproducto&id=${element['id']}" class="dropdown-item"> <!-- Message Start --> <div class="media"> <img src="${element['web_path']}" class="img-size-50 mr-3 img-circle"> <div class="media-body"> <h3 class="dropdown-item-title"> ${element['nombre']} <span class="float-right text-sm text-primary"><i class="fas fa-eye"></i></span> </h3> <p class="text-sm">Cantidad ${element['cantidad']}</p> </div> </div> <!-- Message End --> </a> <div class="dropdown-divider"></div> ` ); }); $("#listaCarrito").append( ` <a href="index.php?modulo=carrito" class="dropdown-item dropdown-footer text-primary"> Ver carrito <i class="fa fa-cart-plus"></i> </a> <div class="dropdown-divider"></div> <a href="#" class="dropdown-item dropdown-footer text-danger" id="borrarCarrito"> Borrar carrito <i class="fa fa-trash"></i> </a> ` ); } $(document).on("click","#borrarCarrito",function(e){ e.preventDefault(); $.ajax({ type: "post", url: "ajax/borrarCarrito.php", dataType: "json", success: function (response) { llenaCarrito(response); } }); }); });
ajax/agregarCarrito.php
<?php $productos= unserialize($_COOKIE['productos']??''); if(is_array($productos)==false)$productos=array(); $siYaEstaProducto=false; foreach ($productos as $key => $value) { if($value['id']==$_REQUEST['id']){ $productos[$key]['cantidad']=$productos[$key]['cantidad']+$_REQUEST['cantidad']; $siYaEstaProducto=true; } } if($siYaEstaProducto==false){ $nuevo=array( "id"=>$_REQUEST['id'], "nombre"=>$_REQUEST['nombre'], "web_path"=>$_REQUEST['web_path'], "cantidad"=>$_REQUEST['cantidad'], "precio"=>$_REQUEST['precio'] ); array_push($productos,$nuevo); } setcookie("productos",serialize($productos)); echo json_encode($productos); ?>
carrito.php
<table class="table table-striped table-inverse" id="tablaCarrito" > <thead class="thead-inverse"> <tr> <th>Imagen</th> <th>Nombre</th> <th>Cantidad</th> <th>Precio</th> <th>Total</th> <th></th> </tr> </thead> <tbody> </tbody> </table>
detalleProducto.php
<?php $id = mysqli_real_escape_string($con, $_REQUEST['id'] ?? ''); $queryProducto = "SELECT id,nombre,precio,existencia FROM productos where id='$id'; "; $resProducto = mysqli_query($con, $queryProducto); $rowProducto = mysqli_fetch_assoc($resProducto); ?> <!-- Default box --> <div class="card card-solid"> <div class="card-body"> <div class="row"> <div class="col-12 col-sm-6"> <h3 class="d-inline-block d-sm-none"><?php echo $rowProducto['nombre'] ?></h3> <?php $queryImagenes = "SELECT f.web_path FROM productos AS p INNER JOIN productos_files AS pf ON pf.producto_id=p.id INNER JOIN files AS f ON f.id=pf.file_id WHERE p.id='$id'; "; $resPrimerImagen = mysqli_query($con, $queryImagenes); $rowPrimerImaen=mysqli_fetch_assoc($resPrimerImagen); ?> <div class="col-12"> <img src="<?php echo $rowPrimerImaen['web_path'] ?>" class="product-image"> </div> <div class="col-12 product-image-thumbs"> <?php $resImagenes = mysqli_query($con, $queryImagenes); while ($rowImagenes = mysqli_fetch_assoc($resImagenes)) { ?> <div class="product-image-thumb"><img src="<?php echo $rowImagenes['web_path'] ?>"></div> <?php } ?> </div> </div> <div class="col-12 col-sm-6"> <h3 class="my-3"><?php echo $rowProducto['nombre'] ?></h3> <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Doloribus sequi soluta in laborum! Fugit vero placeat quia sapiente iure cum, mollitia eligendi qui ipsam, quasi deleniti odit aut reprehenderit laudantium?</p> <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Doloribus sequi soluta in laborum! Fugit vero placeat quia sapiente iure cum, mollitia eligendi qui ipsam, quasi deleniti odit aut reprehenderit laudantium?</p> <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Doloribus sequi soluta in laborum! Fugit vero placeat quia sapiente iure cum, mollitia eligendi qui ipsam, quasi deleniti odit aut reprehenderit laudantium?</p> <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Doloribus sequi soluta in laborum! Fugit vero placeat quia sapiente iure cum, mollitia eligendi qui ipsam, quasi deleniti odit aut reprehenderit laudantium?</p> <hr> <h4>Existencias: <?php echo $rowProducto['existencia'] ?></h4> <div class="bg-gray py-2 px-3 mt-4"> <h2 class="mb-0"> $<?php echo money_format("%i", $rowProducto['precio']) ?> </h2> </div> <div class="mt-4"> <button class="btn btn-primary btn-lg btn-flat" id="agregarCarrito" data-id="<?php echo $_REQUEST['id'] ?>" data-nombre="<?php echo $rowProducto['nombre'] ?>" data-web_path="<?php echo $rowPrimerImaen['web_path'] ?>" data-precio="<?php echo $rowProducto['precio'] ?>" > <i class="fas fa-cart-plus fa-lg mr-2"></i> Add to Cart </button> </div> <div class="mt-4"> Catnidad <input type="number" class="form-control" id="cantidadProducto" value="1"> </div> <div class="mt-4 product-share"> <a href="#" class="text-gray"> <i class="fab fa-facebook-square fa-2x"></i> </a> <a href="#" class="text-gray"> <i class="fab fa-twitter-square fa-2x"></i> </a> <a href="#" class="text-gray"> <i class="fas fa-envelope-square fa-2x"></i> </a> <a href="#" class="text-gray"> <i class="fas fa-rss-square fa-2x"></i> </a> </div> </div> </div> <div class="row mt-4"> <nav class="w-100"> <div class="nav nav-tabs" id="product-tab" role="tablist"> <a class="nav-item nav-link active" id="product-desc-tab" data-toggle="tab" href="#product-desc" role="tab" aria-controls="product-desc" aria-selected="true">Description</a> <a class="nav-item nav-link" id="product-comments-tab" data-toggle="tab" href="#product-comments" role="tab" aria-controls="product-comments" aria-selected="false">Comments</a> <a class="nav-item nav-link" id="product-rating-tab" data-toggle="tab" href="#product-rating" role="tab" aria-controls="product-rating" aria-selected="false">Rating</a> </div> </nav> <div class="tab-content p-3" id="nav-tabContent"> <div class="tab-pane fade show active" id="product-desc" role="tabpanel" aria-labelledby="product-desc-tab"> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vitae condimentum erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed posuere, purus at efficitur hendrerit, augue elit lacinia arcu, a eleifend sem elit et nunc. Sed rutrum vestibulum est, sit amet cursus dolor fermentum vel. Suspendisse mi nibh, congue et ante et, commodo mattis lacus. Duis varius finibus purus sed venenatis. Vivamus varius metus quam, id dapibus velit mattis eu. Praesent et semper risus. Vestibulum erat erat, condimentum at elit at, bibendum placerat orci. Nullam gravida velit mauris, in pellentesque urna pellentesque viverra. Nullam non pellentesque justo, et ultricies neque. Praesent vel metus rutrum, tempus erat a, rutrum ante. Quisque interdum efficitur nunc vitae consectetur. Suspendisse venenatis, tortor non convallis interdum, urna mi molestie eros, vel tempor justo lacus ac justo. Fusce id enim a erat fringilla sollicitudin ultrices vel metus. </div> <div class="tab-pane fade" id="product-comments" role="tabpanel" aria-labelledby="product-comments-tab"> Vivamus rhoncus nisl sed venenatis luctus. Sed condimentum risus ut tortor feugiat laoreet. Suspendisse potenti. Donec et finibus sem, ut commodo lectus. Cras eget neque dignissim, placerat orci interdum, venenatis odio. Nulla turpis elit, consequat eu eros ac, consectetur fringilla urna. Duis gravida ex pulvinar mauris ornare, eget porttitor enim vulputate. Mauris hendrerit, massa nec aliquam cursus, ex elit euismod lorem, vehicula rhoncus nisl dui sit amet eros. Nulla turpis lorem, dignissim a sapien eget, ultrices venenatis dolor. Curabitur vel turpis at magna elementum hendrerit vel id dui. Curabitur a ex ullamcorper, ornare velit vel, tincidunt ipsum. </div> <div class="tab-pane fade" id="product-rating" role="tabpanel" aria-labelledby="product-rating-tab"> Cras ut ipsum ornare, aliquam ipsum non, posuere elit. In hac habitasse platea dictumst. Aenean elementum leo augue, id fermentum risus efficitur vel. Nulla iaculis malesuada scelerisque. Praesent vel ipsum felis. Ut molestie, purus aliquam placerat sollicitudin, mi ligula euismod neque, non bibendum nibh neque et erat. Etiam dignissim aliquam ligula, aliquet feugiat nibh rhoncus ut. Aliquam efficitur lacinia lacinia. Morbi ac molestie lectus, vitae hendrerit nisl. Nullam metus odio, malesuada in vehicula at, consectetur nec justo. Quisque suscipit odio velit, at accumsan urna vestibulum a. Proin dictum, urna ut varius consectetur, sapien justo porta lectus, at mollis nisi orci et nulla. Donec pellentesque tortor vel nisl commodo ullamcorper. Donec varius massa at semper posuere. Integer finibus orci vitae vehicula placerat. </div> </div> </div> </div> <!-- /.card-body --> </div> <!-- /.card -->
index.php
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>My ecommerce by pn</title> <!-- Tell the browser to be responsive to screen width --> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- Font Awesome --> <link rel="stylesheet" href="admin/plugins/fontawesome-free/css/all.min.css"> <!-- Ionicons --> <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> <!-- Theme style --> <link rel="stylesheet" href="admin/dist/css/adminlte.min.css"> <!-- Daterange picker --> <link rel="stylesheet" href="admin/plugins/daterangepicker/daterangepicker.css"> <!-- Google Font: Source Sans Pro --> <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet"> </head> <body> <?php include_once "admin/db_ecommerce.php"; $con = mysqli_connect($host, $user, $pass, $db); ?> <div class="container"> <div class="row"> <div class="col-12"> <!-- Navbar --> <nav class="navbar navbar-expand navbar-dark"> <!-- Left navbar links --> <ul class="navbar-nav"> <li class="nav-item d-none d-sm-inline-block"> <a href="index.php" class="nav-link">Home</a> </li> <li class="nav-item d-none d-sm-inline-block"> <a href="#" class="nav-link">Contact</a> </li> </ul> <!-- SEARCH FORM --> <form class="form-inline ml-3" action="index.php" > <div class="input-group input-group-sm"> <input class="form-control form-control-navbar bg-gray" type="search" placeholder="Search" aria-label="Search" name="nombre" value="<?php echo $_REQUEST['nombre']??''; ?>" > <input type="hidden" name="modulo" value="productos"> <div class="input-group-append"> <button class="btn btn-navbar" type="submit"> <i class="fas fa-search"></i> </button> </div> </div> </form> <!-- Right navbar links --> <ul class="navbar-nav ml-auto"> <!-- Messages Dropdown Menu --> <li class="nav-item dropdown"> <a class="nav-link" data-toggle="dropdown" href="#" id="iconoCarrito" > <i class="fa fa-cart-plus" aria-hidden="true"></i> <span class="badge badge-danger navbar-badge" id="badgeProducto" ></span> </a> <div class="dropdown-menu dropdown-menu-lg dropdown-menu-right" id="listaCarrito"> </div> </li> <!-- Notifications Dropdown Menu --> <li class="nav-item dropdown"> <a class="nav-link" data-toggle="dropdown" href="#"> <i class="fa fa-user" aria-hidden="true"></i> </a> <div class="dropdown-menu dropdown-menu-lg dropdown-menu-right"> <span class="dropdown-item dropdown-header">15 Notifications</span> <div class="dropdown-divider"></div> <a href="#" class="dropdown-item"> <i class="fas fa-envelope mr-2"></i> 4 new messages <span class="float-right text-muted text-sm">3 mins</span> </a> <div class="dropdown-divider"></div> <a href="#" class="dropdown-item"> <i class="fas fa-users mr-2"></i> 8 friend requests <span class="float-right text-muted text-sm">12 hours</span> </a> <div class="dropdown-divider"></div> <a href="#" class="dropdown-item"> <i class="fas fa-file mr-2"></i> 3 new reports <span class="float-right text-muted text-sm">2 days</span> </a> <div class="dropdown-divider"></div> <a href="#" class="dropdown-item dropdown-footer">See All Notifications</a> </div> </li> </ul> </nav> <?php $modulo=$_REQUEST['modulo']??''; if($modulo=="productos" || $modulo=="" ){ include_once "productos.php"; } if( $modulo=="detalleproducto" ){ include_once "detalleProducto.php"; } if( $modulo=="carrito" ){ include_once "carrito.php"; } ?> </div> </div> </div> <!-- jQuery --> <script src="admin/plugins/jquery/jquery.min.js"></script> <!-- jQuery UI 1.11.4 --> <script src="admin/plugins/jquery-ui/jquery-ui.min.js"></script> <!-- Bootstrap 4 --> <script src="admin/plugins/bootstrap/js/bootstrap.bundle.min.js"></script> <!-- daterangepicker --> <script src="admin/plugins/moment/moment.min.js"></script> <script src="admin/plugins/daterangepicker/daterangepicker.js"></script> <!-- AdminLTE App --> <script src="admin/dist/js/adminlte.js"></script> <!-- AdminLTE dashboard demo (This is only for demo purposes) --> <script src="admin/dist/js/pages/dashboard.js"></script> <script src="admin/js/ecommerce.js"></script> </body> </html>
🎦Curso de PHP🐘 y MySql🐬: https://www.youtube.com/playlist?list=PLCTD_CpMeEKS2Dvb-WNrAuDAXObB8GzJ0
🎦[Curso] Laravel Tutorial en Español: https://www.youtube.com/playlist?list=PLCTD_CpMeEKQcVcM4u4qddLYRE37S_0XS
🎦Curso]Ajax con Jquery de 0 a 100 🌇: https://www.youtube.com/watch?v=52yI0xiB73A&list=PLCTD_CpMeEKSYJ1J15M8PknOMwOpeqsXz
🎦Mysql configurar una replicación maestro – esclavo 🐬: https://www.youtube.com/watch?v=RY-EdBOJWEs
🎦[Curso] Visual Studio Code 🆚 de 0 a 100: https://www.youtube.com/playlist?list=PLCTD_CpMeEKQbdlT8efsS-veXuvYZ1UWn
🎦[Curso] Bootstrap de 0 a 100 🌈: https://www.youtube.com/playlist?list=PLCTD_CpMeEKSVmsZJIumVvfDviuW-c9AT
🎦[Curso] HTML y CSS de 0 a 100 🌐: https://www.youtube.com/playlist?list=PLCTD_CpMeEKS1SmufBGPOV1mjNfCiLwek
🎦 Esta lista de reproducción: https://www.youtube.com/playlist?list=PLCTD_CpMeEKQhRiJx7Wv3pM3rYvT9_CS9 .
Codigos en gdrive: https://drive.google.com/file/d/1QW8ExkL8eS7nQ5HTDvUuSkkGJMSmecGV/view?usp=sharing
Gracias por apoyar este canal: https://www.patreon.com/programadornovato?fan_landing=true
🔗 Facebook: https://facebook.com/ProgramadorNovatoOficial
🔗 Twitter: https://twitter.com/programadornova
🔗 Linkedin: https://www.linkedin.com/in/programadornovato/
🔗 Instagram: https://www.instagram.com/programadornovato/
<<Anterior tutorial Siguiente tutorial >>