Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Вывод элементов инфоблока в структуре каталогов другого

00 голосов
3
Ситуация:
каталог товаров - инфоблок1
структура на сайте 1 - инфоблок2
структура на сайте 2 - инфоблок3
...

т.е. можно ли задать принадлежность элементов из инфоблока1 к разделам инфоблока2,3, но можно ли потом выводить элементы инфоблока1, через инфоблок2,3, т.е. 2 и 3 - просто разделы, без элементов, элементы в 1.

Сделал привязку через пользовательское свойство элементов (привязка к разделам другого инфоблока). Работает, но время выполнения 1 компонента, работающего с такой структурой очень большое (больше секунды), а таких компонента 2, в итоге время работы увеличивается аж на 3 секунды на нормальном виртуальном хостинге.

1. Компонент, показывающий структуру каталогов внутри текущего:

Код
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<?
   if(!CModule::IncludeModule("iblock")) return;
   
   $arOrder = Array("NAME"=>"ASC");
   $arFilter = Array("IBLOCK_ID"=>$arParams["IBLOCK_GOODS"]);
   $arGroupBy = false;
   $arNavStartParams = false;
   $arSelectedFields = false;
      
   $ItemsList = CIBlockElement::GetList($arOrder,$arFilter,$arGroupBy,$arNavStartParams,$arSelectedFields);
   
   while($Items = $ItemsList->GetNextElement()) {
      $arItems[] = Array(
                  "INGREDIENTS"=>$Items->GetProperty("INGREDIENTS"),
                  "SEC_SITE"=>$Items->GetProperty("SEC_SITE"),
                  "CML2_TRAITS"=>$Items->GetProperty("CML2_TRAITS"),
               );
   }

   if (!isset($_REQUEST["BY_NOMEN"])) {
   
      $arOrder = Array("NAME"=>"ASC");
      $arFilter = Array("IBLOCK_ID"=>$arParams["IBLOCK_SITE_CATS"]);
      $ListSections = CIBlockSection::GetList($arOrder, $arFilter, true);
      
      while($Section = $ListSections->Fetch()) {
         $arSections[] = $Section;
      }
      
      foreach ($arItems as $Items) :      
         
         $prop_ing = $Items["INGREDIENTS"];
         $prop_sec = $Items["SEC_SITE"];
         
         for ($i=0;$i<count($arSections);$i++) :
         
            if(($prop_ing["VALUE_XML_ID"]==$_REQUEST["ING"])&&
               (in_array($arSections[$i]['ID'],$prop_sec['VALUE']))) $arSections[$i]["EL_CNT"]++;
         
         endfor;
         
      endforeach;

   } else {
   
      $arOrder = Array("NAME"=>"ASC");
      $arFilter = Array("IBLOCK_ID"=>$arParams["IBLOCK_NOMEN_CATS"]);
      $ListSections = CIBlockSection::GetList($arOrder, $arFilter, true);
      
      while($Section = $ListSections->Fetch()) {
         $arSections[] = $Section;
      }
      
      foreach ($arItems as $Items) :      
         
         $prop_ing = $Items["INGREDIENTS"];
         $prop_nomen = $Items["CML2_TRAITS"];
         
         for ($i=0;$i<count($arSections);$i++) :
         
            if(($prop_ing["VALUE_XML_ID"]==$_REQUEST["ING"])&&
               ($arSections[$i]['NAME']==$prop_nomen['VALUE'][0])) $arSections[$i]["EL_CNT"]++;
      
         endfor;
                  
      endforeach;      
   }
   
   $CurSec = CIBlockSection::GetByID(intval($_REQUEST['SECTION_ID']));
   $arResult['CurSec'] = $CurSec->Fetch();
   
   $arResult["SECTIONS"] = $arSections;
   
   $this->IncludeComponentTemplate(); 
?>


Код
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>


