Добавление определённого количества товаров в корзину

Материал из Umicms
Перейти к:навигация, поиск

Актуально для версии 2.9

Для того чтобы добавить в корзину определённое количество товаров, нужно к ссылке добавления товара в корзину добавить GET параметр amount=количество_товара. При этом, в корзину будет добавлено нужное количество данного товара. Если же снова добавить этот же товар в корзину с дуругим значением параметра, то количество товара в корзине не увеличится на заданное значение, а поменяется на новое значение параметра amount. Для того чтобы производилось суммирование, можно доработать стандартный метод basket. Скопируем его в файл ~/classes/modules/emarket/__custom.php после строки //TODO: Write here your own macroses и немного изменим. Код нового метода будет примерно следующим:

public function basket_custom($mode = false, $itemType = false, $itemId = false) {
	$mode = $mode ? $mode : getRequest('param0');
        $order = self::getBasketOrder(!in_array($mode, array('put', 'remove')));
	$itemType = $itemType ? $itemType : getRequest('param1');
	$itemId = (int) ($itemId ? $itemId : getRequest('param2'));
	$amount = (int) getRequest('amount');
	$options = getRequest('options');

	$order->refresh();

	if($mode == 'put') {
		$orderItem = ($itemType == 'element') ? $this->getBasketItem($itemId) : $order->getItem($itemId);

		if (!$orderItem) {
			throw new publicException("Order item is not defined");
		}

		if(is_array($options)) {
		if($itemType != 'element') {
			throw new publicException("Put basket method required element id of optionedOrderItem");
		}

		// Get all orderItems
		$orderItems = $order->getItems();

		foreach($orderItems as $tOrderItem) {
			$itemOptions = $tOrderItem->getOptions();

			if(sizeof($itemOptions) != sizeof($options)) {
				$itemOptions = null;
				$tOrderItem = null;
				continue;
			}

		if($tOrderItem->getItemElement()->id != $orderItem->getItemElement()->id) {
			$itemOptions = null;
			$tOrderItem = null;
			continue;
		}

		// Compare each tOrderItem with options list
		foreach($options as $optionName => $optionId) {
			$itemOption = getArrayKey($itemOptions, $optionName);

			if(getArrayKey($itemOption, 'option-id') != $optionId) {
				$tOrderItem = null;
				continue 2;		// If does not match, create new item using options specified
			}
		}

		break;	// If matches, stop loop and continue to amount change
	}

	if(!isset($tOrderItem) || is_null($tOrderItem)) {
		$tOrderItem = orderItem::create($itemId);
		$order->appendItem($tOrderItem);
	}

	if($tOrderItem instanceof optionedOrderItem) {
		foreach($options as $optionName => $optionId) {
			if($optionId) {
				$tOrderItem->appendOption($optionName, $optionId);
			} else {
				$tOrderItem->removeOption($optionName);
			}
		}
	}

	if($tOrderItem) {
		$orderItem = $tOrderItem;
	}
}

$amount = $amount ? $amount : ($orderItem->getAmount() + 1);

$orderItem->setAmount($amount+$orderItem->getAmount());
$orderItem->refresh();

if($itemType == 'element') {
	$order->appendItem($orderItem);
}
$order->refresh();
}

if($mode == 'remove') {
	$orderItem = ($itemType == 'element') ? $this->getBasketItem($itemId, false) : orderItem::get($itemId);
	if($orderItem instanceof orderItem) {
		$order->removeItem($orderItem);
		$order->refresh();
	}
}

if ($mode == 'remove_all') {
	foreach ($order->getItems() as $orderItem) {
		$order->removeItem($orderItem);
	}
$order->refresh();
}

$referer = getServer('HTTP_REFERER');
$noRedirect = getRequest('no-redirect');

if($redirectUri = getRequest('redirect-uri')) {
	$this->redirect($redirectUri);
} else if (!defined('VIA_HTTP_SCHEME') && !$noRedirect && $referer) {
	$current = $_SERVER['REQUEST_URI'];
	if(substr($referer, -strlen($current)) == $current) {
		if($itemType == 'element') {
			$referer = umiHierarchy::getInstance()->getPathById($itemId);
		} else {
			$referer = "/";
		}
	}
	$this->redirect($referer);
}

$order->refresh();
return $this->order($order->getId());
}

После этого товары можно добавлять товары в корзину можно будет ссылкой вида: /emarket/basket_custom/put/element/10/?amount=количество_товара и указанное количество товара будет добавляться к текущему количеству в корзине.