افزودن مقایسه محصولات فروشگاه با js و PHP
افزودن ویژگی مقایسه محصولات فروشگاه – با کمک ویژگی مقایسه به کاربر این امکان داده می شود که بتواند تصمیم گیری بهتری را برای خرید یک محصول داشته باشد .
روند کار مقایسه محصول این است که ویژگی های محصول را به نمایش می گذارد تا کاربر بتواند مشاهده کند و خرید خود را نهایی کند .
فایل index.php صفحه اصلی مقایسه و نمایش محصول
<!DOCTYPE html> <html lang="fa"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>RapidCode.IR - مقایسه محصولات با PHP , js</title> <link rel="stylesheet" href="static/css/style.css"> </head> <body> <a id="introduce" target="_blank" href="https://rapidcode.ir">رپید کد - کتابخانه مجازی برنامه نویسان</a> <div class="container"> <div class="compare">?</div> <section class="compare-page"> <div class="container-compare"></div> <button id="close-compare-page">خروج</button> </section> <?php require_once "shop.php"; $rows = loop_product(); ?> <h1><?php echo $GLOBALS['title'] ?></h1> <?php foreach ($rows as $row) : ?> <article> <img src="<?php echo $row['thumbnail'] ?>" alt="<?php echo $row['title'] ?>"> <h2><?php echo $row['title'] ?></h2> <p><?php echo $row['content'] ?></p> <span id="price"><?php echo $row['price'] ?> تومان</span><br> <a class="compare-product" id="pid_<?php echo $row['id'] ?>" data-ID="<?php echo $row['id'] ?>">مقایسه</a> </article> <?php endforeach; ?> </div> <script src="static/js/app.js"></script> </body> </html>
فایل shop.php که شامل توابع کاربردی برای دریافت اطلاعات از دیتابیس و … می باشد .
فایل shop.php
<?php function loop_product($pid = "", $select = "*") { $mysqli = new mysqli("localhost", "root", "", "posts"); $mysqli->set_charset("utf8"); $stmt = $mysqli->stmt_init(); $GLOBALS['title'] = "لیست محصولات "; $loop_shop_query = ""; if ($pid) { $loop_shop_query = "WHERE id=?"; } $query = "SELECT {$select} FROM `products` {$loop_shop_query}"; $stmt->prepare($query); if ($pid) { $stmt->bind_param("i", $pid); } $rows = []; if ($stmt->execute() && $res = $stmt->get_result()) { if ($stmt->affected_rows || $res->num_rows) { while ($row_loop = $res->fetch_assoc()) { $rows[] = $row_loop; } } } $stmt->close(); $mysqli->close(); return $rows; } function product_exist($pid) { $mysqli = new mysqli("localhost", "root", "", "posts"); $mysqli->set_charset("utf8"); $stmt = $mysqli->stmt_init(); $query = "SELECT id FROM `products` WHERE id=?"; $is_found = 0; $stmt->prepare($query); $stmt->bind_param("i", $pid); if ($stmt->execute() && $stmt->store_result()) { $is_found = $stmt->affected_rows; $stmt->free_result(); } return $is_found; } ?>
فایل compare.php یک api ساده برای مان فراهم می کند که بتوانیم داده های محصول را به صورت json دریافت کنیم .
فایل compare.php
<?php header("Content-Type: application/json"); require_once "shop.php"; $response_list = [ "status" => 0, "msg" => "", "data" => [] ]; if(empty($_GET['pid'])){ $response_list['msg'] = "آیدی محصول وارد نشده"; die(json_encode($response_list)); }else if(!is_numeric($_GET['pid'])){ $response_list['msg'] = "آیدی محصول معتبر نمی باشد"; die(json_encode($response_list)); }else{ $found = product_exist($_GET['pid']); if (!$found) { $response_list['msg'] = "محصول مورد نظر یافت نشد"; die(json_encode($response_list)); } $row = loop_product($_GET['pid']); $row = end($row); $features = $row['features']; $response_list['data'] = [ "id" => $row['id'], "title" => $row['title'], "thumbnail" => $row['thumbnail'], "price" => $row['price'], "features" => $features, ]; $response_list['status'] = 1; $response_list['msg'] = "موفق !"; echo json_encode($response_list); } ?>
فایل app.js برای ثبت event ها و تعامل با compare.php
فایل app.js
document.addEventListener("DOMContentLoaded", function() { // Global variable window.compareListId = []; // access DOM const compareItemButtonDOM = document.getElementsByClassName("compare-product"); const containerCompareDOM = document.getElementsByClassName("container-compare")[0]; const compareButtonDOM = document.getElementsByClassName("compare")[0]; const compareCanvasDOM = document.getElementsByClassName("compare-page")[0]; const compareCanvasCloseDOM = document.getElementById("close-compare-page"); // other property let requestLock = false; let compareCounter = 0; for(var i=0;i<compareItemButtonDOM.length;i++){ const currentElement = compareItemButtonDOM[i]; currentElement.addEventListener("click" , handlerCompareProduct); } compareButtonDOM.addEventListener("click" , handlerCompareButton); compareCanvasCloseDOM.addEventListener("click" , handlerCloseComparePage); // Handlers function handlerCompareProduct(event){ const thisElement = event.target; const productID = thisElement.getAttribute("data-id"); if(thisElement.getAttribute("compare-status") == "true"){ for(var i=0;i<window.compareListId.length;i++){ const currentIndex = window.compareListId[i]; if(productID == currentIndex){ window.compareListId.splice(i , 1); break; } } thisElement.setAttribute("compare-status" , "false"); thisElement.removeAttribute("style"); changeCompareButtonText(); return; } window.compareListId.push(productID); thisElement.setAttribute("compare-status" , "true"); thisElement.style.background = "tomato"; changeCompareButtonText(); return } function handlerCompareButton(event){ compareCanvasDOM.classList.add("page-active"); if(0 < window.compareListId.length && window.compareListId[compareCounter]){ customGetRequestFunc({ params : { "pid" : window.compareListId[compareCounter] }, loadFunc : function(){ requestLock = false; const response = this.response; if(response.status == 0){ alert(response.msg); return 0; } const data = response.data; const htmlContent = generateHtmlElementFunc(data); containerCompareDOM.innerHTML += htmlContent; //window.compareListId.shift(); compareCounter++; handlerCompareButton(); }, }); }else if(containerCompareDOM.innerHTML == ""){ alert("موردی یافت نشد"); } } function handlerCloseComparePage(event){ const thisElement = event.target; containerCompareDOM.innerHTML = ""; thisElement.parentElement.classList.remove("page-active"); compareCounter = 0; } // ajax request function customGetRequestFunc(options) { if(requestLock == true) return; const xhr = new XMLHttpRequest(); xhr.responseType = "json"; requestLock = true; let queryString = new URLSearchParams; const params = options.params; for (const param in params) { queryString.append(param, params[param]); } queryString = "?" + queryString.toString(); xhr.open("GET", location.href + "/compare.php" + queryString); xhr.onload = options.loadFunc; xhr.onerror = function() { requestLock = false; console.warn("[XHR Error]"); } xhr.send(); } // other function getFeatureKeys(){ return { "dimension" : "ابعاد", "weight" : "وزن" , "specialFeatures" : "ویژگی های خاص", "numSimcard" : "تعداد سیمکارت", "internalStorage" : "حافظه داخلی", "pictureResolution" : "رزولوشن دوربین", "selfieResolution" : "رزولوشن سلفی", "videoRecording" : "فیلمبرداری" }; } function generateHtmlElementFunc(data) { const features = JSON.parse(data.features); const featuresDbKey = Object.keys(features); const featureKeys = getFeatureKeys(); let tableRows = ""; for(var i=0;i<featuresDbKey.length;i++){ let currentKey = featuresDbKey[i]; const currentIndex = features[currentKey]; currentKey = featureKeys[currentKey]; tableRows += `<tr><td>${currentKey}</td><td>${currentIndex}</td></tr>`; } const templateHtml = `<article id="pid-${data.id}"><img src="${data.thumbnail}" alt="${data.title}"><h2>${data.title}</h2><table>${tableRows}</table><span id="price">${data.price} تومان</span><br></article>`; return templateHtml; } function changeCompareButtonText(){ compareButtonDOM.textContent = window.compareListId.length; compareButtonDOM.textContent = (compareButtonDOM.textContent == "0") ? "?" : compareButtonDOM.textContent; } });
و در آخر فایل main.css برای یک ظاهر بهتر
فایل main.css
body { text-align: center; overflow-x: hidden; } #introduce { color: white; text-decoration: none; font-weight: bold; display: block; width: 100%; padding: 5px 10px; background-color: #4CAF50; text-align: center; font-size: 25px; margin-bottom: 45px; } .container { width: 70%; margin: 15px auto; direction: rtl; } .ds-none { display: none !important; } article { width: 25%; border: 2px solid skyblue; padding: 10px; float: right; margin-left: 15px; margin-bottom: 25px; } article table { border-collapse: collapse; min-height: 480px; } article table tr td { border: 1px solid black; } article img { width: 200px; height: 200px; object-fit: cover; } article h2 { height: 82px; overflow: hidden; } article p { height: 56px; overflow: hidden; float: right; margin: 2px 0 15px 0; } article a { text-decoration: none; font-weight: bold; background-color: #4CAF50; color: white; width: 100%; padding: 10px 0; display: block; } #price { color: orange; font-weight: bold; margin: 3px; display: block; } .compare { position: fixed; left: 15px; bottom: 15px; cursor: pointer; background-color: tomato; color: white; font-weight: bold; border-radius: 50%; padding: 15px; width: 18px; } .compare-page { display: none; width: 100%; height: 100vh; background-color: rgba(255, 255, 255, 0.85); position: fixed; z-index: 15; top: 0; left: 0; } .page-active { display: block; } .container-compare article { margin-top: 20px; } .container-compare article img { width: 100px; height: 100px; } .compare-product { background-color: green; cursor: pointer; }
دموی برنامه ( نتیجه )
قبل از اجرای برنامه وارد پوشه product TABLE to import شده table را import کنید
ارسال نظر