====== Временный купон ====== Решение реализует механизм скидки, которая применяется к заказу только в том случае, если со времени добавления последнего товара в корзину прошло меньше определенного времени. Например, скидка к заказу применяется в том случае, если со времени добавления товара в корзину прошло меньше 30 мин, при этом на странице корзины выводится таймер с отсчетом этого времени. Установка решения: - Создать скидку и купон. - Добавить константы: * ''TEMPORARY_SALE_TIMEOUT'' — время, в течение которого работает скидка; * ''TEMPORARY_SALE_COUPON'' — текст используемого купона. - В настройки ТДС корзины добавить следующий код для события добавления товара в корзину: if (Core_Array::getRequest('add')) { $shop_item_id = intval(Core_Array::getRequest('add')); if ($shop_item_id) { // ... // Запоминаем последнее добавление товара в корзину $_SESSION['hostcmsCart']['last_addition'] = time(); } - Создать наблюдатель:couponText || $object->couponText == $couponText) { // В корзину добавлялся товар if (isset($_SESSION['hostcmsCart']['last_addition'])) { $lastAddition = $_SESSION['hostcmsCart']['last_addition']; // Время не вышло — добавляем купон if (time() - $lastAddition <= $timeout * 60) { $object->couponText = $couponText; } else { $object->couponText = ''; } } } } } } - Зарегистрировать наблюдатель в ''bootstrap.php'':Core_Event::attach('Shop_Purchase_Discount_Controller.onBeforeGetDiscounts', array('Shop_Purchase_Discount_Controller_Observer_Coupon', 'onBeforeGetDiscounts')); - Если требуется выводить таймер отсчета на странице корзины, то можно использовать следующий наблюдатель, который добавит узлы ''last_addition_timeout'' и ''temporary_coupon'', которые будут содержать оставшееся время с момента добавления последнего товара в корзину и код купона соответственно:addEntity( // Core::factory('Core_Xml_Entity') // ->name('last_addition') // ->value(Core_Date::timestamp2datetime($lastAddition)) // ); $timeout = $lastAddition + $temporaryTimeout * 60 - time(); if ($timeout > 0) { $object->addEntity( Core::factory('Core_Xml_Entity') ->name('last_addition_timeout') ->value($timeout) ); $object->addEntity( Core::factory('Core_Xml_Entity') ->name('temporary_coupon') ->value($couponText) ); } } } } } - Зарегистрировать наблюдатель в файле ''bootstrap.php'':Core_Event::attach('Shop_Cart_Controller_Show.onBeforeRedeclaredShow', array('Shop_Cart_Controller_Show_Observer_Lastaddition', 'onBeforeRedeclaredShow')); - На странице корзины вывод таймера можно организовать следющим образом с использованием библиотеки [[http://flipclockjs.com/|FlipClock]]:
Страницу создал Максим Засорин 20.10.16 в 17:42