jamesdb / cart
一个与框架无关的购物车包。
Requires
- php: ^5.5.0 || ^7.0
- aura/session: ^2.0
- league/event: ^2.1
- moneyphp/money: ^3.0
Requires (Dev)
- phpunit/phpunit: ^4.8
README
一个与框架无关的购物车包。
安装
通过Composer
$ composer require jamesdb/cart
备注
货币值对象
此包使用moneyphp/money(Martin Fowler的货币模式的实现)。由于浮点数不适合货币值,所以避免了使用浮点数。更多信息请参阅下面的链接
- https://martinfowler.com.cn/eaaCatalog/money.html
- http://culttt.com/2014/05/28/handle-money-currency-web-applications/
因此,在处理货币值时,您需要将它们表示为整数,而不是浮点数。
以下是一个示例。
use jamesdb\Cart\CartItem; $item = new CartItem([ ... 'price' => 1099, // Instead of £10.99 or $10.99 etc. ... ]);
设置
要设置购物车实例,您需要将标识符和存储实现传递给购物车构造函数。
默认货币为'GBP',如果您想更改此设置,您需要将您选择的货币传递给setCurrency
方法,如下所示。
可以通过setFormatterCallback
设置自定义格式化回调,有关更多信息,请参阅moneyphp格式化程序。
use jamesdb\Cart\Cart; use jamesdb\Cart\Storage\NativeSessionDriver; use Money\Currencies\ISOCurrencies; use Money\Currency; use Money\Formatter\DecimalMoneyFormatter; $cart = new Cart('cart', new NativeSessionDriver); $cart->setCurrency(new Currency('GBP')); $cart->setFormatterCallback(function ($money) { $currencies = new ISOCurrencies(); $moneyFormatter = new DecimalMoneyFormatter($currencies); return $moneyFormatter->format($money); // outputs in decimal format. });
只要实现了jamesdb\Cart\Storage\StorageInterface
,就可以使用任何存储实现。
用法
添加项目
CartItem
实现了ArrayAccess
,并使用__set
和__get
魔术方法来分配和访问属性。
添加的项目将返回一个rowid。
use jamesdb\Cart\Cart; use jamesdb\Cart\CartItem; $cart = new Cart(...); /** * Assign properties via __set. */ $item1 = new CartItem(); $item1->id = 2731; $item1->name = 'Product'; $item1->price = 1099; $item1->quantity = 1; $cart->add($item1); /** * ---------- */ /** * Assign properties via ArrayAccess. */ $item2 = new CartItem([ 'id' => 2731, 'name' => 'Product', 'price' => 1099, 'quantity' => 1 ]); $cart->add($item2)
更新项目
您可以使用购物车的update
方法或直接在CartItem
上访问属性。
尝试更新购物车中不存在的项目将导致抛出CartItemUpdateException
。
$cart->update('rowid', ['name' => 'Renamed Product']); /** * ---------- */ $cartItem = $cart->find('rowid'); $cartItem->name = 'Renamed Product';
删除项目
尝试删除购物车中不存在的项目将导致抛出CartItemRemoveException
。
$cart->remove('rowid');
清空购物车
$cart->clear();
访问特定项目
要访问特定项目,请使用购物车的getItem
方法。
如果找不到项目,则方法将返回null
。
$cart->getItem('rowid');
访问所有项目
$cart->getItems();
过滤项目
购物车可以通过提供的任何键和值通过filter
方法进行过滤。
// Return all items with a quantity of 2. $cart->filter('quantity', 2); // Return all items with a price of 1000. $cart->filter('price', 1000);
访问项目数量
getTotalUniqueItems
方法将返回一个不包括数量的项目数量。
$cart->getTotalUniqueItems();
getTotalItems
方法将返回一个包括数量的项目数量。
$cart->getTotalItems();
购物车中内置了便利方法isEmpty
,它通过=== 0检查代理到getTotalUniqueItems
。
$cart->isEmpty();
访问价格
使用getTotalPrice
方法获取包括税在内的总价格。
$cart->getTotalPrice();
有时不需要处理税,在这种情况下,您可以使用getTotalPriceExcludingTax
方法。
$cart->getTotalPriceExcludingTax();
获取总购物车税额。
$cart->getTax();
事件
League\Event内置在购物车中,并提供了一些可以发出的事件,这允许您轻松地在购物车生命周期的关键点上挂钩。
您可以通过将监听器附加到购物车上的addEventListener
来订阅这些事件。
所有事件都有内置方法来检索触发事件的项和购物车本身。
$cart->addEventListener('cart.add', function ($event) { $item = $event->getItem(); $cart = $event->getCart(); ... });
cart.add
$cart->addEventListener('cart.add', function ($event) {});
cart.update
$cart->addEventListener('cart.update', function ($event) {});
cart.remove
$cart->addEventListener('cart.remove', function ($event) {});