Визуальное оформление недавно добавленных товаров — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
 
(не показана 1 промежуточная версия 1 участника)
Строка 1: Строка 1:
 +
'''Актуально для версии 20'''
 +
 +
== Задача ==
 +
Автоматически помечать добавленный в последние две недели товар как "Новинка".
 +
 +
== Решение ==
 +
 
С помощью не сложных манипуляций, для товара, добавленного на сайте в какой-то промежуток времени, допустим в последние две недели, можно поставить флаг "Новинка". Делается это следующим образом:
 
С помощью не сложных манипуляций, для товара, добавленного на сайте в какой-то промежуток времени, допустим в последние две недели, можно поставить флаг "Новинка". Делается это следующим образом:
В типе данных товара (модуль Шаблоны данных) добавляется поле "Дата добавления" с идентификатором '''publish_time'''. В результате чего, при добавлении товара, в новое поле будет автоматически записываться текущее время. Далее в файл classes/modules/custom.php, после слов TODO..., добавим небольшой кастомный макрос:
+
<ol>
 +
<li>В типе данных "Объект каталога" в модуле "Шаблоны данных" добавляем поле "Дата добавления" с идентификатором '''publish_time'''.</li>
 +
В результате чего, при добавлении товара, в новое поле будет автоматически записываться текущее время.
 +
<li>Затем, в файле '''~/classes/components/catalog/customMacros.php''' опишем макрос, который будет автоматически помечать только что созданный товар как "Новинку":</li>
 +
 
 
<source lang="php">
 
<source lang="php">
public function newobject($time_add){
+
public function setIsNewItem(iUmiEventPoint $oEventPoint) {
if(!$time_add) return "";
+
if ($oEventPoint->getMode() != "after"){
// Временной интервал в две недели
+
return;
$interval = 60*60*24*14;
+
}
// Прошедшее время, с момента добавления товара
+
$begin_time = time() - $time_add;
+
$object = $oEventPoint->getRef("element");
if($begin_time < $interval) return "Новинка";
+
$object->setValue('new', 1);
 +
$object->commit();
 
}
 
}
 
</source>
 
</source>
  
Для tpl шаблонов, вызов макроса можно прописать в блоках '''objects_block_line''' и '''view_block''' следующим образом:
+
Макрос описан, осталось лишь добавить привязку к событию создания объекта. В файле '''/classes/components/catalog/custom_events.php''' пишем следующее:
<pre>
+
<source lang ="php">
%custom newobject(%publish_time%)%
+
<?php
</pre>
+
new umiEventListener('systemCreateElement', 'catalog', 'setIsNewItem');
[[Категория:Модуль Каталог]]
+
</source>
 +
 
 +
<li>Теперь перейдём к автоматизации. Допустим, мы хотим, чтобы каждые две недели список "Новинок" актуализировался - "старые новинки" становились обычными товарами, а новые поддерживались в актуальном состоянии. Воспользуемся для этого таким механизмом как [http://dev.docs.umi-cms.ru/nastrojka_sistemy/cron/ cron].</li>
 +
</ol>
 +
 
 +
=== Настройка cron и написание макроса обновления ===
 +
После настройки выполнения cron на хостинге у нас будет выполняться ряд обработчиков, присутствующих в системе по умолчанию. По аналогии с предыдущим пунктом, сначала напишем метод, который будет выполняться по cron:
 +
<ol>
 +
<li>Для начала, в файле '''~/classes/components/catalog/customMacros.php''' опишем константу, которая будет равна необходимому нам временному интервалу - две недели - в секундах. Добавим её после "public $module":
 +
<source lang="php">
 +
public $module;
 +
 +
// Промежуток времени, в котором добавленный товар считается новинкой
 +
// Данное число = 2 неделям
 +
const INTERVAL = 1209600;
 +
</source>
 +
</li>
 +
<li>
 +
Теперь напишем код обработчика:
 +
<source lang="php">
 +
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);
 +
}
 +
}
 +
}
 +
</source>
 +
</li>
 +
<li>Обработчик написан, осталось только привязать его к событию выполнения cron. В файле '''/classes/components/catalog/custom_events.php''' добавляем следующую запись:
 +
<source lang="php">
 +
new umiEventListener('cron', 'catalog', 'actualize');
 +
</source>
 +
</li>
 +
 
 +
</ol>
 +
 
 +
== Итог ==
 +
После всех выполненных действий мы реализовали функционал, который делает для нас доступными следующие возможности:
 +
<ol>
 +
<li>При добавлении товара он автоматически помечается как "Новинка"</li>
 +
<li>Как только пройдёт заданный нами промежуток времени, при запуске cron все "новинки", если они находятся вне нашего временного интервала, станут обычными товарами.</li>
 +
</ol>
 +
 
 +
[[Категория:Модуль Каталог]][[Категория:Написание кастомных макросов]]

Текущая версия на 12:45, 28 мая 2019

Актуально для версии 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 все "новинки", если они находятся вне нашего временного интервала, станут обычными товарами.