CodeIgnitor: Lớp Shopping Cart

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Lớp Cart cho phép ta thêm các sản phẩm vào session và nó sẽ vẫn ở đó trong khi người dùng duyệt site của ta. Những sản phẩm này có thể được truy xuất và hiển thị theo chuẩn định dạng "shopping cart", cho phép người dùng cập nhật số lượng hoặc xóa sản phẩm từ giỏ hàng.

Quan trọng
Thư viện Cart đã không còn được khuyến khích sử dụng và bạn không nên dùng nữa. Hiện tại nó vẫn còn được giữ lại để đảm bảo sự tương thích ngược.

Lưu ý rằng lớp Cart chỉ cung cấp những chức năng cơ bản về giỏ hàng, nó không cung cấp các chức năng như vận chuyển, ủy quyền thẻ tín dụng và các thành phần xử lý khác.

Khởi tạo lớp Shopping Cart

Quan trọng
Lớp Carts sử dụng lớp Session của CodeIgniter để lưu các thông tin về giỏ hàng vào cơ sở dữ liệu, vì thế trước khi sử dụng lớp Cart thì bạn phải thiết lập một bảng dữ liệu và thiết lập các ưu tiên về session trong tập tin application/config/config.php để sử dụng cơ sở dữ liệu.

Để khởi tạo lớp Shopping Cart trong hàm tạo controller thì ta sử dụng phương thức $this->load->library():

$this->load->library('cart');

Sau khi tải xong thì ta sử dụng lớp này như sau:

$this->cart
Lưu ý
Lớp Cart sẽ tải và khởi tạo tự động lớp Session, vậy nên trừ khi bạn sử dụng các session ở đâu đó trong ứng dụng thì bạn không cần phải tải lớp Session nữa.

Thêm sản phẩm vào giỏ hàng

Để thêm một sản phẩm vào giỏ hàng thì đơn giản là ta chỉ cần truyền một mảng chứa các thông tin về sản phẩm đó tới phương thức $this->cart->insert(). Ví dụ:

$data = array(
        'id'      => 'sku_123ABC',
        'qty'     => 1,
        'price'   => 39.95,
        'name'    => 'T-Shirt',
        'options' => array('Size' => 'L', 'Color' => 'Red')
);

$this->cart->insert($data);
Quan trọng
Bốn chỉ số đầu tiên của mảng (id, qty, price, và name) là bắt buộc. Nếu bạn bỏ qua một chỉ số bất kỳ nào thì dữ liệu sẽ không lưu được vào giỏ hàng. Chỉ số thứ 5 (options) là tùy chọn, ta có thể sử dụng nó trong trường hợp muốn đưa thêm thông tin về sản phẩm vào giỏ như kích thước, màu sắc như ở ví dụ trên.

Dưới đây là mô tả chi tiết cho các chỉ số:

  • id - Mỗi sản phẩm đưa vào giỏ hàng phải có giá trị nhận diện duy nhất (unique identifier), thường thì đó là một  “sku” hoặc một giá trị nhận diện do ta quy định.

  • qty - Số lượng (quantity) mỗi sản phẩm đặt mua.

  • price - Giá của mỗi sản phẩm.

  • name - Tên sản phẩm.

  • options - Các tùy chọn khác, chúng là các thuộc tính thêm vào để nhận diện sản phẩm như màu sắc, size, chúng phải được truyền thông qua một mảng.

Ngoài 5 chỉ số ở trên thì trong nội bộ lớp Cart còn có hai chỉ số nữa là rowid và subtotal, vì thế mà bạn cần tránh đặt tên trùng với những chỉ số này khi chèn dữ liệu vào giỏ hàng.

Ngoài ra bạn cũng có quyền thêm vào những chỉ số theo ý của bạn, và bất kỳ dữ liệu nào bạn đưa vào mảng thì đều sẽ được lưu vào session.

$data = array(
        'id'      => 'sku_123ABC',
        'qty'     => 1,
        'price'   => 39.95,
        'name'    => 'T-Shirt',
        'coupon'         => 'XMAS-50OFF'
);

$this->cart->insert($data);

Phương thức insert() sẽ trả về $rowid nếu bạn thêm vào giỏ hàng thành công một sản phẩm.

Thêm nhiều sản phẩm vào giỏ hàng

Bằng cách sử dụng mảng đa chiều như ví dụ dưới đây thì ta có thể thêm một lúc nhiều sản phẩm vào giỏ hàng, điều này rất thuận tiện nếu như gian hàng của bạn cho phép người dùng cùng lúc chọn nhiều sản phẩm và đưa vào giỏ hàng.

