Thứ Năm, 23 tháng 6, 2016

Phần 18 - Làm giỏ hàng


- Bây giờ sẽ làm phần giỏ hàng.Web sẽ lập trình cho người dùng mua hàng.Bạn thêm đoạn code sau vào file 'chi_tiet_san_pham.php' (phía sau dòng code echo $tv_2['gia'];) :

echo "<br>";
echo "<br>";
echo "<form>";
    echo "<input type='hidden' name='thamso' value='gio_hang' > ";
    echo "<input type='hidden' name='id' value='".$_GET['id']."' > ";
    echo "<input type='text' name='so_luong' value='1' style='width:50px' > ";
    echo "<input type='submit' value='Thêm vào giỏ' style='margin-left:15px' > ";
echo "</form>";

+ Đoạn code trên xuất 1 biểu mẫu (form) để cho người dung thêm sản phẩm vào giỏ hàng.Ở đây dùng phương thức 'GET' và 4 thẻ 'input'

+ Thẻ 'input' 1 dùng kiểu 'hidden' để tạo giá trị ngầm là 'gio_hang' => khi người dùng gửi biểu mẫu đi (gửi form) thì trên liên kết web chuyển đến sẽ có biến 'thamso trên url' (khai báo tại thuộc tính 'name' ) sẽ có giá trị là 'gio_hang'

+ Thẻ 'input' 2 dùng kiểu 'hidden' để tạo giá trị là id của sản phẩm hiện tại đang xem ($_GET['id'] , giá trị này sẽ lấy từ biến 'id trên url') => khi người dùng gửi biểu mẫu đi (gửi form) thì trên liên kết web chuyển đến sẽ có biến 'id trên url' (khai báo tại thuộc tính 'name' ) sẽ có giá trị là id của sản phẩm trước đó đã xem tại trang chi tiết sản phẩm

+ Thẻ 'input' 3 dùng kiểu 'text' để tạo ra khung văn bản có giá trị nội dung là '1' ('value='1') => khi người dùng gửi biểu mẫu đi (gửi form) thì trên liên kết web chuyển đến sẽ có biến 'so_luong trên url' (khai báo tại thuộc tính 'name' ) sẽ có giá trị là '1' hoặc giá trị tùy thuộc vào việc người dùng nhập vào nội dung gì(nhập số '3' thì biến 'so_luong sẽ có giá trị '3' )

+ Thẻ 'input' 4 dùng kiểu 'submit' => tạo ra 1 nút có giá trị nội dung là 'Thêm vào giỏ' (khai báo ở thuộc tính 'value') và khi người dùng bấm vào nút này thì biểu mẫu (form) này sẽ được gửi đi

+ Giả sử bạn đang xem chi tiết sản phẩm của 'Sản phẩm 3_18' , rồi bạn nhập số '4' vào khung văn bản , rồi bạn bấm vào nút 'Thêm vào giỏ' thì có thể trang web sẽ chuyển đến liên kết có địa chỉ tương tự như sau :

?thamso=gio_hang&id=38&so_luong=4

- Bạn thêm đoạn code sau trước chữ default trong file 'dieu_huong.php' :

case "gio_hang":
    include("chuc_nang/gio_hang/gio_hang.php");
break;

- Đoạn code trên sẽ gọi file 'gio_hang.php' (trong thư mục 'gio_hang') vào file 'index.php' khi mà người dùng truy cập vào web mà trên địa chị có biến 'thamso trên url' có giá trị là 'gio_hang' , nghĩa là tải file 'gio_hang.php' khi người dùng bấm vào nút "Thêm vào giỏ"

- Bạn tiến thành tạo thư mục 'gio_hang' trong thư mục 'chuc_nang' , rồi tạo file 'gio_hang.php' trong thư mục 'gio_hang'

- Để làm phần giỏ hàng thì cần dùng đến session trong php.Để hiểu về session thì bạn cần đọc bài viết này :

Session trong php (Bấm vào để xem)

- Bạn tiến hành khai báo sử dụng session tại đầu file 'index.php' bằng cách thêm dòng code sau trước dòng code include("ket_noi.php"); :

session_start();

- Nếu không khai báo sử dụng session thì sẽ không làm được phần giỏ hàng.Bạn thêm đoạn code sau vào file 'gio_hang.php' :

