Была задача реализовать торговый каталог теплиц для интернет магазина. Смысл состоит в том, что мы имеем два инфоблока, в одном из которых содержится перечень теплиц, а в другом выгрузка из 1С каталога составных частей для этих теплиц. Получается, что готовая теплица состоит из составных частей, которые привязываются к ней через свойство. Каждая составная часть имеет несколько типов цен, которые выводятся в зависимости от региона. И так, суть проблемы... Чтобы вывести общую стоимость хотя бы одной теплицы, нам надо перебрать все составные части этой теплицы. Так как в массиве элемента "Теплица" (в шаблоне вывода элементов инфоблока) $arElement выводятся id-шники связанных элементов, мы можем получить цену каждой составной части. Сделав поправку на регион и на кол-во связанных элементов я запускаю цикл, который достаёт цену каждой составной части и плюсует её в переменную общей суммы. И всё бы ни чего, но когда на странице выводится не одна теплица, а к примеру 27... количество запросов к базе переваливает за 227, а это не комельфо. Собственно как быть и что может помочь?
Вот часть этого ужасного кода:
Вот часть этого ужасного кода:
Код |
---|
// --- Смотрим регион $arSelect = Array("ID","NAME", "PROPERTY_TYPE_PRICE"); $arFilter = Array("IBLOCK_ID"=>9, "ID"=>$_SERVER["city"]); $arRes = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); if($ob = $arRes->GetNextElement()): $arFields1 = $ob->GetFields(); endif; // --- Считаем общую цену for($i=0; $i<count($arElement["PROPERTIES"]["count"]["VALUE"]); $i++): $arSelect = Array("ID","NAME"); $arFilter = Array("IBLOCK_ID"=>30, "ID"=>$arElement["PROPERTIES"]["count"]["VALUE"][$i]); $arRes = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); if($ob = $arRes->GetNextElement()): $arFields2 = $ob->GetFields(); $arOutput["NAME"][$i] = $arFields2["NAME"]; $arOutput["QUANTITY"][$i] = $arElement["PROPERTIES"]["count"]["DESCRIPTION"][$i]; $arPrice = GetCatalogProductPrice($arFields2["ID"], $arFields1["PROPERTY_TYPE_PRICE_VALUE"]); $arOutput["PRICE"][$i] = $arPrice["PRICE"]; $arOutput["ALL_PRICE"] +=$arOutput["PRICE"][$i]*$arOutput["QUANTITY"][$i]; endif; endfor; |