В современном интернет-маркетинге своевременное выделение новых товаров — критически важная задача. Ручное управление статусом "Новинка" отнимает много времени и часто приводит к ошибкам. В этой статье я подробно расскажу, как реализовать автоматическую систему управления новинками в каталоге на CMS Битрикс.
Почему автоматизация необходима?
-
Экономия времени — больше не нужно вручную обновлять статусы товаров
-
Актуальность данных — новинки всегда соответствуют последним поступлениям
-
Улучшение UX — посетители видят действительно новые товары
-
Гибкость — можно быстро изменить критерии отбора новинок
-
Масштабируемость — решение работает для каталогов любого размера
Техническая реализация
1. Подготовка инфраструктуры
Создадим файл /local/php_interface/autonewitems/config.php с настройками:
<?php
$autonewConfig = [
'IBLOCK_ID' => 5, // ID инфоблока каталога
'NEW_PROP_CODE' => 'IS_NEW', // Символьный код свойства
'LIMIT_NEW_ITEMS' => 12, // Максимальное количество новинок
'NEW_PERIOD_DAYS' => 30, // Срок новизны в днях
'LOG_ENABLED' => true, // Включить логирование
'LOG_PATH' => '/local/logs/new_items.log', // Путь к логу
'USE_AGENT' => true, // Использовать агента
'AGENT_INTERVAL' => 86400 // Интервал запуска в секундах (24 часа)
];2. Основной скрипт обработки
Создадим файл /local/php_interface/autonewitems/core.php:
<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/local/php_interface/autonewitems/config.php';
CModule::IncludeModule('iblock');
class AutoNewItems {
private $config;
private $errors = [];
public function __construct($config) {
$this->config = $config;
$this->checkRequirements();
}
private function checkRequirements() {
if (!CModule::IncludeModule('iblock')) {
$this->errors[] = 'Модуль iblock не подключен';
}
// Проверка существования инфоблока
$res = CIBlock::GetByID($this->config['IBLOCK_ID']);
if (!$res->Fetch()) {
$this->errors[] = 'Инфоблок не найден';
}
}
public function process() {
if (!empty($this->errors)) {
$this->log('Ошибки: '.implode(', ', $this->errors));
return false;
}
try {
$this->clearOldNewItems();
$this->setNewItems();
return true;
} catch (Exception $e) {
$this->log('Ошибка: '.$e->getMessage());
return false;
}
}
private function clearOldNewItems() {
$elements = [];
$res = CIBlockElement::GetList(
[],
[
'IBLOCK_ID' => $this->config['IBLOCK_ID'],
'ACTIVE' => 'Y',
'PROPERTY_'.$this->config['NEW_PROP_CODE'] => true
],
false,
false,
['ID']
);
while ($element = $res->Fetch()) {
CIBlockElement::SetPropertyValuesEx(
$element['ID'],
$this->config['IBLOCK_ID'],
[$this->config['NEW_PROP_CODE'] => false]
);
$elements[] = $element['ID'];
}
$this->log('Снят флаг новинки с элементов: '.count($elements));
return $elements;
}
private function setNewItems() {
$elements = [];
$date = new DateTime();
$date->modify('-'.$this->config['NEW_PERIOD_DAYS'].' days');
$res = CIBlockElement::GetList(
['DATE_CREATE' => 'DESC'],
[
'IBLOCK_ID' => $this->config['IBLOCK_ID'],
'ACTIVE' => 'Y',
'>=DATE_CREATE' => $date->format('d.m.Y H:i:s')
],
false,
['nTopCount' => $this->config['LIMIT_NEW_ITEMS']],
['ID', 'NAME', 'DATE_CREATE']
);
while ($element = $res->Fetch()) {
CIBlockElement::SetPropertyValuesEx(
$element['ID'],
$this->config['IBLOCK_ID'],
[$this->config['NEW_PROP_CODE'] => true]
);
$elements[] = $element['ID'];
}
$this->log('Установлен флаг новинки для элементов: '.count($elements));
return $elements;
}
private function log($message) {
if ($this->config['LOG_ENABLED'])) {
file_put_contents(
$_SERVER['DOCUMENT_ROOT'].$this->config['LOG_PATH'],
date('[Y-m-d H:i:s] ').$message.PHP_EOL,
FILE_APPEND
);
}
}
}
// Запуск обработки
$processor = new AutoNewItems($autonewConfig);
$processor->process();3. Настройка агента для автоматического запуска
Добавим в /local/php_interface/init.php:
<?php
// Регистрация агента
if (CModule::IncludeModule('iblock')) {
require_once $_SERVER['DOCUMENT_ROOT'].'/local/php_interface/autonewitems/config.php';
if ($autonewConfig['USE_AGENT'])) {
CAgent::AddAgent(
"require_once '".$_SERVER['DOCUMENT_ROOT']."/local/php_interface/autonewitems/core.php';",
"",
"N",
$autonewConfig['AGENT_INTERVAL'],
"",
"Y",
ConvertTimeStamp(time() + $autonewConfig['AGENT_INTERVAL'], "FULL")
);
}
}Дополнительные возможности
1. Учет даты изменения товара
Модифицируем запрос в методе setNewItems():
$res = CIBlockElement::GetList(
['TIMESTAMP_X' => 'DESC'], // Сортировка по дате изменения
[
'IBLOCK_ID' => $this->config['IBLOCK_ID'],
'ACTIVE' => 'Y',
'>=TIMESTAMP_X' => $date->format('d.m.Y H:i:s') // Фильтр по дате изменения
],
false,
['nTopCount' => $this->config['LIMIT_NEW_ITEMS']],
['ID', 'NAME', 'DATE_CREATE', 'TIMESTAMP_X']
);2. Реализация через D7 API
Создадим альтернативную версию обработчика:
private function setNewItemsD7() {
$elements = [];
$date = new \Bitrix\Main\Type\DateTime();
$date->add('-'.$this->config['NEW_PERIOD_DAYS'].' days');
$query = \Bitrix\Iblock\ElementTable::query()
->setSelect(['ID', 'NAME', 'DATE_CREATE'])
->setFilter([
'IBLOCK_ID' => $this->config['IBLOCK_ID'],
'ACTIVE' => 'Y',
'>=DATE_CREATE' => $date
])
->setOrder(['DATE_CREATE' => 'DESC'])
->setLimit($this->config['LIMIT_NEW_ITEMS']);
$result = $query->exec();
while ($element = $result->fetch()) {
\Bitrix\Iblock\ElementTable::update(
$element['ID'],
['PROPERTY_'.$this->config['NEW_PROP_CODE'] => true]
);
$elements[] = $element['ID'];
}
return $elements;
}3. Обработка нескольких инфоблоков
Модифицируем конфиг:
$autonewConfig = [
'IBLOCKS' => [
[
'ID' => 5,
'NEW_PROP_CODE' => 'IS_NEW',
'LIMIT_NEW_ITEMS' => 12
],
[
'ID' => 6,
'NEW_PROP_CODE' => 'NEW_ITEM',
'LIMIT_NEW_ITEMS' => 8
]
],
// Остальные параметры...
];И адаптируем методы класса для обработки массива инфоблоков.
Оптимизация производительности
-
Кеширование результатов — сохраняем список новинок в кеш
-
Пакетная обработка — обновляем свойства группами
-
Оптимизация запросов — используем минимально необходимые поля
Пример реализации кеширования:
private function getNewItemsWithCache() {
$cache = \Bitrix\Main\Data\Cache::createInstance();
$cacheTime = 3600; // 1 час
$cacheId = 'autonew_items_'.$this->config['IBLOCK_ID'];
$cachePath = '/autonew/';
if ($cache->initCache($cacheTime, $cacheId, $cachePath)) {
return $cache->getVars();
}
$cache->startDataCache();
$items = $this->setNewItems();
$cache->endDataCache($items);
return $items;
}Заключение
Представленное решение предоставляет гибкий инструмент для автоматического управления новинками в каталоге Битрикс. Основные преимущества:
-
Полная автоматизация процесса
-
Гибкая настройка параметров
-
Поддержка нескольких инфоблоков
-
Ведение логов для анализа работы
-
Возможность расширения функционала
Для внедрения решения достаточно:
-
Создать свойство "Новинка" в инфоблоке
-
Настроить параметры в config.php
-
Разместить файлы в соответствующих директориях
-
При необходимости — добавить агента
Это решение значительно упростит управление каталогом и улучшит пользовательский опыт вашего интернет-магазина.