+20

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:

image.png

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 image.png

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí