Есть четыре инфоблока, у каждого порядка 10-25 свойств, причем элемент первого инфоблока содержит несколько элементов (3-5) второго инфоблока, каждый элемент второго инфоблока содержит 1 элемент 3 инфоблока и 10-20 элементов четвертого инфоблока.
Каждое свойство - элемент справочников.
Свойства получаю следующими двумя фнукциями:
Код |
---|
public function getAllPropertys($iBlockID,$ElementID,$count){
$arSelect = Array("ID", "CODE", "NAME", "IBLOCK_ID", "IBLOCK_SECTION_ID", "IBLOCK_CODE", "ACTIVE", "DATE_ACTIVE_FROM", "DATE_ACTIVE_TO", "SORT",
"PREVIEW_PICTURE", "PREVIEW_TEXT", "PREVIEW_TEXT_TYPE", "DETAIL_PICTURE", "DETAIL_TEXT", "DETAIL_TEXT_TYPE", "SEARCHABLE_CONTENT", "DATE_CREATE", "LIST_PAGE_URL",
"DETAIL_PAGE_URL", "SHOW_COUNTER", "SHOW_COUNTER_START","PROPERTY_*");
$arFilter = Array("IBLOCK_ID"=>$iBlockID, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y","ID"=>$ElementID);
$res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>$count), $arSelect);
$i=0;
while($ob = $res->GetNextElement()){
$elemnets[$i] = $ob->GetFields();
$tmp_prop = $ob->GetProperties();
foreach ($tmp_prop as $code=>$prop){
if ($prop['LINK_IBLOCK_ID'] == 0){
$elemnets[$i]['PROPERTIES'][$code]=$prop;
if ($prop['PROPERTY_TYPE']=='F'){
$elemnets[$i]['PROPERTIES'][$code]['FILE']=CFile::GetByID($elemnets[$i]['PROPERTIES'][$code]['VALUE']);
}
}
else
$elemnets[$i]['PROPERTIES'][$code]=$this->getPropertyVal($prop['LINK_IBLOCK_ID'],$prop['VALUE'],$count);
}
$i++;
}
return ($elemnets);
}
public function getPropertyVal($iBlockID,$val,$count){
if ( ($iBlockID==51) OR ($iBlockID==52) OR ($iBlockID==53) OR ($iBlockID==54)){
return $this->getAllPropertys($iBlockID,$val,$count);
}else{
if (is_array($val)){
return $this->getAllPropertys($iBlockID,$val,$count);
}else{
$res = CIBlockElement::GetByID($val);
if($ar_res = $res->GetNext()){
return $ar_res;
}
else{
return false;
}
}
}
}
|
Блоки с ID 51, 52, 53 и 54 как раз и есть эти четыре инфоблока, так вот получается, что на один элемент второго инфоблока приходится порядка 1200-1500 запросов, что занимает около 3 секунд, от сюда при выводе элемента первого инфоблока, где 3-5 элементов второго, 3х5 = 15 секунд или 6000-7500 запросов.
Вопрос: что можно сделать, чтобы оптимизировать число запросов и снизить время обработки? Вариант типа не выводит всю информацию, а раскидать на страницы не прокатывает, клиенту нужно именно все на одной страницы.