dvizh/yii2-cart

yii2-cart 是一个简单的购物车模块,用于收集实现购物车接口的应用模型和插件

安装数: 4,446

依赖: 3

建议者: 0

安全性: 0

星级: 21

关注者: 7

分支: 10

开放问题: 9

类型:yii2-extension

dev-master 2018-02-05 13:01 UTC

This package is not auto-updated.

Last update: 2024-09-20 22:18:01 UTC


README

这是用于 Yii2 框架的购物车模块。允许添加任何实现 dvizh\cart\interfaces\CartElement 接口的模型到购物车。

yii2-cart

若要添加订单功能,可以使用此模块:dvizh/yii2-order

安装

执行以下命令

php composer require dvizh/yii2-cart "@dev"

或者将以下内容添加到 composer.json 的 require 部分

"dvizh/yii2-cart": "@dev",

然后执行

php composer update

接下来,迁移数据库

php yii migrate --migrationPath=vendor/dvizh/yii2-cart/src/migrations

连接和配置

在应用程序配置文件中添加 cart 组件

    'components' => [
        'cart' => [
            'class' => 'dvizh\cart\Cart',
            'currency' => 'р.', //Валюта
            'currencyPosition' => 'after', //after или before (позиция значка валюты относительно цены)
            'priceFormat' => [2,'.', ''], //Форма цены
        ],
        //...
    ]

以及模块(如果您想使用小部件的话)

    'modules' => [
        'cart' => [
            'class' => 'dvizh\cart\Module',
        ],
        //...
    ]

使用

可以通过组件手动添加元素到购物车,也可以使用现成的小部件。以下是一个将商品添加到购物车的示例动作

//use...
class ProductController extends Controller
{
    public function actionAddToCart($id)
    {
        //Любая модель
        $model = $this->findModel($id);
        //Кладем ее в корзину (в количестве 1, без опций)
        $cartElement = yii::$app->cart->put($model, 1, []);
    }
}

可以添加到购物车的任何模型都必须实现 CartElement 接口。以下是一个模型示例

//...
class Product extends ActiveRecord implements \dvizh\cart\interfaces\CartElement
{
    //..
    public function getCartId()
    {
        return $this->id;
    }
    
    public function getCartName()
    {
        return $this->name;
    }
    
    public function getCartPrice()
    {
        return $this->price;
    }
    
    //Опции продукта для выбора при добавлении в корзину
    public function getCartOptions()
    {
        return [
            '1' => [
                'name' => 'Цвет',
                'variants' => ['1' => 'Красный', '2' => 'Белый', '3' => 'Синий'],
            ],
            '2' => [
                'name' => 'Размер',
                'variants' => ['4' => 'XL', '5' => 'XS', '6' => 'XXL'],
            ]
        ];
    }
    //..
}

获取购物车元素

//...
$elements = yii::$app->cart->elements;

小部件

模块包含几个小部件。它们都使用 Ajax。

<?php
use dvizh\cart\widgets\BuyButton;
use dvizh\cart\widgets\TruncateButton;
use dvizh\cart\widgets\CartInformer;
use dvizh\cart\widgets\ElementsList;
use dvizh\cart\widgets\DeleteButton;
use dvizh\cart\widgets\ChangeCount;
use dvizh\cart\widgets\ChangeOptions;
?>

<?php /* Выведет кнопку покупки */ ?>
<?= BuyButton::widget([
	'model' => $model,
	'text' => 'Заказать',
	'htmlTag' => 'a',
	'cssClass' => 'custom_class'
]) ?>

<?php /* Выведет количество товаров и сумму заказа */ ?>
<?= CartInformer::widget(['htmlTag' => 'a', 'offerUrl' => '/?r=cart', 'text' => '{c} на {p}']); ?>

<?php /* Выведет кнопку очистки корзины */ ?>
<?= TruncateButton::widget(); ?>

<?php
/*
Выведет корзину с выпадающими или обычными ('type' => ElementsList::TYPE_FULL) элементами списка.
Можно передать перечень дополнительных полей через otherFields (['Остаток' => 'amount']).
*/
?>
<?=ElementsList::widget(['type' => ElementsList::TYPE_DROPDOWN]);?>

<?php /* Выведет кнопку удаления элемента */ ?>
<?=DeleteButton::widget(['model' => $item]);?>

<?php
/*
Виджеты ниже позволят выбрать кол-во или опции элемента.
Можно передать как модель элемента корзины, так и сам продукт,
когда он еще не стал элементом.
*/ ?>
<?=ChangeCount::widget(['model' => $item]);?>
<?php /* У ChangeOptions можно изменить вид ('type' => ChangeOptions::TYPE_RADIO) */ ?>
<?=ChangeOptions::widget(['model' => $item]);?>

折扣

折扣通过行为和/或事件实现。可以为购物车分配任何行为(在配置中设置)

        'cart' => [
            'class' => 'dvizh\cart\Cart',
            //...
            'as discount' => [
                'class' => 'dvizh\cart\behaviors\Discount',
                'percent' => 50,
            ],
        ],

行为连接到 EVENT_CART_COST 事件并设置折扣(参见 dvizh\cart\behaviors\Discount)。

可以直接连接到事件

        'cart' => [
            'class' => 'dvizh\cart\Cart',
            //...
            'on cart_cost' => function($event) {
                $event->cost = ($event->cost*50)/100;
            }
        ],

事件

所有购物车事件

  • EVENT_CART_COST - 总价格变化
  • EVENT_CART_COUNT - 数量变化
  • EVENT_CART_TRUNCATE - 清空购物车
  • EVENT_CART_PUT - 添加元素
  • EVENT_ELEMENT_COST - 元素价格变化
  • EVENT_ELEMENT_ROUNDING - 元素价格四舍五入