syscover / shopping-cart
购物车包
Requires
- php: >=5.6.4
README
安装
1 - 安装Laravel框架后,在文件 composer.json 中,在 require 对象内插入此值
"syscover/shopping-cart": "~2.0"
并在控制台执行
composer update
2 - 注册服务提供者,在文件 config/app.php 中添加到 providers 数组
Syscover\ShoppingCart\ShoppingCartServiceProvider::class,
并注册别名,在文件 config/app.php 中添加到 aliases 数组
'CartProvider' => Syscover\ShoppingCart\Facades\CartProvider::class,
3 - 执行发布命令
php artisan vendor:publish
##运行Laravel测试
发布测试文件
php artisan vendor:publish --provider="Syscover\ShoppingCart\ShoppingCartServiceProvider"
并使用以下命令运行测试
phpunit tests/ShoppingCartProviderTest
通用配置环境值
我们指示可用的配置变量,要更改它们,您应从文件 environment variables .env 中进行更改
设置产品价格税 [默认值 1]
定义在产品中引入的价格类型,在创建或更新产品时将咨询此选项,您有这些值
- 值:1 不含税
- 值:2 含税
TAX_PRODUCT_PRICES=1
设置运费价格税 [默认值 1]
定义在运费价格中引入的价格类型,在创建或更新运费价格时将咨询此选项
- 值:1 不含税
- 值:2 含税
TAX_SHIPPING_PRICES=1
设置产品显示价格税 [默认值 1]
定义您想要如何显示产品价格,您有这些值
- 值:1 不含税
- 值:2 含税
TAX_PRODUCT_DISPLAY_PRICES=1
设置运费显示价格税 [默认值 1]
定义您想要如何显示运费价格
- 值:1 不含税
- 值:2 含税
TAX_SHIPPING_DISPLAY_PRICES=1
##购物车项提供了以下方法供您使用
要添加项目,我们需要创建一个具有以下属性的 Item 对象
- id:string = 产品 ID
- name:string = 产品名称
- quantity:float = 要添加的产品数量
- inputPrice:float = 单位产品价格
- weight:float [默认 1.000] = 产品重量
- transportable:boolean [默认 true] = 设置产品是否可以交付
- taxRule:TaxRule[] [默认 []] = 为此产品设置税则
- options:array [默认 []] = 设置关联数组以设置自定义选项
将车项添加到购物车,您需要创建 Item 对象以添加购物车,如果想要添加各种元素,您可以使用 Item 对象或 Items 数组。
// Basic add Item to Cart
CartProvider::instance()->add(new Item('293ad', 'Product 1', 1, 9.99));
// Multiple add Items to Cart
CartProvider::instance()->add([
new Item('293ad', 'Product 1', 1, 9.99),
new Item('979ze', 'Product 2', 1, 12.90)
]);
// Multiple add Items with options to Cart
CartProvider::instance()->add([
new Item('293ad', 'Product 1', 1, 9.99, 1.000, true, [], ['size' => 'L']),
new Item('979ze', 'Product 2', 1, 12.90, 1.000, true, [], ['size' => 'M'])
]);
我们创建了一个 TaxRule 对象来计算购物车中的税收,此对象具有以下属性
- name:string = 税名称
- taxRate:float = 税率百分比
- priority:int [默认 0] = 计算税的顺序。如果有不同的优先级,则最高税率先于较低优先级的税率计算小计。如果优先级不同,则最高税率先计算小计,较低优先级的税率后计算
- sortOrder:int [默认 0] = 税在屏幕上出现的顺序
购物车已准备好 TaxRule 对象,您可以为每个 cartItem 对象添加税则。您可以添加一个 TaxRule 或多个税则数组
// Multiple add Items to Cart with options and one tax rule
CartProvider::instance()->add([
new Item('293ad', 'Product 1', 1, 9.99, 1.000, true, new TaxRule('IVA', 21), ['size' => 'L']),
new Item('979ze', 'Product 2', 1, 12.90, 1.000, true, new TaxRule('IVA', 21), ['size' => 'M'])
]);
// Multiple add Items to Cart with options and various tax rules
CartProvider::instance()->add([
new Item('293ad', 'Product 1', 1, 9.99, 1.000, true, [
new TaxRule('IVA', 21, 0, 0),
new TaxRule('Customs', 10, 1, 1),
], ['size' => 'L']),
new Item('979ze', 'Product 2', 1, 12.90, 1.000, true,
new TaxRule('IVA', 21, 0, 0),
new TaxRule('Customs', 10, 1, 1),
], ['size' => 'M'])
]);
定义规则后,您可以使用此方法更改它们
foreach (CartProvider::instance()->getCartItems() as $item)
{
$item->resetTaxRules();
}
当然,如果需要,您也可以重新加载其他规则
foreach (CartProvider::instance()->getCartItems() as $item)
{
$item->addTaxRule(new TaxRule('IVA', 18, 0, 0),);
}
请记住,如果您重置 taxRules 或向项目添加新税则,您必须从小计强制计算金额
$item->calculateAmounts(Cart::PRICE_WITHOUT_TAX);
要更新项目的数量,您可以使用 setQuantity 方法,将 update 方法传递 rowId 和新数量
$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';
CartProvider::instance()->setQuantity($rowId, 2);
如果您想更新项目的更多属性,可以将包含 rowId 的 Item 对象传递给 update 方法,以更新要更新的项目。
CartProvider::instance()->update($rowId, new Item('293ad', 'Product 1', 1, 19.99, 1.000, true, new TaxRule('IVA', 21), ['size' => 'L']));
要从购物车中删除元素,请在购物车上调用 remove() 方法,并传入 rowId。
$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';
CartProvider::instance()->remove($rowId);
如果您想获取购物车中的商品,可以使用 getCartItems 方法。此方法将返回一个包含 CartItems 的集合,您可以遍历它并将内容显示给客户。
CartProvider::instance()->getCartItems();
如果您想获取每个商品的数量,可以在每个商品上使用 getQuantity 方法。
foreach(CartProvider::instance()->getCartItems() as $item)
{
$item->getQuantity();
}
如果您想根据其 rowId 从购物车中获取商品,可以直接在购物车上调用 get() 方法,并传入 rowId。
$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';
CartProvider::instance()->getCartItems()->get($rowId);
如果您想完全删除购物车的所有内容,可以在购物车上调用 destroy 方法。这将移除当前购物实例中的所有 CartItems。
CartProvider::instance()->destroy();
获取不含税的小计价格。
CartProvider::instance()->subtotal;
// or subtotal price formatted
CartProvider::instance()->getSubtotal();
从所有商品中获取税额。
CartProvider::instance()->taxAmount;
// or tax amount formatted
CartProvider::instance()->getTaxAmount();
获取总价。
CartProvider::instance()->total;
// or total price formatted
CartProvider::instance()->getTotal();
设置运费金额。
CartProvider::instance()->shippingAmount = 10.00;
获取运费金额。
CartProvider::instance()->shippingAmount;
// or shipping amount formatted
CartProvider::instance()->getShippingAmount();
要了解购物车中是否包含可运输的商品,您有相应的方法。
CartProvider::instance()->hasItemTransportable();
获取购物车中的商品数量,即总商品数。
CartProvider::instance()->getQuantity();
要查找购物车中的商品,可以使用 search() 方法。如您所见,闭包将接收两个参数。第一个是执行检查的 CartItem。第二个参数是此 CartItem 的 rowId。
此方法将返回一个包含所有找到的项目的集合。
这种搜索方式让您完全控制搜索过程,并允许您创建非常精确和具体的搜索。
CartProvider::instance()->search(function ($cartItem, $rowId) {
return $cartItem->id === 1;
});
该包还支持多个购物车实例。其工作方式如下:您可以使用 CartProvider::instance('newInstance') 设置当前购物车实例,此时,活动的购物车实例是 newInstance,因此当您添加、删除或获取购物车的内容时,您将与购物车的 newInstance 实例一起工作。如果您想切换实例,只需再次调用 CartProvider::instance('otherInstance'),然后您将再次与 otherInstance 一起工作。
默认购物车实例称为 default,因此当您不使用实例时,CartProvider::instance()->getCartItems(); 与 CartProvider::instance('default')->getCartItems() 相同。
以下是一个简单的示例:
CartProvider::instance('shopping')->add(new Item('192ao12', 'Product 1', 1, 9.99));
// Get items of the 'shopping' cart
CartProvider::instance('shopping')->getCartItems();
CartProvider::instance('wishlist')->add(new Item('sdjk922', 'Product 2', 1, 19.95));
// Get items of the 'wishlist' cart
CartProvider::instance('wishlist')->getCartItems();
我们已创建 PriceRule 对象,用于在购物车商品上应用折扣。
- name:string = 价格规则的名称
- description:string = 规则的描述
- discountType:int = 您有多种选择,下面列出了所有选项
- freeShipping:boolean [默认为 false] = 选中此选项以设置具有免费送货的规则
- discountFixed:float [默认为 null] = 设置固定的折扣金额
- discountPercentage:float [默认为 null] = 设置折扣的百分比率
- maximumDiscountAmount:float [默认为 null] = 如果您选择折扣百分比,您可以设置折扣的最大金额
- applyShippingAmount:boolean [默认为 false] = 如果您想将折扣应用到运费金额,请选中此选项
- combinable:boolean [默认为 true] = 设置此价格规则是否可以在同一购物车中与其他规则组合
使用 PriceRule 类中的这些常量,您可以定义折扣类型
WITHOUT_DISCOUNT
DISCOUNT_SUBTOTAL_PERCENTAGE
DISCOUNT_SUBTOTAL_FIXED_AMOUNT
DISCOUNT_TOTAL_PERCENTAGE
DISCOUNT_TOTAL_FIXED_AMOUNT
要设置价格规则,可以使用 addCartPriceRule 方法
CartProvider::instance()->addCartPriceRule(
new PriceRule(
'My first price rule', // name
'For being a good customer', // description
PriceRule::DISCOUNT_SUBTOTAL_PERCENTAGE, // discount type
false, // free shipping
10.00 // discount fixed amount
)
);
在应用定价规则时需要考虑的场景
- 我们已创建针对小计和总价的折扣,但您不能将两个折扣应用到同一个购物车中。
- 如果应用百分比折扣和固定折扣,则首先应用固定折扣,最后应用百分比折扣。