PHPackages                             jonggialdo/keranjang-belanja-yii2 - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. jonggialdo/keranjang-belanja-yii2

ActiveYii2-extension[Utility &amp; Helpers](/categories/utility)

jonggialdo/keranjang-belanja-yii2
=================================

Yii2 extension that adds shopping cart functions

1.0(5y ago)061PHPPHP &gt;=5.4.0

Since Jul 21Pushed 5y ago1 watchersCompare

[ Source](https://github.com/jonggialdo/keranjang-belanja-yii2)[ Packagist](https://packagist.org/packages/jonggialdo/keranjang-belanja-yii2)[ RSS](/packages/jonggialdo-keranjang-belanja-yii2/feed)WikiDiscussions master Synced 3w ago

READMEChangelog (1)Dependencies (1)Versions (2)Used By (0)

Shopping cart for Yii 2
=======================

[](#shopping-cart-for-yii-2)

This extension adds shopping cart for Yii framework 2.0

Installation
------------

[](#installation)

The preferred way to install this extension is through [composer](http://getcomposer.org/download/).

Either run

```
php composer.phar require --prefer-dist omnilight/yii2-shopping-cart "*"

```

or add

```
"omnilight/yii2-shopping-cart": "*"
```

to the `require` section of your composer.json.

How to use
----------

[](#how-to-use)

In your model:

```
class Product extends ActiveRecord implements CartPositionInterface
{
    use CartPositionTrait;

    public function getPrice()
    {
        return $this->price;
    }

    public function getId()
    {
        return $this->id;
    }
}
```

In your controller:

```
public function actionAddToCart($id)
{
    $cart = Yii::$app->cart;

    $model = Product::findOne($id);
    if ($model) {
        $cart->put($model, 1);
        return $this->redirect(['cart-view']);
    }
    throw new NotFoundHttpException();
}
```

Also you can use cart as global application component:

```
[
    'components' => [
        'cart' => [
            'class' => 'yz\shoppingcart\ShoppingCart',
            'cartId' => 'my_application_cart',
        ]
    ]
]
```

And use it in the following way:

```
\Yii::$app->cart->put($cartPosition, 1);
```

In order to get number of items in the cart:

```
$itemsCount = \Yii::$app->cart->getCount();
```

In order to get total cost of items in the cart:

```
$total = \Yii::$app->cart->getCost();
```

If the original model that you want to use as cart position is too heavy to be stored in the session, you can create a separate class implementing CartPositionInterface, and original model can implement CartPositionProviderInterface:

```
// app\models\Product.php

class Product extends ActiveRecord implements CartPositionProviderInterface
{
    public function getCartPosition()
    {
        return \Yii::createObject([
            'class' => 'app\models\ProductCartPosition',
            'id' => $this->id,
        ]);
    }
}

// app\models\ProductCartPosition.php

class ProductCartPosition extends Object implements CartPositionInterface
{
    /**
     * @var Product
     */
    protected $_product;

    public $id;

    public function getId()
    {
        return $this->id;
    }

    public function getPrice()
    {
        return $this->getProduct()->price;
    }

    /**
     * @return Product
    */
    public function getProduct()
    {
        if ($this->_product === null) {
            $this->_product = Product::findOne($this->id);
        }
        return $this->_product;
    }
}
```

This way gives us ability to create separate cart positions for the same product, that differs only on some property, for example price or color:

```
// app\models\ProductCartPosition.php

class ProductCartPosition extends Object implements CartPositionInterface
{
    public $id;
    public $price;
    public $color;

    //...
    public function getId()
    {
        return md5(serialize([$this->id, $this->price, $this->color]));
    }

    //...
}
```

Using discounts
---------------

[](#using-discounts)

Discounts are implemented as behaviors that could attached to the cart or it's positions. To use them, follow this steps:

1. Define discount class as a subclass of yz\\shoppingcart\\DiscountBehavior

```
// app/components/MyDiscount.php

class MyDiscount extends DiscountBehavior
{
    /**
     * @param CostCalculationEvent $event
     */
    public function onCostCalculation($event)
    {
        // Some discount logic, for example
        $event->discountValue = 100;
    }
}
```

2. Add this behavior to the cart:

```
$cart->attachBehavior('myDiscount', ['class' => 'app\components\MyDiscount']);
```

If discount is suitable not for the whole cart, but for the individual positions, than it is possible to attach discount to the cart position itself:

```
$cart->getPositionById($positionId)->attachBehavior('myDiscount', ['class' => 'app\components\MyDiscount']);

```

Note, that the same behavior could be used for both cart and position classes.

3. To get total cost with discount applied:

```
$total = \Yii::$app->cart->getCost(true);
```

4. During the calculation the following events are triggered:

- `ShoppingCart::EVENT_COST_CALCULATION` once per calculation.
- `CartPositionInterface::EVENT_COST_CALCULATION` for each position in the cart.

You can also subscribe on this events to perform discount calculation:

```
$cart->on(ShoppingCart::EVENT_COST_CALCULATION, function ($event) {
    $event->discountValue = 100;
});
```

###  Health Score

23

—

LowBetter than 26% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity8

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity50

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

2167d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/28138943?v=4)[Jonggi Abialdo](/maintainers/jonggialdo)[@jonggialdo](https://github.com/jonggialdo)

---

Top Contributors

[![jonggialdo](https://avatars.githubusercontent.com/u/28138943?v=4)](https://github.com/jonggialdo "jonggialdo (1 commits)")

---

Tags

yiishopping cart

### Embed Badge

![Health badge](/badges/jonggialdo-keranjang-belanja-yii2/health.svg)

```
[![Health](https://phpackages.com/badges/jonggialdo-keranjang-belanja-yii2/health.svg)](https://phpackages.com/packages/jonggialdo-keranjang-belanja-yii2)
```

###  Alternatives

[rmrevin/yii2-fontawesome

Asset Bundle for Yii2 with Font Awesome

1474.2M135](/packages/rmrevin-yii2-fontawesome)[kop/yii2-scroll-pager

Infinite AJAX scrolling for Yii2 ListView widget

178724.3k10](/packages/kop-yii2-scroll-pager)[mihaildev/yii2-ckeditor

Yii2 CKEditor

118570.2k50](/packages/mihaildev-yii2-ckeditor)[cebe/yii2-gravatar

Gravatar Widget for Yii 2

391.8M35](/packages/cebe-yii2-gravatar)[trntv/yii2-aceeditor

Yii2 ajax.org Ace Editor widget

43817.4k20](/packages/trntv-yii2-aceeditor)[thamtech/yii2-uuid

Yii 2 UUID Helper

35359.7k7](/packages/thamtech-yii2-uuid)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
