This is an old revision of the document!
Некоторые интернет-магазины предлагают различные опциональные дополнительные услуги для заказываемых товаров, эти услуги выбираются пользователем на этапе оформления заказа в корзине и влияют на окончательную стоимость заказа. Например, интернет-магазин по продаже какого-то сложного оборудования может предлагать услугу по настройке оборудования, за которую к товарам должна добавляться наценка.
Для реализации подобного механизма можно использовать данное решение.
Добавляем константу MARKUP_FOR_TEST_PRODUCTS
со значением равным величину наценки.
В XSL-шаблон корзины добавить колонку для выбора товаров для наценки, например, так:
<div class="checkbox"> <input type="checkbox" name="markup_{shop_item/@id}" id="markup_{shop_item/@id}" value="1"> <xsl:if test="/shop/markups/markup[shop_item_id = current()/shop_item/@id]"> <xsl:attribute name="checked" /> </xsl:if> </input> <label for="markup_{shop_item/@id}">Test and set up</label> </div>
Для начала необходимо загрузить 4 наблюдателя.
Core_Event::attach('shop_order_item.onCallmarkup', array('Shop_Order_Item_Observer_AdditionalFields', 'onCallmarkup'));
Загружаем файл: /modules/shop/item/controller/observer/addmarkuptoprice.php
Загружаем файл: /modules/shop/cart/controller/show/observer/attachmarkup.php
Core_Event::attach('Shop_Item_Controller.onAfterCalculatePrice', array('Shop_Item_Controller_Observer_AddMarkupToPrice', 'onAfterCalculatePrice'));
После вывода:
Core_Event::detach('Shop_Item_Controller.onAfterCalculatePrice', array(' Shop_Item_Controller_Observer_AddMarkupToPrice', 'onAfterCalculatePrice'));
Должно быть так:
Core_Event::attach('Shop_Item_Controller.onAfterCalculatePrice', array('Shop_Item_Controller_Observer_AddMarkupToPrice', 'onAfterCalculatePrice')); $Shop_Cart_Controller_Show ->xsl( Core_Entity::factory('Xsl')->getByName( Core_Array::get(Core_Page::instance()->libParams, 'littleCartXsl') ) ) ->couponText(Core_Array::get($_SESSION, 'coupon_text')) ->show(); Core_Event::detach('Shop_Item_Controller.onAfterCalculatePrice', array('Shop_Item_Controller_Observer_AddMarkupToPrice', 'onAfterCalculatePrice'));
$aMarkups = Core_Array::getSession('hostcmsCartMarkups', array());
Внутри цикла:
$markup = Core_Array::getRequest('markup_' . $oShop_Cart->shop_item_id); if (!is_null($markup)) { $aMarkups[$oShop_Cart->shop_item_id] = MARKUP_FOR_TEST_PRODUCTS; } elseif (isset($aMarkups[$oShop_Cart->shop_item_id])) { unset($aMarkups[$oShop_Cart->shop_item_id]); }
После цикла:
$_SESSION['hostcmsCartMarkups'] = $aMarkups;
Core_Event::attach('Shop_Item_Controller.onAfterCalculatePrice', array('Shop_Item_Controller_Observer_AddMarkupToPrice', 'onAfterCalculatePrice'));
После:
Core_Event::detach('Shop_Item_Controller.onAfterCalculatePrice', array('Shop_Item_Controller_Observer_AddMarkupToPrice', 'onAfterCalculatePrice'));
if ($_SESSION['hostcmsOrder']['shop_payment_system_id']) {
Перед вызовом Shop_Payment_System_Handler::execute
добавляем:
$oShopOrderPropertyList = Core_Entity::factory('Shop_Order_Property_List', $oShop->id); $oProperty = $oShopOrderPropertyList->Properties->getByTagName('markups'); if ($oProperty) { $_SESSION['hostcmsOrder']['properties'][] = $aProperty = array($oProperty->id, json_encode($_SESSION['hostcmsCartMarkups'], JSON_PRETTY_PRINT)); } Core_Event::attach('shop_order_item.onBeforeRedeclaredGetXml', array('Shop_Order_Item_Observer_AdditionalFields', 'onBeforeRedeclaredGetXml'));
После вызова:
Core_Event::detach('shop_order_item.onBeforeRedeclaredGetXml', array('Shop_Order_Item_Observer_AdditionalFields', 'onBeforeRedeclaredGetXml')); $_SESSION['hostcmsCartMarkups'] = array();
default
перед выводом корзины добавляем:Core_Event::attach('Shop_Cart_Controller_Show.onBeforeRedeclaredShow', array('Shop_Cart_Controller_Show_Observer_AttachMarkup', 'onBeforeRedeclaredShow'));
После:
Core_Event::detach('Shop_Cart_Controller_Show.onBeforeRedeclaredShow', array('Shop_Cart_Controller_Show_Observer_AttachMarkup', 'onBeforeRedeclaredShow'));
Если в основном макете есть вывод краткой корзины, то его также нужно обернуть в следующий наблюдатель:
Core_Event::attach('Shop_Item_Controller.onAfterCalculatePrice', array('Shop_Item_Controller_Observer_AddMarkupToPrice', 'onAfterCalculatePrice'));
После вывода:
Core_Event::detach('Shop_Item_Controller.onAfterCalculatePrice', array(' Shop_Item_Controller_Observer_AddMarkupToPrice', 'onAfterCalculatePrice'));
Страницу создал Максим Засорин 23.01.17 в 12:33