PHPackages                             jonggialdo/yii2-keranjang-belanja - 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/yii2-keranjang-belanja

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

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

Yii2 extension that adds shopping cart functions

v1.4(5y ago)00PHPPHP &gt;=5.4.0

Since Oct 19Pushed 5y agoCompare

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

READMEChangelogDependencies (1)Versions (11)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

26

—

LowBetter than 43% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity0

Limited adoption so far

Community13

Small or concentrated contributor base

Maturity64

Established project with proven stability

 Bus Factor1

Top contributor holds 74.5% 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

Every ~233 days

Recently: every ~483 days

Total

10

Last Release

2122d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/f283819225adea5d1c7ed99246d8dba1291137014836f9cd09327e4f9d1d636e?d=identicon)[jonggialdo](/maintainers/jonggialdo)

---

Top Contributors

[![omnilight](https://avatars.githubusercontent.com/u/3306537?v=4)](https://github.com/omnilight "omnilight (38 commits)")[![jonggialdo](https://avatars.githubusercontent.com/u/28138943?v=4)](https://github.com/jonggialdo "jonggialdo (4 commits)")[![OmgDef](https://avatars.githubusercontent.com/u/6762337?v=4)](https://github.com/OmgDef "OmgDef (3 commits)")[![damiandennis](https://avatars.githubusercontent.com/u/1276622?v=4)](https://github.com/damiandennis "damiandennis (2 commits)")[![mydesign](https://avatars.githubusercontent.com/u/579933?v=4)](https://github.com/mydesign "mydesign (1 commits)")[![mike-kramer](https://avatars.githubusercontent.com/u/9973256?v=4)](https://github.com/mike-kramer "mike-kramer (1 commits)")[![samdark](https://avatars.githubusercontent.com/u/47294?v=4)](https://github.com/samdark "samdark (1 commits)")[![SilverFire](https://avatars.githubusercontent.com/u/4499203?v=4)](https://github.com/SilverFire "SilverFire (1 commits)")

---

Tags

yiishopping cart

### Embed Badge

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

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

###  Alternatives

[rmrevin/yii2-fontawesome

Asset Bundle for Yii2 with Font Awesome

1474.0M134](/packages/rmrevin-yii2-fontawesome)[kop/yii2-scroll-pager

Infinite AJAX scrolling for Yii2 ListView widget

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

Yii2 CKEditor

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

Gravatar Widget for Yii 2

441.8M35](/packages/cebe-yii2-gravatar)[brussens/yii2-maintenance-mode

Maintenance mode component for Yii framework 2.x.x version.

78256.3k5](/packages/brussens-yii2-maintenance-mode)[trntv/yii2-aceeditor

Yii2 ajax.org Ace Editor widget

43787.5k20](/packages/trntv-yii2-aceeditor)

PHPackages © 2026

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