Макрос удаления одной единицы товара в корзине — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
(Новая страница: « category:Написание кастомных макросов ==<center> Макрос удаления одной единицы товара в корзин…»)
(нет различий)

Версия 19:48, 28 февраля 2013


Макрос удаления одной единицы товара в корзине.

При нажатии на кнопку «Х» в корзине будет производиться удаление одной единицы товара, если количество товара больше одной единицы, и удалять товар из корзины, если его количество равно единице. В директории /classes/modules/emarket/ в файл __custom.php необходимо добавить следующий код:

<?php
	abstract class __emarket_custom extends __emarket_purchasing{
		
		public function custom_basket($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");
					}

					// Получить все товары заказа
					$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;
						}

						// Сравниваем каждую переменную tOrderItem со списком опций
						foreach($options as $optionName => $optionId) {
							$itemOption = getArrayKey($itemOptions, $optionName);

							if(getArrayKey($itemOption, 'option-id') != $optionId) {
								$tOrderItem = null;
								continue 2;		
                                                        // Если не совпадает, создаем новый товар с указанными опциями  							}
						}

						break;	//Если совпадает, выйти из цикла и перейти к изменению количества					}

					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 ? $amount : 1);
				$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) {
                                //Проверяем количество единиц товара, если 1 то удаляем товар из списка, иначе уменьшаем количество на 1
					if ($orderItem->getAmount()==1){
						$order->removeItem($orderItem);
						$order->refresh();
						
					}
					else
						$orderItem->setAmount($orderItem->getAmount()-1);{
						$order->refresh();
						$orderItem->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());
		}
	};
?>

Далее, необходимо дать права на использования данного макроса. Для этого нужно создать файл permissions.custom.php в директории /classes/modules/emarket/ со следующим содержанием:

<?php
     $permissions = array('purchasing' => array('custom_basket'));
?>

В файле шаблона, по которому выводится корзина товаров, (в демо шаблоне demoold templates\demoold\tpls\emarket\default.tpl) необходимо изменить адрес ссылки удаления товара (то есть вызвать кастомный макрос вместо системного) на:

<a href="/emarket/custom_basket/remove/item/%id%/">(X)</a>