手枪88/yii2-cart

yii2-cart 是一个简单的购物车模块,用于收集实现购物车接口的应用程序模型 + 小部件

安装数量: 1,165

依赖项: 4

建议者: 0

安全性: 0

星标: 8

关注者: 9

分支: 7

开放问题: 4

类型:yii2-extension

dev-master 2017-04-24 06:03 UTC

This package is auto-updated.

Last update: 2024-08-27 21:52:48 UTC


README

模块的开发始于2017年4月24日,请在此处查看:[dvizh/yii2-cart](https://github.com/dvizh/yii2-cart)。建议从 Dvizh 的仓库安装模块,那里有最新版本。

Yii2-cart

这是为 Yii2 框架设计的购物车模块。允许将任何实现 pistol88\cart\interfaces\CartElement 接口的模型添加到购物车中

yii2-cart

要添加订单功能,可以使用此模块:[pistol88/yii2-order](https://github.com/pistol88/yii2-order)。

安装

执行以下命令

php composer require pistol88/yii2-cart "*"

或将其添加到 composer.json 中

"pistol88/yii2-cart": "*",

然后执行

php composer update

接下来,迁移数据库

php yii migrate --migrationPath=vendor/pistol88/yii2-cart/migrations

连接和设置

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

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

和模块(如果您想使用小部件)

    'modules' => [
        'cart' => [
            'class' => 'pistol88\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 \pistol88\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 pistol88\cart\widgets\BuyButton;
use pistol88\cart\widgets\TruncateButton;
use pistol88\cart\widgets\CartInformer;
use pistol88\cart\widgets\ElementsList;
use pistol88\cart\widgets\DeleteButton;
use pistol88\cart\widgets\ChangeCount;
use pistol88\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' => 'pistol88\cart\Cart',
            //...
            'as discount' => [
                'class' => 'pistol88\cart\behaviors\Discount',
                'percent' => 50,
            ],
        ],

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

可以直接连接到事件

        'cart' => [
            'class' => 'pistol88\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 - 元素价格舍入