Laravel - Xây dựng giỏ hàng đơn giản với bumbummen99
Giới thiệu
Nếu bạn đang triển khai một dự án Thương mại điện tử (E-Commerce), việc xây dựng một giỏ hàng và quản lý nó là một điều rất quan trọng. Thông thường, nếu ta code chức năng này theo cách thủ công thường sẽ tốn kha khá thời gian. Để tiết kiệm effort, ta có thể sử dụng những packages có sẵn hộ trợ về ShoppingCart như Crinsane/LaravelShoppingcart, bumbummen99/shoppingcart, darryldecode/cart,...
Bài viết này, mình sẽ chia sẻ với mọi người package để xây dựng giỏ hàng mà mình đã sử dụng qua - bumbummen99/shoppingcart - về tính năng, cách sử dụng và những lợi ích của nó. Cho đến thời điểm viết bài, Package này tương thích với Laravel từ phiên bản 8+ trở xuống.
Cài đặt
Để cài đặt Package Bumbummen99 chúng ta chạy lệnh sau:
composer require bumbummen99/shoppingcart
Để config lại Package Bumbummen chúng ta phải publish nó trong Vendor thông qua lệnh sau:
php artisan vendor:publish --provider="Gloudemans\Shoppingcart\ShoppingcartServiceProvider"
--tag="config"
Điều này sẽ cung cấp cho chúng ta file cart.php trong folder config để có thể thực hiện các thay đổi với các thông số của nó.
Bây giờ package đã sẵn sàng để bắt đầu sử dụng xây dựng giỏ hàng cho project.
Sử dụng
Khai báo
Để sử dụng nó, trước tiên chúng ta cần gọi nó trong Controller mà ta viết logic cho giỏ hàng
use Cart;
Một số hàm quan trọng
Thêm sản phẩm vào giỏ hàng
Package cung cấp phương thức Cart::add()
để thêm vào giỏ hàng
Cart::add('id' => '293ad', 'name' => 'Product 1', 'qty' => 1, 'price' => 9.99, 'weight' => 550, 'options' => ['size' => 'large']);
Trong đó:
- id, name, qty, price, weight: là những thuộc tính cơ bản cần có của một ứng dụng Shopping Cart, và cũng là bắt buộc của Bumbummen. Nếu không sử dụng thuộc tính nào thì có thể cho giá trị bằng 0 và bỏ qua, tuy nhiên không được phép xóa.
- options: các thuộc tính bổ sung cần dùng của riêng bạn nếu như chưa được khai báo ở trên.
Ví dụ, chẳng hạn một sản phẩm là cái áo, ta cần truyền vào phương thức những giá trị bắt buộc như id để lưu id của nó, name: tên của chiếc áo, qty: số lượng áo người dùng chọn, price: giá, weight: chiếc áo thì không cần khối lượng nên ta truyền giá trị bất kì và không cần quan tâm đến nó. Ngoài ra, để đặt một chiếc áo chúng ta cần có thêm size, màu, code,... ta sẽ thêm chúng vào mảng options.
Ta xây dựng function để thêm chiếc áo, đặt tên là addToCart.
public function addToCart(Request $request, $id)
{
$product = Product::find($id);
$qty = $request->quantity;
$size = $request->size;
Cart::add([
'id' => $product->id,
'name' => $product->name,
'price' => $product->price,
'qty' => $qty,
'weight' => 0,
'options' => ['code' => $product->code, 'image' => $product->image, 'size' => $size]
]);
return redirect("gio-hang");
}
Cùng phân tích một chút. Người dùng thêm chiếc áo, function addToCart được thực thi.
Trước tiên, sẽ find chiếc áo đó theo $id và lấy các trường như quantity, size từ view thông qua Request. Sau đó, sử dụng phương thức Cart::add()
và truyền các thuộc tính như code ở trên để thêm được sản phẩm vào giỏ hàng.
Hiển thị sản phẩm trong giỏ hàng.
Ta dùng:
Cart::content();
Trong đó:
- Cart::content() trả về một mảng các sản phẩm trong giỏ hàng, mỗi sản phẩm sẽ được lưu trữ dưới dạng một đối tượng. Mình ví dụ thử dd(Cart::content()) để xem nó trả ra như nào:
Ngoài một số trường mình đã giới thiệu ở trên, trong ảnh còn một số trường khác như rowId,...
rowId sẽ được package tự động sinh ra sau khi chúng ta sử dụng phương thức add() để thêm sản phẩm vào giỏ hàng. rowId được sinh ra với mục đích để định danh sản phẩm đã được thêm vào giỏ hàng, nó được sử dụng cho một số hàm mình sẽ giới thiệu ở dưới đây.
Mục đích chính của phương thức này là lấy ra những sản phẩm trong giỏ hàng mà người dùng đã addToCart và để xây dựng chi tiết giỏ hàng để hiển thị cho người dùng chẳng hạn.
Lấy ra một sản phẩm trong giỏ hàng
Nếu bạn muốn lấy một mặt hàng từ giỏ hàng bằng cách sử dụng rowId của nó, bạn chỉ cần gọi phương thức get() trên giỏ hàng và chuyển cho nó rowId.
$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';
Cart::get($rowId);
Tính tổng tiền trong giỏ hàng
Tổng trước thuế
// Định dạng tiền chưa được Format
Cart::priceTotal();
// Định dạng tiền được Format tương tự như hàm number_format trong PHP
Cart::priceTotal($decimals, $decimalSeparator, $thousandSeparator);
Tổng sau thuế
Code:
// Định dạng tiền chưa được Format
Cart::total();
// Định dạng tiền được Format tương tự như hàm number_format trong PHP
Cart::total($decimals, $decimalSeparator, $thousandSeparator);
Trong đó:
- Chiết khấu thuế được tính theo %, và mặc định là 21% được khai báo tại file config
config/cart.php
. - Ta có thể config lại bằng cách thay đổi giá trị của trường
'tax' => 21
thành'tax' => 8
theo thuế GTGT tại Việt Nam
Cập nhật giỏ hàng
Để cập nhật giỏ hàng, ta có thể sử dụng phương thức sau
Cart::update($rowId, $qty);
Trong đó:
- $rowId: chuỗi ký tự ngẫu nhiên được sinh một cách tự động để quản lý mỗi sản phảm trong giỏ hàng mỗi khi thêm mới một sản phẩm vào giỏ.
- $qty: số lượng mới cần cập nhật
Nếu bạn muốn cập nhật các tùy chọn trong options của một mặt hàng trong giỏ hàng, có thể dùng
$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';
Cart::update($rowId, ['options' => ['size' => 'S']]);
// Will update the size option with new value
Xóa giỏ hàng
Xóa 1 sản phẩm
Để xóa một mặt hàng khỏi giỏ hàng, bạn sẽ cần lại rowId. RowId này bạn chỉ cần chuyển đến phương thức remove() và nó sẽ xóa mặt hàng khỏi giỏ hàng.
$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';
Cart::remove($rowId);
Xóa toàn bộ giỏ hàng
Nếu bạn muốn xóa hoàn toàn nội dung của giỏ hàng, bạn có thể gọi phương thức destroy(). Thao tác này sẽ xóa tất cả CartItems khỏi giỏ hàng đối với phiên giỏ hàng hiện tại.
Cart::destroy();
Phương thức này sẽ giúp ích cho chúng ta trong trường hợp người dùng đặt hàng thành công tất cả sản phẩm trong giỏ hàng và nó sẽ xóa toàn bộ giỏ hàng đi.
Một số phương thức khác
Cart::weight()
- để lấy tổng trọng lượng của tất cả các mặt hàng trong giỏ hàng, dựa trên trọng lượng và số lượng của chúng
Cart::weight();
// format weight
Cart::weight($decimals, $decimalSeperator, $thousandSeperator);
Cart::tax()
- lấy ra tổng số tiền thuế đã tính cho tất cả các mặt hàng trong giỏ hàng, dựa trên giá và số lượng
Cart:tax()
// format
Cart::tax($decimals, $decimalSeparator, $thousandSeparator);
Cart::count()
- Nếu bạn muốn biết có bao nhiêu mặt hàng trong giỏ hàng của mình, bạn có thể sử dụng phương thức count(). Phương thức này sẽ trả về tổng số mặt hàng trong giỏ hàng. Vì vậy, nếu bạn đã thêm 2 cuốn sách và 1 áo sơ mi, nó sẽ trả về 3 mục.
Cart::count()
Cart::search()
- Tìm kiếm sản phẩm trong giỏ hàng theo thuộc tính của nó
Ví dụ, nếu bạn muốn tìm tất cả các mục có id là 1 Ví dụ
$cart->search(function ($cartItem, $rowId) {
return $cartItem->id === 1;
});
Một số hàm để set giá trị cho Tax, Discount,...
// setTax
Cart::setTax($rowId, $taxRate)
// VD
Cart::setTax($rowId, 21);
$cart->setTax($rowId, 21);
// set discount
Cart::setDiscount($rowId, $taxRate)
// VD
Cart::setDiscount($rowId, 21);
$cart->setDiscount($rowId, 21);
//Set global tax
Cart::setGlobalTax($taxRate)
// set global discount
Cart::setGlobalDiscount($discountRate)
Bạn có thể tìm hiểu thêm một số hàm hoặc hiểu rõ hơn các hàm tại
https://packagist.org/packages/bumbummen99/shoppingcart
Tổng kết
Bài viết trên mình đã tổng hợp lại các hàm và cách sử dụng của package bumbummen99. Mình thấy đây là một package khá là có ích và dễ dàng sử dụng. Mong rằng sẽ giúp ích cho quá trình code của các bạn. Nếu có thiếu xót ở đâu mong nhận được những góp ý của mọi người
Hẹn gặp lại các bạn ở những bài viết sau. Thân ái!
Tài liệu tham khảo: https://packagist.org/packages/bumbummen99/shoppingcart
All rights reserved