<?php
    if(isset($_GET['id']))
    {
        if(isset($_SESSION['id_them_vao_gio']))
        {
            $so=count($_SESSION['id_them_vao_gio']);
            $trung_lap="khong";
            for($i=0;$i<count($_SESSION['id_them_vao_gio']);$i++)
            {
                if($_SESSION['id_them_vao_gio'][$i]==$_GET['id'])
                {
                    $trung_lap="co";
                    $vi_tri_trung_lap=$i;
                    break;
                }
            }
            if($trung_lap=="khong")
            {
                $_SESSION['id_them_vao_gio'][$so]=$_GET['id'];
                $_SESSION['sl_them_vao_gio'][$so]=$_GET['so_luong'];
            }
            if($trung_lap=="co")
            {
                $_SESSION['sl_them_vao_gio'][$vi_tri_trung_lap]=$_SESSION['sl_them_vao_gio'][$vi_tri_trung_lap]+$_GET['so_luong'];
            }
        }
        else
        {
            $_SESSION['id_them_vao_gio'][0]=$_GET['id'];
            $_SESSION['sl_them_vao_gio'][0]=$_GET['so_luong'];
        }
    }
?>

+ Đoạn code trên là thêm hoặc sửa 2 mảng session 'id_them_vao_gio' và 'sl_them_vao_gio'.Mảng session 'id_them_vao_gio' dùng để lưu id sản phẩm của trang chi tiết sản phẩm trước đó (bấm thêm vào giỏ bao nhiêu sản phẩm khác nhau thì sẽ có bấy nhiêu 'id' để lưu vào session).Mảng session 'sl_them_vao_gio' dùng để lưu số lượng sản phẩm vào giỏ theo từng id sản phẩm

+ Dòng code if(isset($_GET['id'])) nhằm mục đích khai báo rằng chỉ khi nào tồn tại biến 'id trên url' thì mới thêm hoặc sửa 2 mảng session 'id_them_vao_gio' và 'sl_them_vao_gio'.Ở đây làm thế là vì có trường hợp người dùng chỉ xem giỏ hàng chứ không bấm nút 'Thêm vào giỏ' (trường hợp này sẽ làm vào chỗ nào đó sau phần này , bạn tự tìm chỗ đó)

+ Dòng code if(isset($_SESSION['id_them_vao_gio'])) là để chia ra làm 2 trường hợp : trường hợp 1 là để xác định tình huống người dùng đã thêm sản phẩm vào giỏ hàng rồi tiếp tục thêm nữa , trường hợp 2 là người dùng mới lần đầu thêm sản phẩm vào giỏ hàng.Dòng code if(isset($_SESSION['id_them_vao_gio'])) là để kiểm tra sự tồn tại của mảng session id_them_vao_gio.Nếu tồn tại thì vào trường hợp 1 , nếu không tồn tại thì vào trường hợp 2

+ Nếu rơi vào trường hợp 1 thì kiểm tra tiếp sự trùng lặp , vì có trường hợp người dùng thêm lại sản phẩm cũ thì lúc đó chỉ cần cập nhật lại số lượng sản phẩm.Cho vòng lặp 'for' chạy hết mảng session 'id_them_vao_gio' (nếu rơi vào trường hợp này thì trước đó đã tạo mảng session 'id_them_vao_gio' rồi) , sau đó so 'id' , nếu 'id trong giỏ' ($_SESSION['id_them_vao_gio'][$so]) bằng với 'id trên url' (id mua hàng từ trang chi tiết sản phẩm) thì xảy ra trùng lặp (nghĩa là thêm tiếp sản phẩm cũ vào giỏ hàng) thì lúc này biến 'trung_lap' có giá trị là 'co' , ngược lại thì biến 'trung_lap' có giá trị là 'khong'

+ Nếu biến 'trung_lap' là có thì chỉ cần cập nhật số lượng :

$_SESSION['sl_them_vao_gio'][$vi_tri_trung_lap]=$_SESSION['sl_them_vao_gio'][$vi_tri_trung_lap]+$_GET['so_luong'];

+ Biến 'vi_tri_trung_lap' được lấy từ biến 'i' khi chạy vòng lặp 'for' kiểm tra sự trùng lặp(vào lúc thấy được sự trùng lặp thì phá vòng lặp bằng lệnh 'break').$_GET['so_luong'] được lấy từ số lượng nhập vào của khung văn bản (input) trước đó (nhập bao nhiêu thì $_GET['so_luong'] giá trị bấy nhiêu).Số lượng cập nhật là lấy số lượng cũ ($_SESSION['sl_them_vao_gio'][$vi_tri_trung_lap]) cộng với số lượng mới ($_GET['so_luong'])

