Была задача реализовать торговый каталог теплиц для интернет магазина. Смысл состоит в том, что мы имеем два инфоблока, в одном из которых содержится перечень теплиц, а в другом выгрузка из 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;
|