lachezargrigorov/laravel-shopping-cart

An easy to use more advanced shopping cart for Laravel applications.

Downloads

30

Stars

4

Version

v1.1.1

Laravel Shopping Cart

Latest Stable Version Latest Unstable Version Software License Build Status Total Downloads

An easy to use more advanced shopping cart for Laravel applications.

Installation

Via Composer

$ composer require lachezargrigorov/laravel-shopping-cart

Laravel 5.5 and above uses Package Auto-Discovery, so doesn't require you to manually add the ServiceProvider and Facade to the array in config/app.php

If you don't use auto-discovery, add the CartServiceProvider to the providers array in config/app.php

\Lachezargrigorov\Cart\CartServiceProvider::class,

If you want to use the Cart facade, add this to the aliases array in app.php:

'Cart' => \Lachezargrigorov\Cart\Facades\Cart::class,

Implement the Item interface in your product model. The Cart and Item uses getCartPrice method to calculate the totals.

use Illuminate\Database\Eloquent\Model;
use Lachezargrigorov\Cart\Iterfaces\Item;

class Product extends Model implements Item {}

Publish the package config to your local config with the publish command and configure them:

php artisan vendor:publish --provider="Lachezargrigorov\Cart\CartServiceProvider" --tag="config"

Set the item_class in local package config (cart.php)

"item_class" => \App\Product::class,

Legend

Elements

  • Cart : class Lachezargrigorov\Cart\Cart
  • Item : class Lachezargrigorov\Cart\Item
  • Condition : abstract class Lachezargrigorov\Cart\Condition;
  • ItemCondition : class Lachezargrigorov\Cart\ItemCondition extends Condition
  • CartCondition : class Lachezargrigorov\Cart\CartCondition extends Condition

Interfaces

  • Item : interface Lachezargrigorov\Cart\Interfaces\Item

Collections

  • LaravelCollection : class Illuminate\Support\Collection
  • Collection : class Lachezargrigorov\Cart\Collections\Collection extends LaravelCollection
  • ItemAttributesCollection : class Lachezargrigorov\Cart\Collections\ItemAttributesCollection extends Collection
  • ConditionAttributesCollection : class Lachezargrigorov\Cart\Collections\ConditionAttributesCollection extends Collection

Exceptions

  • CartException : class Lachezargrigorov\Cart\Exceptions\CartException

