Назад

Битрикс — определяем новинки в каталоге

Главная
Блог
Битрикс — определяем новинки в каталоге

В современном интернет-маркетинге своевременное выделение новых товаров — критически важная задача. Ручное управление статусом "Новинка" отнимает много времени и часто приводит к ошибкам. В этой статье я подробно расскажу, как реализовать автоматическую систему управления новинками в каталоге на CMS Битрикс.

Почему автоматизация необходима?

  1. Экономия времени — больше не нужно вручную обновлять статусы товаров

  2. Актуальность данных — новинки всегда соответствуют последним поступлениям

  3. Улучшение UX — посетители видят действительно новые товары

  4. Гибкость — можно быстро изменить критерии отбора новинок

  5. Масштабируемость — решение работает для каталогов любого размера

Техническая реализация

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
        ]
    ],
    // Остальные параметры...
];

И адаптируем методы класса для обработки массива инфоблоков.

Оптимизация производительности

  1. Кеширование результатов — сохраняем список новинок в кеш

  2. Пакетная обработка — обновляем свойства группами

  3. Оптимизация запросов — используем минимально необходимые поля

Пример реализации кеширования:

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;
}

Заключение

Представленное решение предоставляет гибкий инструмент для автоматического управления новинками в каталоге Битрикс. Основные преимущества:

  • Полная автоматизация процесса

  • Гибкая настройка параметров

  • Поддержка нескольких инфоблоков

  • Ведение логов для анализа работы

  • Возможность расширения функционала

Для внедрения решения достаточно:

  1. Создать свойство "Новинка" в инфоблоке

  2. Настроить параметры в config.php

  3. Разместить файлы в соответствующих директориях

  4. При необходимости — добавить агента

Это решение значительно упростит управление каталогом и улучшит пользовательский опыт вашего интернет-магазина.

Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Читайте по теме
Все статьи
Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Все статьи