mirror of
https://github.com/kevin-DL/LaravelShoppingcart.git
synced 2026-01-23 07:31:31 +00:00
Large update for version 2.0
This commit is contained in:
271
src/CartItem.php
Normal file
271
src/CartItem.php
Normal file
@@ -0,0 +1,271 @@
|
||||
<?php
|
||||
|
||||
namespace Gloudemans\Shoppingcart;
|
||||
|
||||
use Gloudemans\Shoppingcart\Contracts\Buyable;
|
||||
|
||||
class CartItem
|
||||
{
|
||||
/**
|
||||
* The rowID of the cart item.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $rowId;
|
||||
|
||||
/**
|
||||
* The ID of the cart item.
|
||||
*
|
||||
* @var int|string
|
||||
*/
|
||||
public $id;
|
||||
|
||||
/**
|
||||
* The quantity for this cart item.
|
||||
*
|
||||
* @var int|float
|
||||
*/
|
||||
public $qty;
|
||||
|
||||
/**
|
||||
* The name of the cart item.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $name;
|
||||
|
||||
/**
|
||||
* The price of the cart item.
|
||||
*
|
||||
* @var float
|
||||
*/
|
||||
public $price;
|
||||
|
||||
/**
|
||||
* The options for this cart item.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $options;
|
||||
|
||||
/**
|
||||
* The FQN of the associated model.
|
||||
*
|
||||
* @var string|null
|
||||
*/
|
||||
private $associatedModel = null;
|
||||
|
||||
/**
|
||||
* The tax rate for the cart item.
|
||||
*
|
||||
* @var int|float
|
||||
*/
|
||||
private $taxRate = 0;
|
||||
|
||||
/**
|
||||
* CartItem constructor.
|
||||
*
|
||||
* @param int|string $id
|
||||
* @param string $name
|
||||
* @param float $price
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct($id, $name, $price, array $options = [])
|
||||
{
|
||||
if(empty($id)) throw new \InvalidArgumentException('Please supply a valid identifier.');
|
||||
if(empty($name)) throw new \InvalidArgumentException('Please supply a valid name.');
|
||||
if(empty($price) || ! is_numeric($price))
|
||||
throw new \InvalidArgumentException('Please supply a valid price.');
|
||||
|
||||
$this->id = $id;
|
||||
$this->name = $name;
|
||||
$this->price = $price;
|
||||
$this->options = new CartItemOptions($options);
|
||||
|
||||
$this->rowId = $this->generateRowId($id, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the formatted price.
|
||||
*
|
||||
* @param int $decimals
|
||||
* @param string $decimalPoint
|
||||
* @param string $thousandSeperator
|
||||
* @return string
|
||||
*/
|
||||
public function price($decimals = 2, $decimalPoint = '.', $thousandSeperator = ',')
|
||||
{
|
||||
return number_format($this->price, $decimals, $decimalPoint, $thousandSeperator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the formatted subtotal.
|
||||
*
|
||||
* @param int $decimals
|
||||
* @param string $decimalPoint
|
||||
* @param string $thousandSeperator
|
||||
* @return string
|
||||
*/
|
||||
public function subtotal($decimals = 2, $decimalPoint = '.', $thousandSeperator = ',')
|
||||
{
|
||||
return number_format($this->subtotal, $decimals, $decimalPoint, $thousandSeperator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the formatted tax.
|
||||
*
|
||||
* @param int $decimals
|
||||
* @param string $decimalPoint
|
||||
* @param string $thousandSeperator
|
||||
* @return string
|
||||
*/
|
||||
public function tax($decimals = 2, $decimalPoint = '.', $thousandSeperator = ',')
|
||||
{
|
||||
return number_format($this->tax, $decimals, $decimalPoint, $thousandSeperator);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the quantity for this cart item.
|
||||
*
|
||||
* @param int|float $qty
|
||||
*/
|
||||
public function setQuantity($qty)
|
||||
{
|
||||
if(empty($qty) || ! is_numeric($qty))
|
||||
throw new \InvalidArgumentException('Please supply a valid quantity.');
|
||||
|
||||
$this->qty = $qty;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the cart item from a Buyable.
|
||||
*
|
||||
* @param \Gloudemans\Shoppingcart\Contracts\Buyable $item
|
||||
* @return void
|
||||
*/
|
||||
public function updateFromBuyable(Buyable $item)
|
||||
{
|
||||
$this->id = $item->getBuyableIdentifier();
|
||||
$this->name = $item->getBuyableDescription();
|
||||
$this->price = $item->getBuyablePrice();
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the cart item from an array.
|
||||
*
|
||||
* @param array $attributes
|
||||
* @return void
|
||||
*/
|
||||
public function updateFromArray(array $attributes)
|
||||
{
|
||||
$this->id = array_get($attributes, 'id', $this->id);
|
||||
$this->qty = array_get($attributes, 'qty', $this->qty);
|
||||
$this->name = array_get($attributes, 'name', $this->name);
|
||||
$this->price = array_get($attributes, 'price', $this->price);
|
||||
$this->options = new CartItemOptions(array_get($attributes, 'options', []));
|
||||
|
||||
$this->rowId = $this->generateRowId($this->id, $this->options->all());
|
||||
}
|
||||
|
||||
/**
|
||||
* Associate the cart item with the given model.
|
||||
*
|
||||
* @param mixed $model
|
||||
* @return void
|
||||
*/
|
||||
public function associate($model)
|
||||
{
|
||||
$this->associatedModel = is_string($model) ? $model : get_class($model);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the tax rate.
|
||||
*
|
||||
* @param int|float $taxRate
|
||||
* @return void
|
||||
*/
|
||||
public function setTaxRate($taxRate)
|
||||
{
|
||||
$this->taxRate = $taxRate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an attribute from the cart item or get the associated model.
|
||||
*
|
||||
* @param string $attribute
|
||||
* @return mixed
|
||||
*/
|
||||
public function __get($attribute)
|
||||
{
|
||||
if(property_exists($this, $attribute)) {
|
||||
return $this->{$attribute};
|
||||
}
|
||||
|
||||
if($attribute === 'subtotal') {
|
||||
return $this->qty * $this->price;
|
||||
}
|
||||
|
||||
if($attribute === 'tax') {
|
||||
return $this->price * ($this->taxRate / 100);
|
||||
}
|
||||
|
||||
if($attribute === 'model') {
|
||||
return with(new $this->associatedModel)->find($this->id);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new instance from a Buyable.
|
||||
*
|
||||
* @param \Gloudemans\Shoppingcart\Contracts\Buyable $item
|
||||
* @param array $options
|
||||
* @return \Gloudemans\Shoppingcart\CartItem
|
||||
*/
|
||||
public static function fromBuyable(Buyable $item, array $options = [])
|
||||
{
|
||||
return new self($item->getBuyableIdentifier(), $item->getBuyableDescription(), $item->getBuyablePrice(), $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new instance from the given array.
|
||||
*
|
||||
* @param array $attributes
|
||||
* @return \Gloudemans\Shoppingcart\CartItem
|
||||
*/
|
||||
public static function fromArray(array $attributes)
|
||||
{
|
||||
$options = array_get($attributes, 'options', []);
|
||||
|
||||
return new self($attributes['id'], $attributes['name'], $attributes['price'], $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new instance from the given attributes.
|
||||
*
|
||||
* @param int|string $id
|
||||
* @param string $name
|
||||
* @param float $price
|
||||
* @param array $options
|
||||
* @return \Gloudemans\Shoppingcart\CartItem
|
||||
*/
|
||||
public static function fromAttributes($id, $name, $price, array $options = [])
|
||||
{
|
||||
return new self($id, $name, $price, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a unique id for the cart item.
|
||||
*
|
||||
* @param string $id
|
||||
* @param array $options
|
||||
* @return string
|
||||
*/
|
||||
protected function generateRowId($id, array $options)
|
||||
{
|
||||
ksort($options);
|
||||
|
||||
return md5($id . serialize($options));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user