Usage`

Cart

Item

Add or get Item

This method add or get an Item if exist.

  • $id : int - the id of the item (product) model
  • return : Item
Cart::item($id);  //quantity = 0 on create
Models loading process

For better performance models are lazy associated to the items on first '$item->model' call after init or item addition in single DB request so you don't need to add any extra data like name, price, etc.

Cart::item(1);
Cart::item(2)->addQuantity(1);

//models are not loaded yet

//models are lazy loaded here
Cart::item(1)->model;

//if item not exist already, add a new one and mark that models need to be loaded again on next "$item->model" call
Cart::item(3);
Cart::item(4);

//models are not loaded again

//models are lazy loaded here again
Cart::item(4)->model;
Remove Item

-return : removed Item

Cart::item($id)->remove(); 
Get items
  • return : LaravelCollection with Items
Cart::items(); 
Has item (Item)
  • id : int - the id of the item (product) model
  • return : bool
Cart::has($id); 
Get items count
  • return : int
Cart::count(); 
Remove items (Item)
  • ids : [] - array with ids
  • return : Cart
Cart::remove($ids);
Remove all cart items
  • return : Cart
Cart::empty();
Is empty for items
  • return : bool
Cart::isEmpty();
Get item keys
  • return : LaravelCollection with keys
Cart::keys();
Empty the item models

This will case the cart to reload the models on next model call.

  • return : Cart
Cart::emptyModels();

CartCondition

Add or get CartCondition

This method add or get an CartCondition if exist.

  • name : condition name
  • return : CartCondition
Cart::condition($name);

Add or set CartConditions as array

This will rewrite the existing conditions.

  • return : Cart

    Cart::setConditionAsArray([
               "name"  => "all sale1",
               "type"  => "all sale",
               "value" => "-10%",
           ]);

    //or as multidimensional array

  Cart::setConditionAsArray([
            [
                "name"  => "all sale1",
                "type"  => "all sale",
                "value" => "-10%",
            ],
            [
                "name"  => "all sale2",
                "type"  => "all sale",
                "value" => "+1",
            ],
        ]);
Get conditions
  • return : LaravelCollection with CartConditions
Cart::conditions(); 
Has condition
  • name : condition name
  • return : bool
Cart::hasCondition($name); 
Get conditions count
  • return : int
Cart::countConditions(); 
Remove conditions
  • names : array - array with names
  • return : Cart
Cart::removeConditions($names);
Remove all cart conditions
  • return : Cart
Cart::emptyConditions();
Is empty for conditions
  • return : bool
Cart::isEmptyConditions();
Get condition keys (names)
  • return : LaravelCollection with keys
Cart::keysOfConditions();

Total methods

Get total quantity
  • return : int
Cart::totalQuantity();
Get cart subtotal without applied ItemConditions and CartConditions
  • return : double
Cart::subtotalWithoutConditions();
Get cart subtotal without applied CartConditions
  • return : double
Cart::subtotal();
Get cart total with applied ItemConditions and CartConditions
  • return : double
Cart::total();

Item

Properties

  • id : int
  • quantity : int
  • attributes : ItemAttributesCollection
  • conditions : LaravelCollection with ItemConditions
  • model : Illuminate\Database\Eloquent\Model
Set quantity
  • return : Item
Cart::item($id)->quantity(1); 
Add quantity (current quantity + added quantity)
  • return : Item
Cart::item($id)->addQuantity(1); 
Get quantity
  • return : int
Cart::item($id)->quantity; 
Set attributes
  • return : Item
Cart::item($id)->attributes(["size" => "L", "color" => "blue"]); 
Get attributes
  • return : ItemAttributesCollection
$attributesCollection = Cart::item($id)->attributes;
$itemSize = $attributesCollection->size;
$itemColor = $attributesCollection->color;

 //or

Cart::item($id)->attributes->size;
Cart::item($id)->attributes->color;

//or using LaravelCollection methods

Cart::item($id)->attributes->has("size");
Cart::item($id)->attributes->get("size");
Cart::item($id)->attributes->each(function($value, $key){
    ...
});
Empty attributes (delete all attributes)
  • return : Item
Cart::item($id)->emptyAttributes(); 
Add or get ItemCondition
  • name : string - condition name
  • return : ItemCondition
Cart::item($id)->condition($name); 

Add or set ItemConditions as array

This will rewrite the existing conditions.

  • return : Item

    Cart::item(1)->setConditionAsArray([
               "name"  => "item sale1",
               "type"  => "item sale",
               "value" => "-10%",
           ]);

    //or as multidimensional array

  Cart::item(1)->setConditionAsArray([
            [
                "name"  => "item sale1",
                "type"  => "item sale",
                "value" => "-10%",
            ],
            [
                "name"  => "item sale2",
                "type"  => "item sale",
                "value" => "+1",
            ],
        ]);
Get conditions
  • return : LaravelCollection with ItemConditions
Cart::item($id)->conditions(); 
Remove ItemCondition

return : removed ItemCondition

Cart::item($id)->condition($name)->remove(); 
Has condition
  • name : string - condition name
  • return : bool
Cart::item($id)->hasCondition($name); 
Does item contain any conditions
  • return : bool
Cart::item($id)->isEmptyConditions(); 
Empty conditions (remove all conditions)
  • return : Item
Cart::item($id)->emptyConditions(); 
Get model
  • return : Illuminate\Database\Eloquent\Model
Cart::item($id)->model; 

Price methods

Get price without applied conditions

-return : double

Cart::item($id)->priceWithoutConditions(); 
Get price sum without applied conditions (price * quantity)

-return : double

Cart::item($id)->priceSumWithoutConditions(); 
Get price with applied conditions

-return : double

Cart::item($id)->price(); 
Get price sum with applied conditions (price * quantity)

-return : double

Cart::item($id)->priceSum(); 

Set helper

  • [] : array - quantity : int (not required), add_quantity : int (not required), attributes : array (not required), conditions : array (not required)
  • return : Item
  Cart::item(1)->set([
            "quantity" => 1,
            //"add_quantity" => 2,
            "attributes" => [
                "size" => "S",
            ],
            "conditions" => [
                [
                    "name"  => "whole sale",
                    "type"  => "all sale",
                    "value" => "10%",
                    "attributes" => ["some" => "attribute"]
                ], [
                    "name"  => "item sale",
                    "type"  => "item sale",
                    "value" => "-1",
                ]
            ]

        ]);
              
    // equel to
    
   Cart::item(1)->quantity(1)/*->addQuantity(2)*/->attributes(["size" => "S"])->condition('whole sale')->type("all sale")->value("10%")->attributes(["some" => "attribute"]);
   Cart::item(1)->condition("item sale")->type("item sale")->value("-1");

Condition (CartCondition and ItemCondition)

Properties

  • name : string - condition name and it's collection key are always the same
  • type : string
  • value : string - [+-]?[0-9]+(\.[0-9]+)?[%]? examples: +10%, 10%, 10.22% -10%, +10.11, -10.80
  • attributes : ConditionAttributesCollection
Set name

This will change the key in collection too.

  • name : string
  • return : CartCondition | ItemCondition
// CartCondition 

//this will create a new condition with name and key = "all sale"
Cart::condition("all sale"); 

//this will change the name and the key in collection too
Cart::condition("all sale")->name("friday sale");

//now this condition is accessible with the new key (name)
Cart::condition("friday sale");

// ItemCondition 

//this will create a new item condition with name and key = "all sale"
Cart::item(1)->condition("all sale"); 

//this will change the name and the key in collection too
Cart::item(1)->condition("all sale")->name("friday sale");

//now this item condition is accessible with the new key
Cart::item(1)->condition("friday sale");
Get name
  • return : string
// CartCondition 

Cart::condition("all sale")->name;

// ItemCondition 

Cart::item(1)->condition("item sale")->name;
Set type
  • type : string
  • return : CartCondition | ItemCondition
// CartCondition 

Cart::condition("all sale")->type($type);

// ItemCondition 

Cart::item(1)->condition("item sale")->type($type);
Get type
  • return : string
// CartCondition 

Cart::condition("all sale")->type;

// ItemCondition 

Cart::item(1)->condition("item sale")->type;
Set value
  • value : string
  • return : CartCondition | ItemCondition
// CartCondition 

Cart::condition("all sale")->value($value);

// ItemCondition 

Cart::item(1)->condition("item sale")->value($value);
Get value
  • return : string
// CartCondition 

Cart::condition("all sale")->value;

// ItemCondition 

Cart::item(1)->condition("item sale")->value;
Set attributes

Merge existing attributes.

  • attributes : array
  • return : CartCondition | ItemCondition
// CartCondition 

$attributes = ["some_attribute" => "attribute"];
Cart::condition("all sale")->attributes($attributes);

// ItemCondition 

Cart::item(1)->condition("item sale")->attributes($attributes);
Get attributes
  • return : ConditionAttributesCollection
// CartCondition 

Cart::condition("all sale")->attributes;
Cart::condition("all sale")->attributes->some_attribute;

// ItemCondition 

Cart::item(1)->condition("item sale")->attributes;
Cart::item(1)->condition("item sale")->attributes->some_attribute;

//or useing any LaravelCollection method
Cart::item(1)->condition("item sale")->attributes->get("some_attribute");
Empty attributes (delete all attributes)
  • return : CartCondition | ItemCondition
// CartCondition 

Cart::condition("all sale")->emptyAttributes();

// ItemCondition 

Cart::item(1)->condition("item sale")->emptyAttributes();

Set helper

  • [] : array - name : string (not required), type : string (not required), value : string (not required), attributes : array (not required)
  • return : CartCondition | ItemCondition
// CartCondition 

Cart::condition("all sale")->set([
    "name" => "sale", 
    "type" => "sale", 
    "value" => "-10%",
    "attributes" => [
        "size" => "M"
    ]
]);

// ItemCondition 

Cart::item(1)->condition("all sale")->set([
    "name" => "sale", 
    "type" => "sale", 
    "value" => "-10%",
    "attributes" => [
        "size" => "M"
    ]
]);

Testing

$ composer test

Change log

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING, ISSUE_TEMPLATE, PULL_REQUEST_TEMPLATE and CODE_OF_CONDUCT for details.

Security

If you discover any security related issues, please email [email protected] instead of using the issue tracker.

Credits

License

The MIT License (MIT). Please see License File for more information.

lachezargrigorov

Author

lachezargrigorov