vsevolod-ryzhov/yii2-cart

Yii2 购物车组件

安装: 12

依赖关系: 0

建议者: 0

安全性: 0

星标: 0

关注者: 1

分支: 0

开放性问题: 0

类型:yii2-extension

v0.9 2020-07-19 08:50 UTC

This package is auto-updated.

Last update: 2024-09-19 18:12:00 UTC


README

为电子商务网站应用提供的 Yii2 购物车组件

安装

通过 Composer

composer require vsevolod-ryzhov/yii2-cart

使用方法

如果您想使用所有提供的功能,请使用 CombinedStorage。

  1. 使用会话作为购物车存储
// 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);
    }
}
  1. 使用数据库存储(针对认证用户)和会话存储(针对访客)
// 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();
    }
}
  1. 使用 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()
    ]);
}
  1. 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()
        ]);
    }
}