Визуальное оформление недавно добавленных товаров

Материал из Umicms
Версия от 12:45, 28 мая 2019; Alelekov (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

Актуально для версии 20

Задача

Автоматически помечать добавленный в последние две недели товар как "Новинка".

Решение

С помощью не сложных манипуляций, для товара, добавленного на сайте в какой-то промежуток времени, допустим в последние две недели, можно поставить флаг "Новинка". Делается это следующим образом:

  1. В типе данных "Объект каталога" в модуле "Шаблоны данных" добавляем поле "Дата добавления" с идентификатором publish_time.
  2. В результате чего, при добавлении товара, в новое поле будет автоматически записываться текущее время.

  3. Затем, в файле ~/classes/components/catalog/customMacros.php опишем макрос, который будет автоматически помечать только что созданный товар как "Новинку":
  4. 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');
    
  5. Теперь перейдём к автоматизации. Допустим, мы хотим, чтобы каждые две недели список "Новинок" актуализировался - "старые новинки" становились обычными товарами, а новые поддерживались в актуальном состоянии. Воспользуемся для этого таким механизмом как cron.

Настройка cron и написание макроса обновления

После настройки выполнения cron на хостинге у нас будет выполняться ряд обработчиков, присутствующих в системе по умолчанию. По аналогии с предыдущим пунктом, сначала напишем метод, который будет выполняться по cron:

  1. Для начала, в файле ~/classes/components/catalog/customMacros.php опишем константу, которая будет равна необходимому нам временному интервалу - две недели - в секундах. Добавим её после "public $module":
    public $module;
    	
    // Промежуток времени, в котором добавленный товар считается новинкой
    // Данное число = 2 неделям
    const INTERVAL = 1209600;
    
  2. Теперь напишем код обработчика:
    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);
    		}
    	}	
    }
    
  3. Обработчик написан, осталось только привязать его к событию выполнения cron. В файле /classes/components/catalog/custom_events.php добавляем следующую запись:
    	new umiEventListener('cron', 'catalog', 'actualize');
    

Итог

После всех выполненных действий мы реализовали функционал, который делает для нас доступными следующие возможности:

  1. При добавлении товара он автоматически помечается как "Новинка"
  2. Как только пройдёт заданный нами промежуток времени, при запуске cron все "новинки", если они находятся вне нашего временного интервала, станут обычными товарами.