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

Материал из Umicms
Версия от 06:06, 9 мая 2012; Davidov (обсуждение | вклад) (Новая страница: «Для того чтобы добавить в корзину определённое количество товаров, нужно к ссылке добавле…»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

Для того чтобы добавить в корзину определённое количество товаров, нужно к ссылке добавления товара в корзину добавить GET параметр amount=количество_товара. При этом, в корзину будет добавлено нужное количество данного товара. Если же снова добавить этот же товар в корзину с дуругим значением параметра, то количество товара в корзине не увеличится на заданное значение, а поменяется на новое значение параметра amount. Для того чтобы производилось суммирование, можно доработать стандартный метод basket. Скопируем его в файл ~/classes/modules/emarket/__custom.php после строки //TODO: Write here your own macroses и немного изменим. Код нового метода будет примерно следующим: <source lang="php"> 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()); } <?source>

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