Добавление определённого количества товаров в корзину
Для того чтобы добавить в корзину определённое количество товаров, нужно к ссылке добавления товара в корзину добавить 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=количество_товара и указанное количество товара будет добавляться к текущему количеству в корзине.