vsevolod-ryzhov / yii2-cart
Yii2 购物车组件
v0.9
2020-07-19 08:50 UTC
Requires
- php: >=7.1
- yiisoft/yii2: ^2.0
Requires (Dev)
- phpunit/phpunit: 4.0
README
为电子商务网站应用提供的 Yii2 购物车组件
安装
通过 Composer
composer require vsevolod-ryzhov/yii2-cart
使用方法
如果您想使用所有提供的功能,请使用 CombinedStorage。
- 使用会话作为购物车存储
// setup Cart component using included SessionStorage class class Init implements BootstrapInterface { public function bootstrap($app): void { $container = Yii::$container; $container->setSingleton(Cart::class, [], [ new SessionStorage('cart', $app->session), new BaseCost() ]); } } // Product class must implement ProductInterface class Product implements ProductInterface { public function getId() { return $this->id; } public function getPrice() { return $this->price; } } // inject component in your controller class CartController extends Controller { /** * @var Cart */ private $cart; public function __construct($id, $module, Cart $cart, $config = []) { parent::__construct($id, $module, $config); $this->cart = $cart; } public function actionAdd($id, $count = 1) { $product = Product::findOne($id); $this->cart->add($product, $count); } }
- 使用数据库存储(针对认证用户)和会话存储(针对访客)
// create converter class which extends included AbstractProductConverter // this class must convert your Product model class to CartItem class // this class is used in Init class on DatabaseStorage initialization class ProductToCartConverter extends AbstractProductConverter { public function convertProductToCartItem($product, int $quantity): CartItem { /* @var $product Product */ return new CartItem($product, $quantity); } } // setup Cart component using included SessionStorage class class Init implements BootstrapInterface { public function bootstrap($app): void { $container = Yii::$container; if ($app->user->isGuest) { $container->setSingleton(Cart::class, [], [ new SessionStorage('cart', $app->session), new BaseCost() ]); } else { // you can specify database options for DatabaseStorage class (cartItemsTable & etc) $container->setSingleton(Cart::class, [], [ new DatabaseStorage($app->user->id, $app->db, new ProductsQuery(Product::class), new ProductToCartConverter), new BaseCost() ]); } } } // Query class for Product model must extends included AbstractProductQuery class ProductsQuery extends AbstractProductQuery { /** * @return ProductsQuery */ public function canBuy(): ActiveQuery { // query product which user can buy return $this->active()->available(); } }
- 使用 CookieStorage
// use ProductToCartConverter from previews sample class Init implements BootstrapInterface { $container->setSingleton(Cart::class, [], [ new CookieStorage( new CookieStorageSettings('cart', 3600), $app->request->cookies, $app->response->cookies, new ProductsQuery(Product::class), new ProductToCartConverter ), new BaseCost() ]); }
- CombinedStorage(CookieStorage + DatabaseStorage)
class Init implements BootstrapInterface { public function bootstrap($app): void { $container = Yii::$container; $container->setSingleton(Cart::class, [], [ new CombinedStorage( $app->user, $app->db, new CookieStorageSettings('cart', 3600), $app->request->cookies, $app->response->cookies, new ProductsQuery(Product::class), new ProductToCartConverter ), new BaseCost() ]); } }