$data = array(
        array(
                'id'      => 'sku_123ABC',
                'qty'     => 1,
                'price'   => 39.95,
                'name'    => 'T-Shirt',
                'options' => array('Size' => 'L', 'Color' => 'Red')
        ),
        array(
                'id'      => 'sku_567ZYX',
                'qty'     => 1,
                'price'   => 9.95,
                'name'    => 'Coffee Mug'
        ),
        array(
                'id'      => 'sku_965QRS',
                'qty'     => 1,
                'price'   => 29.95,
                'name'    => 'Shot Glass'
        )
);

$this->cart->insert($data);

Hiển thị giỏ hàng

Ví dụ dưới đây sẽ cho thấy cách thức hiển thị giỏ hàng của bạn, lưu ý là bạn cần đặt đoạn mã dưới vào tập tin trong thư mục views (ví dụ này sử dụng Form Helper):

<?php echo form_open('path/to/controller/update/method'); ?>

<table cellpadding="6" cellspacing="1" style="width:100%" border="0">

<tr>
        <th>QTY</th>
        <th>Item Description</th>
        <th style="text-align:right">Item Price</th>
        <th style="text-align:right">Sub-Total</th>
</tr>

<?php $i = 1; ?>

<?php foreach ($this->cart->contents() as $items): ?>

        <?php echo form_hidden($i.'[rowid]', $items['rowid']); ?>

        <tr>
                <td><?php echo form_input(array('name' => $i.'[qty]', 'value' => $items['qty'], 'maxlength' => '3', 'size' => '5')); ?></td>
                <td>
                        <?php echo $items['name']; ?>

                        <?php if ($this->cart->has_options($items['rowid']) == TRUE): ?>

                                <p>
                                        <?php foreach ($this->cart->product_options($items['rowid']) as $option_name => $option_value): ?>

                                                <strong><?php echo $option_name; ?>:</strong> <?php echo $option_value; ?><br />

                                        <?php endforeach; ?>
                                </p>

                        <?php endif; ?>

                </td>
                <td style="text-align:right"><?php echo $this->cart->format_number($items['price']); ?></td>
                <td style="text-align:right">$<?php echo $this->cart->format_number($items['subtotal']); ?></td>
        </tr>

<?php $i++; ?>

<?php endforeach; ?>

<tr>
        <td colspan="2"> </td>
        <td class="right"><strong>Total</strong></td>
        <td class="right">$<?php echo $this->cart->format_number($this->cart->total()); ?></td>
</tr>

</table>

<p><?php echo form_submit('', 'Update your Cart'); ?></p>

Cập nhật giỏ hàng

Để cập nhật giỏ hàng thì ta cần truyền một mảng chứa id của sản phẩm và các giá trị muốn update tới phương thức $this->cart->update().

Lưu ý
Nếu số lượng được đặt là 0 thì sản phẩm sẽ bị xóa khỏi giỏ hàng.
$data = array(
        'rowid' => 'b99ccdf16028f015540f341130b6d8ec',
        'qty'   => 3
);

$this->cart->update($data);

//Hoặc một mảng đa chiều để update cùng lúc nhiều sản phẩm

$data = array(
        array(
                'rowid'   => 'b99ccdf16028f015540f341130b6d8ec',
                'qty'     => 3
        ),
        array(
                'rowid'   => 'xw82g9q3r495893iajdh473990rikw23',
                'qty'     => 4
        ),
        array(
                'rowid'   => 'fh4kdkkkaoe30njgoe92rkdkkobec333',
                'qty'     => 2
        )
);

$this->cart->update($data);

Bạn cũng có thể update một chỉ số bất kỳ mà bạn đã định nghĩa trước đó ki tiến hành chèn sản phẩm như options, price hay một chỉ số tùy chỉnh của bạn.

$data = array(
        'rowid'  => 'b99ccdf16028f015540f341130b6d8ec',
        'qty'    => 1,
        'price'  => 49.95,
        'coupon' => NULL
);

$this->cart->update($data);

Row ID là gì?

Row ID là giá trị nhận diện duy nhất được tạo ra từ giỏ hàng khi một sản phẩm nào đó được thêm vào giỏ hàng. Lý do của việc tạo ID là để phân biệt các sản phẩm trong giỏ hàng nhằm mục đích quản lý giỏ hàng dễ dàng hơn.

Ví dụ như khi ai đó mua hai chiếc áo T-Shirt (đều cùng ID) khác nhau về size thì ID của sản phẩm (và các thuộc tính khác) sẽ nhận diện chung cho cả hai chiếc áo này vì nó thực ra là cùng một áo, chỉ khác nhau về size. Khi đó giỏ hàng phải có khả năng nhận diện rằng đây là hai chiêc áo khác nhau (hai sản phẩm khác nhau) và được quản lý độc lập nhau, không liên quan đến nhau. Và giỏ hàng thực hiện việc này bằng cách tạo ra “row ID” duy nhất cho từng sản phẩm dựa trên ID sản phẩm và những tùy chọn khác liên quan.

