/** * add item to the cart, it can be an array or multi dimensional array * * @param string|array $id * @param string $name * @param float $price * @param int $quantity * @param array $attributes * @param CartCondition|array $conditions * @return $this * @throws InvalidItemException */ public function add($id, $name = null, $price = null, $quantity = null, $attributes = array(), $conditions = array()) { // if the first argument is an array, // we will need to call add again if (is_array($id)) { // the first argument is an array, now we will need to check if it is a multi dimensional // array, if so, we will iterate through each item and call add again if (Helpers::isMultiArray($id)) { foreach ($id as $item) { $this->add($item['id'], $item['name'], $item['price'], $item['quantity'], Helpers::issetAndHasValueOrAssignDefault($item['attributes'], array()), Helpers::issetAndHasValueOrAssignDefault($item['conditions'], array())); } } else { $this->add($id['id'], $id['name'], $id['price'], $id['quantity'], Helpers::issetAndHasValueOrAssignDefault($id['attributes'], array()), Helpers::issetAndHasValueOrAssignDefault($id['conditions'], array())); } return $this; } // validate data $item = $this->validate(array('id' => $id, 'name' => $name, 'price' => Helpers::normalizePrice($price), 'quantity' => $quantity, 'attributes' => new ItemAttributeCollection($attributes), 'conditions' => $conditions)); // get the cart $cart = $this->getContent(); // if the item is already in the cart we will just update it if ($cart->has($id)) { $this->events->fire($this->getInstanceName() . '.updating', array($item, $this)); $this->update($id, $item); $this->events->fire($this->getInstanceName() . '.updated', array($item, $this)); } else { $this->events->fire($this->getInstanceName() . '.adding', array($item, $this)); $this->addRow($id, $item); $this->events->fire($this->getInstanceName() . '.added', array($item, $this)); } return $this; }
/** * apply condition * * @param $totalOrSubTotalOrPrice * @param $conditionValue * @return float */ protected function apply($totalOrSubTotalOrPrice, $conditionValue) { // if value has a percentage sign on it, we will get first // its percentage then we will evaluate again if the value // has a minus or plus sign so we can decide what to do with the // percentage, whether to add or subtract it to the total/subtotal/price // if we can't find any plus/minus sign, we will assume it as plus sign if ($this->valueIsPercentage($conditionValue)) { if ($this->valueIsToBeSubtracted($conditionValue)) { $value = Helpers::normalizePrice($this->cleanValue($conditionValue)); $this->parsedRawValue = $totalOrSubTotalOrPrice * ($value / 100); $result = floatval($totalOrSubTotalOrPrice - $this->parsedRawValue); } else { if ($this->valueIsToBeAdded($conditionValue)) { $value = Helpers::normalizePrice($this->cleanValue($conditionValue)); $this->parsedRawValue = $totalOrSubTotalOrPrice * ($value / 100); $result = floatval($totalOrSubTotalOrPrice + $this->parsedRawValue); } else { $value = Helpers::normalizePrice($conditionValue); $this->parsedRawValue = $totalOrSubTotalOrPrice * ($value / 100); $result = floatval($totalOrSubTotalOrPrice + $this->parsedRawValue); } } } else { if ($this->valueIsToBeSubtracted($conditionValue)) { $this->parsedRawValue = Helpers::normalizePrice($this->cleanValue($conditionValue)); $result = floatval($totalOrSubTotalOrPrice - $this->parsedRawValue); } else { if ($this->valueIsToBeAdded($conditionValue)) { $this->parsedRawValue = Helpers::normalizePrice($this->cleanValue($conditionValue)); $result = floatval($totalOrSubTotalOrPrice + $this->parsedRawValue); } else { $this->parsedRawValue = Helpers::normalizePrice($conditionValue); $result = floatval($totalOrSubTotalOrPrice + $this->parsedRawValue); } } } return $result; }