link_web
@link_web
Magento, Laravel, Zend, Shopify, Prestashop, WP

Как в шаблоне вывести количество всех товаров?

Всех приветствую. Никогда раньше с битриксом не сталкивался и тут нужно решить казалось бы простую задачу. Нужно в шаблоне, в хедере вывести список товаров, что то как тут:
На сайте 10000 товаров.
Нашел какой то код в интернете
$ar_res = CCatalogProduct::GetByID($arElement['ID']); 
echo "<br>На складе: "; 
print_r($ar_res['QUANTITY']); 
echo " шт."; 
}

Но получаю ошибку, что модуль не подключен. Вроде нашел как подключать, но этот код не логичен для моей задачи потому что здесь нужно задавать id какого то товара, а мне нужно получить просто из коллекции список всех записей. Какие идеи?
  • Вопрос задан
  • 281 просмотр
Пригласить эксперта
Ответы на вопрос 2
Вы, скорее всего, не поймёте о чём я, раз у вас опыта с Битриксом нет, но я всё же напишу. Постарайтесь разобраться, это будет очень полезно.

Решить такую задачу можно "в лоб": прямо в шапке сайта сделать запрос CIBlockElement::GetList(), посчитать количество элементов и вывести их. И именно после таких решений Битрикс называют тормозным, потому что оно совершенно неправильное.

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

Это значение можно и нужно считать в фоне, поэтому правильное решение будет таким:
  1. Напишите агента, который периодически будет делать выборку и сохранять количество товаров в БД через COption::SetOptionInt();.
  2. Выведите его в шапке сайта через COption::GetOptionInt();.
  3. Настройте, чтобы агенты выполнялись по крону.
  4. Вызовите функцию агента один раз через php-консоль в админке.
  5. PROFIT.


Альтернативным решением было бы вместо агента использовать события инфоблоков, но оно сложнее и не надёжнее - может возникнуть race condition, например.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы