====== Временный купон ======
Решение реализует механизм скидки, которая применяется к заказу только в том случае, если со времени добавления последнего товара в корзину прошло меньше определенного времени. Например, скидка к заказу применяется в том случае, если со времени добавления товара в корзину прошло меньше 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