适用于电子商务网站应用的现代、灵活的购物车系统。

1.0.0 2024-06-16 13:25 UTC

This package is auto-updated.

Last update: 2024-08-25 19:35:55 UTC


README

Tests Coding Standards PHPStan Software License contributions welcome PHPStan level Build Status Code Intelligence Status Quality Score Code Coverage Total Downloads Latest Version GitHub stars


适用于电子商务网站应用的现代、灵活的购物车系统。

安装

通过Composer安装此包。

从终端运行Composer require命令

composer require dimtrovich/cart

概述

查看以下主题之一,了解有关此库的更多信息

使用

购物车提供了以下方法供您使用

Cart::add()

将商品添加到购物车非常简单,您只需使用add()方法,该方法接受各种参数。

在其最基本的形式中,您可以指定要添加到购物车的商品的id、名称、数量和价格。

Cart::add('293ad', 'Product 1', 1, 9.99);

作为可选的第五个参数,您可以传递一些选项,这样您就可以添加具有相同id但具有(例如)不同尺寸的多个商品。

Cart::add('293ad', 'Product 1', 1, 9.99, ['size' => 'large']);

add()方法将返回您刚刚添加到购物车的商品的CartItem实例。

也许您更喜欢使用数组添加商品?只要数组包含所需的键,您就可以将其传递给方法。选项键是可选的。

Cart::add(['id' => '293ad', 'name' => 'Product 1', 'qty' => 1, 'price' => 9.99, 'options' => ['size' => 'large']]);

在包的版本2中新增了使用Buyable接口的可能性。这是通过您有一个实现Buyable接口的模型来实现的,这将使您实现一些方法,以便包知道如何从您的模型中获取id、名称和价格。这样,您只需将模型和数量传递给add()方法,它就会自动将其添加到购物车。

作为额外的奖励,它将自动将模型与CartItem关联起来

Cart::add($product, 1, ['size' => 'large']);

作为可选的第三个参数,您可以添加选项。

Cart::add($product, 1, ['size' => 'large']);

最后,您还可以一次添加多个商品到购物车。您只需将数组或Buyables的数组传递给add()方法,它们就会被添加到购物车。

当添加多个商品到购物车时,add()方法将返回一个CartItem数组。

Cart::add([
  ['id' => '293ad', 'name' => 'Product 1', 'qty' => 1, 'price' => 10.00],
  ['id' => '4832k', 'name' => 'Product 2', 'qty' => 1, 'price' => 10.00, 'options' => ['size' => 'large']]
]);

Cart::add([$product1, $product2]);

Cart::update()

要更新购物车中的商品,您首先需要商品的rowId。然后您可以使用update()方法来更新它。

如果您只想更新数量,您只需将rowId和新数量传递给更新方法

$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';

Cart::update($rowId, 2); // Will update the quantity

如果您想更新商品的其他属性,您可以传递数组或Buyable作为第二个参数给更新方法。这样,您就可以更新给定rowId的商品的所有信息。

Cart::update($rowId, ['name' => 'Product 1']); // Will update the name

Cart::update($rowId, $product); // Will update the id, name and price

Cart::remove()

要删除购物车中的商品,您还需要商品的rowId。您只需将rowId传递给remove()方法,它就会从购物车中删除该商品。

$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';

Cart::remove($rowId);

Cart::get()

如果您想通过其rowId从购物车中获取商品,您只需在购物车上调用get()方法并传递rowId即可。

$rowId = 'da39a3ee5e6b4b0d3255bfef95601890afd80709';

Cart::get($rowId);

Cart::content()

当然,您还希望获取购物车的商品内容。这就是您将使用content方法的地方。此方法将返回一个包含CartItem的集合,您可以遍历它并将内容显示给客户。

Cart::content();

此方法将返回当前购物车实例的内容,如果需要其他实例的内容,只需简单地链式调用。

Cart::instance('wishlist')->content();

Cart::destroy()

如果您想完全删除购物车的所有内容,可以在购物车上调用destroy方法。这将移除当前购物车实例中的所有购物车商品。

Cart::destroy();

Cart::total()

您可以使用total()方法获取购物车中所有商品的计算总价,前提是已知其价格和数量。

Cart::total();

此方法将自动格式化结果,您可以使用三个可选参数进行修改。

Cart::total($decimals, $decimalSeperator, $thousandSeperator);

您可以在配置文件中设置默认的数字格式。

如果您不使用外观(Facade),而是使用依赖注入(例如在Controller中),您也可以直接获取总属性$cart->total

Cart::tax()

您可以使用tax()方法获取购物车中所有商品的计算税额,前提是已知其价格和数量。

Cart::tax();

此方法将自动格式化结果,您可以使用三个可选参数进行修改。

Cart::tax($decimals, $decimalSeperator, $thousandSeperator);

您可以在配置文件中设置默认的数字格式。

如果您不使用外观(Facade),而是使用依赖注入(例如在Controller中),您也可以直接获取税属性$cart->tax

Cart::subtotal()

您可以使用subtotal()方法获取购物车中所有商品的总价,减去总税额。

Cart::subtotal();

此方法将自动格式化结果,您可以使用三个可选参数进行修改。

Cart::subtotal($decimals, $decimalSeperator, $thousandSeperator);

您可以在配置文件中设置默认的数字格式。

如果您不使用外观(Facade),而是使用依赖注入(例如在Controller中),您也可以直接获取小计属性$cart->subtotal

Cart::count()

