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

Материал из Umicms
Перейти к:навигация, поиск
 
Строка 1: Строка 1:
'''Может быть использовано на 2.9'''
+
'''Актуально для версии 20.'''
  
Для того чтобы добавить в корзину определённое количество товаров, нужно к ссылке добавления товара в корзину добавить GET параметр amount=количество_товара. При этом, в корзину будет добавлено нужное количество данного товара. Если же снова добавить этот же товар в корзину с дуругим значением параметра, то количество товара в корзине не увеличится на заданное значение, а поменяется на новое значение параметра amount.
+
Для того, чтобы добавить в корзину определённое количество товаров, нужно к ссылке добавления товара в корзину добавить GET параметр amount=количество_товара. При этом в корзину будет добавлено нужное количество данного товара. Если же снова добавить этот же товар в корзину с дуругим значением параметра, то количество товара в корзине не увеличится на заданное значение, а поменяется на новое значение параметра amount.
Для того чтобы производилось суммирование, можно доработать стандартный метод basket. Скопируем его в файл ~/classes/modules/emarket/__custom.php после строки //TODO: Write here your own macroses и немного изменим. Код нового метода будет примерно следующим:
+
Для того, чтобы производилось суммирование, можно доработать стандартный метод basket. Скопируем его в файл ~/classes/components/emarket/customMacros.php и немного изменим. Код нового метода будет примерно следующим:
 
<source lang="php">
 
<source lang="php">
 
public function basket_custom($mode = false, $itemType = false, $itemId = false) {
 
public function basket_custom($mode = false, $itemType = false, $itemId = false) {
$mode = $mode ? $mode : getRequest('param0');
+
$mode = $mode ? $mode : getRequest('param0');
        $emarket = cmsController::getInstance()->getModule('emarket');
+
$emarket = $this->module;
        $order = $emarket->getBasketOrder(!in_array($mode, array('put', 'remove')));
+
$order = $emarket->getBasketOrder(!in_array($mode, array('put', 'remove')));
$itemType = $itemType ? $itemType : getRequest('param1');
+
$itemType = $itemType ? $itemType : getRequest('param1');
$itemId = (int) ($itemId ? $itemId : getRequest('param2'));
+
$itemId = (int) ($itemId ? $itemId : getRequest('param2'));
$amount = (int) getRequest('amount');
+
$amount = (int) getRequest('amount');
$options = getRequest('options');
+
$options = getRequest('options');
 
+
$order->refresh();
+
$order->refresh();
 
+
if($mode == 'put') {
+
if($mode == 'put') {
$orderItem = ($itemType == 'element') ? $this->getBasketItem($itemId) : $order->getItem($itemId);
+
$orderItem = ($itemType == 'element') ? $emarket->getBasketItem($itemId) : $order->getItem($itemId);
 
+
if (!$orderItem) {
+
if (!$orderItem) {
throw new publicException("Order item is not defined");
+
throw new publicException("Order item is not defined");
}
+
}
 
+
if(is_array($options)) {
+
if(is_array($options)) {
if($itemType != 'element') {
+
if($itemType != 'element') {
throw new publicException("Put basket method required element id of optionedOrderItem");
+
throw new publicException("Put basket method required element id of optionedOrderItem");
}
+
}
 
+
// Get all orderItems
+
// Get all orderItems
$orderItems = $order->getItems();
+
$orderItems = $order->getItems();
 
+
foreach($orderItems as $tOrderItem) {
+
foreach($orderItems as $tOrderItem) {
$itemOptions = $tOrderItem->getOptions();
+
$itemOptions = $tOrderItem->getOptions();
 
+
if(sizeof($itemOptions) != sizeof($options)) {
+
if(sizeof($itemOptions) != sizeof($options)) {
$itemOptions = null;
+
$itemOptions = null;
$tOrderItem = null;
+
$tOrderItem = null;
continue;
+
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($tOrderItem->getItemElement()->id != $orderItem->getItemElement()->id) {
+
if($mode == 'remove') {
$itemOptions = null;
+
$orderItem = ($itemType == 'element') ? $emarket->getBasketItem($itemId, false) : orderItem::get($itemId);
$tOrderItem = null;
+
if($orderItem instanceof orderItem) {
continue;
+
$order->removeItem($orderItem);
}
+
$order->refresh();
 
+
}
// 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
 
 
}
 
}
}
+
 
+
if ($mode == 'remove_all') {
break; // If matches, stop loop and continue to amount change
+
foreach ($order->getItems() as $orderItem) {
}
+
$order->removeItem($orderItem);
 
+
}
if(!isset($tOrderItem) || is_null($tOrderItem)) {
+
$order->refresh();
$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);
 
 
}
 
}
 +
// Здесь необходимо настроить редирект на нужную вам страницу после добавления товара
 +
$emarket->redirect('<ссылка на страницу после оформления товара>');
 +
$order->refresh();
 +
return $emarket->order($order->getId());
 
}
 
}
}
+
 
 
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());
 
}
 
 
</source>
 
</source>
  
После этого товары можно добавлять товары в корзину можно будет ссылкой вида:
+
После этого товары добавлять товары в корзину можно будет ссылкой вида:
/emarket/basket_custom/put/element/10/?amount=количество_товара
+
ваш_сайт/emarket/basket_custom/put/element/10/?amount=количество_товара
 
и указанное количество товара будет добавляться к текущему количеству в корзине.
 
и указанное количество товара будет добавляться к текущему количеству в корзине.
 
[[Категория:Модуль Интернет магазин]][[Категория:Написание кастомных макросов]]
 
[[Категория:Модуль Интернет магазин]][[Категория:Написание кастомных макросов]]

Текущая версия на 08:38, 3 апреля 2019

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

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

public function basket_custom($mode = false, $itemType = false, $itemId = false) {
			$mode = $mode ? $mode : getRequest('param0');
				$emarket = $this->module;
				$order = $emarket->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') ? $emarket->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') ? $emarket->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();
			}
			// Здесь необходимо настроить редирект на нужную вам страницу после добавления товара
			$emarket->redirect('<ссылка на страницу после оформления товара>');
			$order->refresh();
			return $emarket->order($order->getId());
		}

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