dvizh / yii2-cart
yii2-cart 是一个简单的购物车模块,用于收集实现购物车接口的应用模型和插件
dev-master
2018-02-05 13:01 UTC
Requires
- php: >=5.4.0
- yiisoft/yii2: *
- yiisoft/yii2-bootstrap: *
This package is not auto-updated.
Last update: 2024-09-20 22:18:01 UTC
README
这是用于 Yii2 框架的购物车模块。允许添加任何实现 dvizh\cart\interfaces\CartElement 接口的模型到购物车。
若要添加订单功能,可以使用此模块: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 - 元素价格四舍五入