Визуальное оформление недавно добавленных товаров — различия между версиями
Cmac (обсуждение | вклад) |
Alelekov (обсуждение | вклад) |
||
(не показана 1 промежуточная версия 1 участника) | |||
Строка 1: | Строка 1: | ||
+ | '''Актуально для версии 20''' | ||
+ | |||
+ | == Задача == | ||
+ | Автоматически помечать добавленный в последние две недели товар как "Новинка". | ||
+ | |||
+ | == Решение == | ||
+ | |||
С помощью не сложных манипуляций, для товара, добавленного на сайте в какой-то промежуток времени, допустим в последние две недели, можно поставить флаг "Новинка". Делается это следующим образом: | С помощью не сложных манипуляций, для товара, добавленного на сайте в какой-то промежуток времени, допустим в последние две недели, можно поставить флаг "Новинка". Делается это следующим образом: | ||
− | В типе данных | + | <ol> |
+ | <li>В типе данных "Объект каталога" в модуле "Шаблоны данных" добавляем поле "Дата добавления" с идентификатором '''publish_time'''.</li> | ||
+ | В результате чего, при добавлении товара, в новое поле будет автоматически записываться текущее время. | ||
+ | <li>Затем, в файле '''~/classes/components/catalog/customMacros.php''' опишем макрос, который будет автоматически помечать только что созданный товар как "Новинку":</li> | ||
+ | |||
<source lang="php"> | <source lang="php"> | ||
− | public function | + | public function setIsNewItem(iUmiEventPoint $oEventPoint) { |
− | if( | + | if ($oEventPoint->getMode() != "after"){ |
− | + | return; | |
− | $ | + | } |
− | + | ||
− | $ | + | $object = $oEventPoint->getRef("element"); |
− | + | $object->setValue('new', 1); | |
+ | $object->commit(); | ||
} | } | ||
</source> | </source> | ||
− | Для | + | Макрос описан, осталось лишь добавить привязку к событию создания объекта. В файле '''/classes/components/catalog/custom_events.php''' пишем следующее: |
− | < | + | <source lang ="php"> |
− | + | <?php | |
− | </ | + | 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
Задача
Автоматически помечать добавленный в последние две недели товар как "Новинка".
Решение
С помощью не сложных манипуляций, для товара, добавленного на сайте в какой-то промежуток времени, допустим в последние две недели, можно поставить флаг "Новинка". Делается это следующим образом:
- В типе данных "Объект каталога" в модуле "Шаблоны данных" добавляем поле "Дата добавления" с идентификатором 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 все "новинки", если они находятся вне нашего временного интервала, станут обычными товарами.