Визуальное оформление недавно добавленных товаров
Актуально для версии 20
Задача
Автоматически помечать добавленный в последние две недели товар как "Новинка".
Решение
С помощью не сложных манипуляций, для товара, добавленного на сайте в какой-то промежуток времени, допустим в последние две недели, можно поставить флаг "Новинка". Делается это следующим образом:
- В типе данных "Объект каталога" в модуле "Шаблоны данных" добавляем поле "Дата добавления" с идентификатором publish_time.
- Затем, в файле ~/classes/components/catalog/customMacros.php опишем макрос, который будет автоматически помечать только что созданный товар как "Новинку":
- Теперь перейдём к автоматизации. Допустим, мы хотим, чтобы каждые две недели список "Новинок" актуализировался - "старые новинки" становились обычными товарами, а новые поддерживались в актуальном состоянии. Воспользуемся для этого таким механизмом как cron.
В результате чего, при добавлении товара, в новое поле будет автоматически записываться текущее время.
public function setIsNewItem(iUmiEventPoint $oEventPoint) {
if ($oEventPoint->getMode() != "after"){
return;
}
$object = $oEventPoint->getRef("element");
$object->setValue('new', 1);
$object->commit();
}
Макрос описан, осталось лишь добавить привязку к событию создания объекта. В файле /classes/components/catalog/custom_events.php пишем следующее:
<?php
new umiEventListener('systemCreateElement', 'catalog', 'setIsNewItem');
Настройка cron и написание макроса обновления
После настройки выполнения cron на хостинге у нас будет выполняться ряд обработчиков, присутствующих в системе по умолчанию. По аналогии с предыдущим пунктом, сначала напишем метод, который будет выполняться по cron:
- Для начала, в файле ~/classes/components/catalog/customMacros.php опишем константу, которая будет равна необходимому нам временному интервалу - две недели - в секундах. Добавим её после "public $module":
public $module; // Промежуток времени, в котором добавленный товар считается новинкой // Данное число = 2 неделям const INTERVAL = 1209600;
-
Теперь напишем код обработчика:
public function actualize(iUmiEventPoint $oEventPoint) { if ($oEventPoint->getMode() != "process"){ return; } // Собираем все объекты-новинки и проверяем, не устарели ли они (вне заданного интервала времени) $newItemsStartArrivingTime = time() - self::INTERVAL; // Получить все "Новинки" $newItemsSelector = new selector('pages'); $newItemsSelector->types('hierarchy-type')->name('catalog', 'object'); $newItemsSelector->where('new')->equals(1); foreach($newItemsSelector as $item) { $publishTime = $item->getValue('publish_time'); $timestamp = $publishTime->getDateTimeStamp(); if($timestamp < $newItemsStartArrivingTime) { // Обнулили "новинку" у тех, кто уже вне нашего интервала времени $item->setValue('new', 0); } } }
- Обработчик написан, осталось только привязать его к событию выполнения cron. В файле /classes/components/catalog/custom_events.php добавляем следующую запись:
new umiEventListener('cron', 'catalog', 'actualize');
Итог
После всех выполненных действий мы реализовали функционал, который делает для нас доступными следующие возможности:
- При добавлении товара он автоматически помечается как "Новинка"
- Как только пройдёт заданный нами промежуток времени, при запуске cron все "новинки", если они находятся вне нашего временного интервала, станут обычными товарами.