skip to content
KAD::Wiki
User Tools
Log In
Site Tools
Search
Tools
Show page
Old revisions
Log In
>
You are here:
Приветствие
»
Для сотрудников
»
Разработка
»
HostCMS
»
Статьи (по модулям)
»
Интернет-магазин
»
Полезные решения
»
Временный купон
private:koding:hostcms:modules:shop:useful:temp_coupon
Media Files
====== Временный купон ====== Решение реализует механизм скидки, которая применяется к заказу только в том случае, если со времени добавления последнего товара в корзину прошло меньше определенного времени. Например, скидка к заказу применяется в том случае, если со времени добавления товара в корзину прошло меньше 30 мин, при этом на странице корзины выводится таймер с отсчетом этого времени. Установка решения: - Создать скидку и купон. - Добавить константы: * ''TEMPORARY_SALE_TIMEOUT'' — время, в течение которого работает скидка; * ''TEMPORARY_SALE_COUPON'' — текст используемого купона. - В настройки ТДС корзины добавить следующий код для события добавления товара в корзину:<code php> if (Core_Array::getRequest('add')) { $shop_item_id = intval(Core_Array::getRequest('add')); if ($shop_item_id) { // ... // Запоминаем последнее добавление товара в корзину $_SESSION['hostcmsCart']['last_addition'] = time(); }</code> - Создать наблюдатель:<code php><?php defined('HOSTCMS') || exit('HostCMS: access denied.'); /* * @author Maxim Zasorin, KAD Systems (©) 2015 * @date 04-04-2016 * * В bootstrap.php: * // Добавление купона, если со времени добавления товара в корзину прошло менее 30 мин. Core_Event::attach('Shop_Purchase_Discount_Controller.onBeforeGetDiscounts', array('Shop_Purchase_Discount_Controller_Observer_Coupon', 'onBeforeGetDiscounts')); * Копирование и использование файлов модуля * в коммерческих целях ЗАПРЕЩЕНО * */ class Shop_Purchase_Discount_Controller_Observer_Coupon { /** * Добавление купона, если со времени добавления товара в корзину прошло менее 30 мин. * * @param Shop_Purchase_Discount_Controller $object * @param array $args */ static public function onBeforeGetDiscounts(Shop_Purchase_Discount_Controller $object, $args) { if (defined('TEMPORARY_SALE_COUPON') && defined('TEMPORARY_SALE_TIMEOUT')) { $couponText = TEMPORARY_SALE_COUPON; $timeout = TEMPORARY_SALE_TIMEOUT; // Не применен ни какой купон if (!$object->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 = ''; } } } } } }</code> - Зарегистрировать наблюдатель в ''bootstrap.php'':<code php>Core_Event::attach('Shop_Purchase_Discount_Controller.onBeforeGetDiscounts', array('Shop_Purchase_Discount_Controller_Observer_Coupon', 'onBeforeGetDiscounts'));</code> - Если требуется выводить таймер отсчета на странице корзины, то можно использовать следующий наблюдатель, который добавит узлы ''last_addition_timeout'' и ''temporary_coupon'', которые будут содержать оставшееся время с момента добавления последнего товара в корзину и код купона соответственно:<code php><?php defined('HOSTCMS') || exit('HostCMS: access denied.'); /* * @author Maxim Zasorin, KAD Systems (©) 2015 * @date 04-04-2016 * * В bootstrap.php: * // Оставшееся время для скидки Core_Event::attach('Shop_Cart_Controller_Show.onBeforeRedeclaredShow', array('Shop_Cart_Controller_Show_Observer_Lastaddition', 'onBeforeRedeclaredShow')); * Копирование и использование файлов модуля * в коммерческих целях ЗАПРЕЩЕНО * */ class Shop_Cart_Controller_Show_Observer_Lastaddition { /** * Оставшееся время для скидки * * @param Shop_Cart_Controller_Show $object * @param array $args */ static public function onBeforeRedeclaredShow(Shop_Cart_Controller_Show $object, $args) { if (defined('TEMPORARY_SALE_COUPON') && defined('TEMPORARY_SALE_TIMEOUT')) { $couponText = TEMPORARY_SALE_COUPON; $temporaryTimeout = TEMPORARY_SALE_TIMEOUT; if (isset($_SESSION['hostcmsCart']['last_addition'])) { $lastAddition = $_SESSION['hostcmsCart']['last_addition']; // $object->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) ); } } } } }</code> - Зарегистрировать наблюдатель в файле ''bootstrap.php'':<code php>Core_Event::attach('Shop_Cart_Controller_Show.onBeforeRedeclaredShow', array('Shop_Cart_Controller_Show_Observer_Lastaddition', 'onBeforeRedeclaredShow'));</code> - На странице корзины вывод таймера можно организовать следющим образом с использованием библиотеки [[http://flipclockjs.com/|FlipClock]]:<code php><xsl:if test="coupon_text = '' or coupon_text = temporary_coupon"> <div style="text-align: center; margin-top: 30px;"> <div id="last_addition_timeout" style="display: inline-block; width: 340px;"></div> </div> <script> var clock = $('#last_addition_timeout').FlipClock(<xsl:value-of select="last_addition_timeout" />, { countdown: true, defaultLanguage: 'russian' }); </script> </xsl:if></code> <wrap lo>Страницу создал Максим Засорин 20.10.16 в 17:42</wrap>
Save
Preview
Cancel
Edit summary
private/koding/hostcms/modules/shop/useful/temp_coupon.txt
· Last modified: 27.06.17 в 16:02 by
maximzasorin_gmail.com
Page Tools
Show page
Old revisions
Export to PDF
Rename Page
Back to top