Có thể nói trong tất cả các trường hợp thì việc cập nhật giỏ hàng sẽ được thực hiện khi người dùng xem giỏ hàng, vì thế mà đối với developer thì ta không cần quan tâm về “row ID”, thay vào đó ta cần đảm bảo rằng trang xem giỏ hàng cần chứa "row ID" và cần đảm bảo rằng nó phải được truyền tới phương thức update() khi người dùng thực hiện thao tác cập nhật giỏ hàng.

Tham khảo lớp CI_Cart

$product_id_rules = '.a-z0-9_-'

Đây là các quy tắc biểu thức chính quy ta dùng để kiểm tra sự hợp lệ của ID sản phẩm, chúng có thể các ký tự thường, ký số, dấu gạch giữa, dấu gạch dưới hoặc dấu chấm.

$product_name_rules = 'w -.:'

Đây là các quy tắc áp dụng cho ID và name của sản phẩm, gồm alpha-numeric, gạch giữa, gạch dưới, dấu hai chấm hoặc dấu chấm.

$product_name_safe = TRUE

Có hoặc không việc cho phép các tên sản phẩm ở dạng an toàn. Mặc định là TRUE.

insert([$items = array()])

Tham số:

$items (array) – Các sản phẩm thêm vào giỏ hàng

Trả về:

TRUE nếu thành công, FALSE nếu thất bại

Kiểu trả về:

 bool

Phương thức này dùng để chèn các sản phẩm và giỏ hàng và lưu vào bảng session.

update([$items = array()])

Tham số:

$items (array) – Các sản phẩm muốn cập nhật trong giỏ hàng

Trả về:

TRUE nếu thành công, FALSE nếu thất bại

Kiểu trả về:

 bool

Phương thức này cho phép thay đổi các thuộc tính của sản phẩm trong giỏ hàng, thông thường nó được gọi từ trang xem giỏ hàng nếu người dùng thay đổi số lượng trước khi tiến hành đặt hàng. Lưu ý rằng mảng dữ liệu phải chứa rowid của mỗi sản phẩm muốn cập nhật.

remove($rowid)

Tham số:

$rowid (int) – ID của sản phẩm muốn xóa khỏi giỏ hàng

Trả về:

TRUE nếu thành công, FALSE nếu thất bại

Kiểu trả về:

 bool

total()

Trả về tổng số sản phẩm trong giỏ hàng.

total_items()

Trả về tổng số sản phẩm khác khau trong giỏ hàng.

contents([$newest_first = FALSE])

Tham số:
  • $newest_first (bool) – Sắp xếp mảng với việc đặt sản phẩm mới nhất trước tiên
Trả về:

Mảng giỏ hàng

Kiểu trả về:

 array

Phương thức này sẽ sắp xếp các sản phẩm trong giỏ hàng theo trật tự sản phẩm mới nhất trước nếu đối số truyền vào là TRUE, ngược lại thì nó sắp xếp theo trật tự sản phẩm cũ nhất trước.

get_item($row_id)

Tham số:

$row_id (int) – Truy xuất tới rowID

Trả về:

Mảng dữ liệu về sản phẩm được truy xuất

Kiểu trả về:

 array

Trả về mảng chứa dữ liệu của sản phẩm tương ứng với row ID hoặc trả về FALSE nếu không tìm thấy.

has_options($row_id = '')

Parameters:

$row_id (int) – Row ID để kiểm tra

Trả về:

TRUE nếu thấy, FALSE nếu ngược lại

Kiểu trả về:

 bool

Phương thức trả về TRUE nếu giỏ hàng có chứa tùy chọn. Phương thức này được thiết kế để sử dụng lặp với phương thức contents(), do đó bạn phải truyền rowid tới phương thức này như thể hiện ở ví dụ bên trên.

product_options([$row_id = ''])

Tham số:

$row_id (int) – Row ID

Trả về:

Mảng các tùy chọn của sản phẩm

Kiểu trả về:

 array

Trả về một mảng các tùy chọn của sản phẩm tương ứng. Phương thức này cũng được thiết kế để sử dụng lặp với phương thức contents(), vì thế mà bạn phải truyền rowid tới phương thức này (bạn xem lại ví dụ bên trên để hiểu rõ hơn).

destroy()

Kiểu trả về:  void

Phương thức này dùng để hủy giỏ hàng, nó thường được gọi đến sau khi xử lý xong đơn hàng của khách hàng.

» Tiếp: Form Validation
« Trước: Lớp Upload File
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!