Добавление определённого количества товаров в корзину — различия между версиями
Velross (обсуждение | вклад) |
Alelekov (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
− | ''' | + | '''Актуально для версии 20.''' |
− | Для того чтобы добавить в корзину определённое количество товаров, нужно к ссылке добавления товара в корзину добавить GET параметр amount=количество_товара. При этом | + | Для того, чтобы добавить в корзину определённое количество товаров, нужно к ссылке добавления товара в корзину добавить GET параметр amount=количество_товара. При этом в корзину будет добавлено нужное количество данного товара. Если же снова добавить этот же товар в корзину с дуругим значением параметра, то количество товара в корзине не увеличится на заданное значение, а поменяется на новое значение параметра amount. |
− | Для того чтобы производилось суммирование, можно доработать стандартный метод basket. Скопируем его в файл ~/classes/ | + | Для того, чтобы производилось суммирование, можно доработать стандартный метод 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'); | |
− | + | $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()); | ||
} | } | ||
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</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=количество_товара и указанное количество товара будет добавляться к текущему количеству в корзине.