+ Còn nếu không có trùng lặp thì tạo thêm 2 session 'id_them_vao_gio' và session 'sl_them_vao_gio'.Dĩ nhiên session mới thì sẽ có id mới ($_SESSION['id_them_vao_gio'][$so]=$_GET['id']; , $_GET['id'] chính là id trang chi tiết sản phẩm trước đó) và số lượng mới ($_GET['so_luong'])

+ Còn nếu rơi vào trường hợp 2 (lần đầu thêm vào giỏ) thì khởi tạo 2 biến session ở giá trị đầu tiên (giá trị '0' , hay chính là mảng đầu tiên).Hai biến session này là 'id_them_vao_gio' và 'sl_them_vao_gio' và được gán giá trị là id mới , số lượng mới :

$_SESSION['id_them_vao_gio'][0]=$_GET['id'];
$_SESSION['sl_them_vao_gio'][0]=$_GET['so_luong'];

- Hết phần này thì nội dung trang 'chi_tiet_san_pham.php' tương tự như sau :

<?php
    $id=$_GET['id'];
    $tv="select * from san_pham where id='$id'";
    $tv_1=mysql_query($tv);
    $tv_2=mysql_fetch_array($tv_1);
    $link_anh="hinh_anh/san_pham/".$tv_2['hinh_anh'];
    echo "<table>";
        echo "<tr>";
            echo "<td width='250px' align='center' >";
                echo "<img src='$link_anh' width='150px' >";
            echo "</td>";
            echo "<td valign='top' >";
                echo "<a href='#'>";
                    echo $tv_2['ten'];
                echo "</a>";
                echo "<br>";
                echo "<br>";
                echo $tv_2['gia'];
                echo "<br>";
                echo "<br>";
                echo "<form>";
                    echo "<input type='hidden' name='thamso' value='gio_hang' > ";
                    echo "<input type='hidden' name='id' value='".$_GET['id']."' > ";
                    echo "<input type='text' name='so_luong' value='1' style='width:50px' > ";
                    echo "<input type='submit' value='Thêm vào giỏ' style='margin-left:15px' > ";
                echo "</form>";
            echo "</td>";
        echo "</tr>";
        echo "<tr>";
            echo "<td colspan='2' >";
                echo "<br>";
                echo "<br>";
                echo $tv_2['noi_dung'];
            echo "</td>";
        echo "</tr>";
    echo "</table>";
?>

- Trang 'dieu_huong.php' có nội dung tương tự như sau :

<?php
    if(isset($_GET['thamso'])){$tham_so=$_GET['thamso'];}else{$tham_so="";}
    switch($tham_so)
    {
        case "xuat_san_pham":
            include("chuc_nang/san_pham/xuat.php");
        break;
        case "chi_tiet_san_pham":
            include("chuc_nang/san_pham/chi_tiet_san_pham.php");
        break;
        case "xuat_san_pham_2":
            include("chuc_nang/san_pham/xuat_toan_bo_san_pham.php");
        break;
        case "xuat_mot_tin":
            include("chuc_nang/xuat_mot_tin.php");
        break;
        case "tim_kiem":
            include("chuc_nang/tim_kiem/xuat_san_pham_tim_kiem.php");
        break;
        case "gio_hang":
            include("chuc_nang/gio_hang/gio_hang.php");
        break;
        default:
            echo "trang chủ";
    }
?>

- Trang 'index.php' có nội dung tương tự như sau :

<?php
    session_start();
    include("ket_noi.php");
?>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Web bán hàng</title>
        <link rel="stylesheet" type="text/css" href="giao_dien/giao_dien.css">
    </head>
    <body>
        <center>
            <table width="990px">
                <tr>
                    <td colspan="3"><img src="hinh_anh/banner.JPG" ></td>
                </tr>
                <tr>
                    <td colspan="3" height="50px" >
                        <?php
                            include("chuc_nang/menu_ngang/menu_ngang.php");
                        ?>
                    </td>
                </tr>
                <tr>
                    <td width="170px" valign="top" >
                    <?php
                        include("chuc_nang/menu_doc/menu_doc.php");
                    ?>
                    </td>
                    <td width="650px" valign="top" >
                        <?php
                            include("chuc_nang/dieu_huong.php");
                        ?>
                    </td>
                    <td width="170px" valign="top" >
                    <?php
                        include("chuc_nang/tim_kiem/vung_tim_kiem.php");
                    ?>
                    </td>
                </tr>
                <tr>
                    <td colspan="3">Footer</td>
                </tr>
            </table>
        </center>
    </body>
</html>