<?
    if (!function_exists(strtolower_cyr)) :
        function strtolower_cyr($s) {
            $A = " ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ";
            $a = " йцукенгшщзхъфывапролджэячсмитьбюё";
            $ss = "";
            for ($i = 0; $i < strlen($s); $i++) {
                $ss[$i] = strpos($A,$s[$i]) ? $a[strpos($A,$s[$i])] : $s[$i];
            }
            return strtolower(implode($ss));
        }
    endif;
    
    if (!function_exists(strtoupper_cyr)) :
&
спросил 25 Янв, 14 от Lisica (900 баллов)

3 Ответы

00 голосов
Код
$itemList = CIBlockElement::GetList($arOrder,$arFilter,$arGroupBy,$arNavStartParams,$arSelectedFields);
while($item = $itemList->GetNextElement()) : 
    .....
    $arOrder = Array("NAME"=>"ASC"); 
    $arFilter = Array("IBLOCK_ID"=>$arParams["IBLOCK_SITE_CATS"]); 
    $ListSections = CIBlockSection::GetList($arOrder, $arFilter, true);
    .....

Жёстко. Зачем вы делаете CIBlockSection::GetList() в цикле, и зачем вам там понадобилось знать количество элементов (это сильно замедляет запрос)?
ответил 23 Май, 14 от Ly (4,580 баллов)
00 голосов
ответил 19 Сен, 14 от Pomnep (13,960 баллов)
00 голосов
Цитата
Dmitry Ban пишет:
Жёстко. Зачем вы делаете CIBlockSection::GetList() в цикле, и зачем вам там понадобилось знать количество элементов (это сильно замедляет запрос)?

хмм, да жёстко. И такое чувство, что это я уже выносил из цикла, просто видимо потом всё поломал и откатился шибко сильно назад... про количество элементов - хз, видимо копипаст с другого места - забыл исправить.
Спасибо.

Цитата
Евгений Жуков пишет:
Время выполнения будет расти пропорционально увеличению количества элементов. К тому же выборка будет содержать и неактивные элементы. Оно Вам надо?

это я прекрасно понимаю, что пропорционально, от того и поднял топик. Неактивных элементов нет, но фильтр пропишу сейчас - так будет вернее. Однако фильтрация, на доли секунды увеличила время (просто у мну нет неактивных...)

Цитата
Евгений Жуков пишет:
Представим, что у Вас 1000 элементов. И хотя бы 30 секций. внутренний цикл выполнится 30 тыс. раз. Про то, что функцию count Вы вызываете на КАЖДОЙ итерации вместо 1 вызова на цикл, я молчу.

У меня почти 1000 элементов и больше 50 секций... это я всё понимаю, опять же потому и топик.
с count() эт да, всегда такое добро выношу - лохонулся тут.

Цитата
Евгений Жуков пишет:
Есть встроенные в php функции.

Конечно, но почему то для кириллицы у мну они не сработали, я тогда удивился кстати...

Цитата
Евгений Жуков пишет:
Нерационально.

Что именно?

Цитата
Евгений Жуков пишет:
Рамиль, я правильно понимаю, что это эмуляция постранички?

Да.

Т.к. ранее, пол года назад я пробовал постраничку как положена на АПИ битрикса. Но вышел казус.
Имею 6 элементов, установка на вывод по 2 элемента на страницу, соответственно должно быть 3 страницы... фигвам - 4! :o Получается такая фигня:
1 - 2
2 - 2
3 - 1
4 - 1

Почему так я не понял... кста даже тему создавал по этому вопросу, но тогда мне помочь не смогли. В мускуле с этим всё проще и понятее, щас я кста тему ту откапаю.

Вот она кста - http://dev.1c-bitrix.ru/community/forums/messages/forum6/topic28248/message155444/
ответил 23 Янв, 15 от Lisica (900 баллов)

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

0 голосов
2 ответов
0 голосов
3 ответов
0 голосов
1 ответ
спросил 09 Дек, 13 от Halisha (120 баллов)
0 голосов
2 ответов
спросил 21 Март, 13 от Exluziv (160 баллов)
0 голосов
2 ответов