如果您想知道购物车中有多少商品,可以使用count()方法。此方法将返回购物车中的商品总数。因此,如果您添加了2本书和1件衬衫,它将返回3个商品。

Cart::count();

Cart::search()

要查找购物车中的商品,您可以使用search()方法。

此方法在版本2中进行了更改。

在幕后,此方法仅使用Laravel Collection类的filter方法。这意味着您必须传递一个闭包,在其中指定您要搜索的术语。

例如,如果您想查找所有ID为1的商品

$cart->search(function ($cartItem, $rowId) {
	return $cartItem->id === 1;
});

如您所见,闭包将接收两个参数。第一个是要检查的商品项。第二个是该商品项的rowId。

此方法将返回一个包含所有找到的商品项的Collection。

这种搜索方式让您完全控制搜索过程,并允许您创建非常精确和具体的搜索。

集合

在多个实例中,购物车将返回一个Collection。这只是一个简单的Laravel Collection,因此您可以在结果上调用所有可以调用Laravel Collection的方法。

例如,您可以快速获取购物车中独特产品的数量

Cart::content()->count();

或者,您可以按产品的ID对内容进行分组

Cart::content()->groupBy('id');

实例

该包支持多个购物车实例。其工作方式如下

您可以通过调用Cart::instance('newInstance')来设置当前的购物车实例。从此时起,活动的购物车实例将是newInstance,因此当您添加、删除或获取购物车的商品时,您将使用购物车的newInstance实例。如果您想切换实例,只需再次调用Cart::instance('otherInstance'),然后您将再次使用otherInstance

所以,这里有一个小例子

Cart::instance('shopping')->add('192ao12', 'Product 1', 1, 9.99);

// Get the content of the 'shopping' cart
Cart::content();

Cart::instance('wishlist')->add('sdjk922', 'Product 2', 1, 19.95, ['size' => 'medium']);

// Get the content of the 'wishlist' cart
Cart::content();

// If you want to get the content of the 'shopping' cart again
Cart::instance('shopping')->content();

// And the count of the 'wishlist' cart again
Cart::instance('wishlist')->count();

注意:请记住,只要在脚本执行期间不设置不同的实例,购物车就会保持在最后设置的实例中。

注意2:默认的购物车实例称为default,因此当您不使用实例时,Cart::content();Cart::instance('default')->content()相同。

模型

因为从购物车项目直接访问模型非常方便,所以能否将模型与购物车中的项目关联起来?假设你在应用程序中有一个 Product 模型。使用 associate() 方法,你可以告诉购物车,购物车中的一个项目与 Product 模型相关联。

这样你就可以直接从 CartItem 访问你的模型了!

你可以通过购物车项目上的 model 属性访问模型。

如果你的模型实现了 Buyable 接口,并且你使用该模型将项目添加到购物车,它将自动关联。

下面是一个示例

// First we'll add the item to the cart.
$cartItem = Cart::add('293ad', 'Product 1', 1, 9.99, ['size' => 'large']);

// Next we associate a model with the item.
Cart::associate($cartItem->rowId, 'Product');

// Or even easier, call the associate method on the CartItem!
$cartItem->associate('Product');

// You can even make it a one-liner
Cart::add('293ad', 'Product 1', 1, 9.99, ['size' => 'large'])->associate('Product');

// Now, when iterating over the content of the cart, you can access the model.
foreach(Cart::content() as $row) {
	echo 'You have ' . $row->qty . ' items of ' . $row->model->name . ' with description: "' . $row->model->description . '" in your cart.';
}

异常

如果出现问题,购物车包将抛出异常。这样,使用购物车包调试代码或根据异常类型处理错误会更加容易。购物车包可以抛出以下异常

事件

购物车还内置了事件。有五个事件可供您监听。

示例

以下是如何在表格中列出购物车内容的示例

// Add some items in your Controller.
Cart::add('192ao12', 'Product 1', 1, 9.99);
Cart::add('1239ad0', 'Product 2', 2, 5.95, ['size' => 'large']);

// Display the content in a View.
<table>
   	<thead>
       	<tr>
           	<th>Product</th>
           	<th>Qty</th>
           	<th>Price</th>
           	<th>Subtotal</th>
       	</tr>
   	</thead>

   	<tbody>

   		<?php foreach(Cart::content() as $row) :?>

       		<tr>
           		<td>
               		<p><strong><?php echo $row->name; ?></strong></p>
               		<p><?php echo ($row->options->has('size') ? $row->options->size : ''); ?></p>
           		</td>
           		<td><input type="text" value="<?php echo $row->qty; ?>"></td>
           		<td>$<?php echo $row->price; ?></td>
           		<td>$<?php echo $row->total; ?></td>
       		</tr>

	   	<?php endforeach;?>

   	</tbody>
   	
   	<tfoot>
   		<tr>
   			<td colspan="2">&nbsp;</td>
   			<td>Subtotal</td>
   			<td><?php echo Cart::subtotal(); ?></td>
   		</tr>
   		<tr>
   			<td colspan="2">&nbsp;</td>
   			<td>Tax</td>
   			<td><?php echo Cart::tax(); ?></td>
   		</tr>
   		<tr>
   			<td colspan="2">&nbsp;</td>
   			<td>Total</td>
   			<td><?php echo Cart::total(); ?></td>
   		</tr>
   	</tfoot>
</table>

贡献

我们 欢迎 社区贡献!无论您是否能编码、编写文档或帮助查找错误,所有贡献都受到欢迎。

contrib.rocks 制作。

致谢

许可

© 2024, Dimitri Sitchet Tomkeu | MIT