Anadi
@Anadi
Если ответ Вам помог мой, решением отметье его!

Как получить количество доступных товаров в разделах?

Привет знатоки! Кастомлю menu.sections, хочу вывести в меню количество доступных товаров в разделах. Как рекурсивно получить количество доступных товаров?
while ($arSection = $rsSections->GetNext()) {

            $resElemCnt = CIBlockElement::GetList(
                            false, array(
                        "IBLOCK_ID" => $arParams["IBLOCK_ID"],
                        "IBLOCK_SECTION_ID" => $arSection["ID"],
                        "ACTIVE" => "Y",
                        "INCLUDE_SUBSECTIONS" => "Y",
                        "SUBSECTION" => "Y",
                        "CATALOG_AVAILABLE " => "Y",
                            ), false, false, array("ID"));

            $arResult["SECTIONS"][] = array(
                "ID" => $arSection["ID"],
                "DEPTH_LEVEL" => $arSection["DEPTH_LEVEL"],
                "CNT" => $arSection["ELEMENT_CNT"], // Показывает все активные элементы, надо только доступные
                //"CNT" => $resElemCnt->SelectedRowsCount(), // Показывает только доступные товары! Считает почти верно, но родительский раздел показывает 0.
                "~NAME" => $arSection["~NAME"],
                "~SECTION_PAGE_URL" => $arSection["~SECTION_PAGE_URL"],
            );
            $arResult["ELEMENT_LINKS"][$arSection["ID"]] = array();
        }
  • Вопрос задан
  • 854 просмотра
Решения вопроса 1
winer
@winer
занимаюсь разработкой сайтов на 1c-bitrix
Вывод количества товаров в разделах, при большом каталоге - один из способов сделать сайт медленным.
Для того чтобы посчитать количество товаров в разделах приходится делать SELECT N + 1 (запросы в цикле).
В вашем же случае еще хуже, т.к. для фильтрации товаров по доступности надо использовать фильтр CATALOG_AVAILABLE, который в свою очередь в SQL запросе будет дополнительно включать таблицу b_catalog_product. В итоге получите медленно работающий сайт.

Если нет возможности отказаться от вывода количества, то можно сделать так:
  • Создать у разделов пользовательское поле "Количество доступных товаров"
  • Написать агент, который будет вычислять сколько в разделе есть доступных товаров
  • Перенести агенты на cron
  • В компоненте menu.sections добавить для выборки в CIblockSection::GetList поле "Количество доступных товаров"


Таким образом нагрузку по вычисления количества товаров вы перенесете с хитов на агенты, и сам процесс формирования блока меню не будет отнимать много времени.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы