Ситуация:
каталог товаров - инфоблок1
структура на сайте 1 - инфоблок2
структура на сайте 2 - инфоблок3
...
т.е. можно ли задать принадлежность элементов из инфоблока1 к разделам инфоблока2,3, но можно ли потом выводить элементы инфоблока1, через инфоблок2,3, т.е. 2 и 3 - просто разделы, без элементов, элементы в 1.
Сделал привязку через пользовательское свойство элементов (привязка к разделам другого инфоблока). Работает, но время выполнения 1 компонента, работающего с такой структурой очень большое (больше секунды), а таких компонента 2, в итоге время работы увеличивается аж на 3 секунды на нормальном виртуальном хостинге.
1. Компонент, показывающий структуру каталогов внутри текущего:
2. Компонент, показывающий элементы внутри текущего каталога:
Интересуют подсказки по оптимизации.
каталог товаров - инфоблок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)) : function strtoupper_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 strtoupper(implode($ss)); } endif; if (!function_exists(t_text)) : function t_text($s) { return strtoupper_cyr($s[0]).strtolower_cyr(substr($s,1)); } endif; ?> <? foreach($arResult["SECTIONS"] as $Section) { $arSection[] = $Section; }?> <? switch ($_REQUEST['ING']) { case "CONFECTIONERY": $INGTXT = "Кондитерская промышленность"; break; case "BAKERY": $INGTXT = "Хлебобулочная промышленность"; break; case "MEAT": $INGTXT = "Мясная промышленность"; break; } ?> <span class="t-nav"><?=$arResult['CurSec']["NAME"]?$INGTXT." -> ".t_text($arResult['CurSec']["NAME"]):$INGTXT?></span> <br /><br /> <div id="btn_container"> <a style="text-decoration:none" href="/catalog/?ING=<?=$_GET[ING]?>"> <span class="catalog_btn <? if (!isset($_REQUEST['BY_NOMEN'])) echo "catalog_btn_active"?>">Готовая продукция</span> </a> <a style="text-decoration:none" href="/catalog/?ING=<?=$_GET[ING]?>&BY_NOMEN"> <span class="catalog_btn <? if (isset($_REQUEST['BY_NOMEN'])) echo"catalog_btn_active"?>">По видам номенклатуры</span> </a> </div> <?if ($arSection) {?> <div id="content"> <span class="b1"></span><span class="b2"></span><span class="b3"></span> <div class="content"> <div class="classic"> <table> <? $i = 0; ?> <? foreach($arSection as $el) : ?> <? if ($i==4) : $i=0;?> </tr> <tr> <? endif; ?> <? if($el["EL_CNT"]>0) : ?> <td><span><a href="/catalog/index.php?SECTION_ID=<?=$el["ID"]?><?= isset($_REQUEST["NOMEN"]) ? "&NOMEN=".$_REQUEST["NOMEN"] : "&ING=".$_REQUEST["ING"]?><? if (isset($_GET['BY_NOMEN'])) echo "&BY_NOMEN" ?>"><?=t_text($el["NAME"]);?></a> <i><?=$el["EL_CNT"]?></i></span></td> <?$i++;?> <? endif ?> <? endforeach ?> </table> </div> </div> <span class="b3"></span><span class="b2"></span><span class="b1"></span> </div> <br /> <?}?> |
2. Компонент, показывающий элементы внутри текущего каталога:
Код |
---|
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?> <? if(!CModule::IncludeModule("iblock")) return; if(!CModule::IncludeModule("catalog")) return; $arOrder = Array("NAME"=>"ASC"); $arFilter = Array("IBLOCK_ID"=>$arParams["IBLOCK_GOODS"]); $arGroupBy = false; $arNavStartParams = false; $arSelectedFields = false; $itemList = CIBlockElement::GetList($arOrder,$arFilter,$arGroupBy,$arNavStartParams,$arSelectedFields); while($item = $itemList->GetNextElement()) : $prop['INGREDIENTS'] = $item->GetProperty("INGREDIENTS"); $prop['NOMEN'] = $item->GetProperty("CML2_TRAITS"); $prop['SEC_SITE'] = $item->GetProperty("SEC_SITE"); $prop['PDF'] = $item->GetProperty("PDF"); $prop['FORMAT'] = $item->GetProperty("FORMAT"); $item = $item->GetFields(); if (!isset($_REQUEST["BY_NOMEN"])) { if(($prop['INGREDIENTS']["VALUE_XML_ID"]==$_REQUEST["ING"])&&(in_array($_REQUEST['SECTION_ID'],$prop['SEC_SITE']['VALUE']))) : $item['PROPERTIES'] = $prop; $arItems[] = $item; endif; } else { $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($arSections as $Section) : if($prop['NOMEN']['VALUE'][0]==$Section['NAME']) { break; } endforeach; if(($prop['INGREDIENTS']["VALUE_XML_ID"]==$_REQUEST["ING"])&&($_REQUEST['SECTION_ID']==$Section['ID'])) : $item['PROPERTIES'] = $prop; $arItems[] = $item; endif; } endwhile; $arResult['ITEMS'] = $arItems; $this->IncludeComponentTemplate(); ?> |
Код |
---|
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?> <?$template_path="/bitrix/templates/cpt_main/";?> <? if (count($arResult['ITEMS']) > 0) : ?> <div class="t-nav"><? $step = 10; $page = isset($_REQUEST['PAGE'])?$_REQUEST['PAGE']:1; $num_page = round(count($arResult['ITEMS'])/$step); if ($num_page > 1) : for($i=1; $i <= $num_page; $i++) :?> <a style="margin:5px;" href='?SECTION_ID=<?=$_REQUEST['SECTION_ID']?>&ING=<?=$_REQUEST['ING']?>&PAGE=<?=$i?><?= isset($_REQUEST['BY_NOMEN'])?"&BY_NOMEN":false; ?>'><?= $i==$page?"<span style='font-size:200%'>".$i."</span>":$i; ?></a> <? endfor; endif; ?></div> <span class="b1"></span><span class="b2"></span><span class="b3"></span> <div class="spisoktovarov"> <h1 id="t-pos"></h1> <? for ($i = ($page-1)*$step; $i < $page*$step; $i++) : if (!$item = $arResult['ITEMS'][$i]) break; $arOrder = Array("NAME"=>"ASC"); $arFilter = Array("IBLOCK_ID"=>$arParams["IBLOCK_GOODS"],"PRODUCT_ID"=>$item['ID']); $arGroupBy = false; $arNavStartParams = false; $arSelectedFields = false; $itemPrice_res = CPrice::GetList($arOrder,$arFilter,$arGroupBy,$arNavStartParams,$arSelectedFields); while($price = $itemPrice_res->Fetch()) { $price['VALUE'] = $price['PRICE']; $item['PRICES'][$price['CATALOG_GROUP_ID']] = $price; }; $arFilter = Array("GROUP_ID"=>$USER->GetUserGroupArray()); $userCatalogGroup = CCatalogGroup::GetGroupsList($arFilter)->Fetch(); $item["PREVIEW_PICTURE"] = CFile::GetFileArray($item["PREVIEW_PICTURE"]); $item["DETAIL_PICTURE"] = CFile::GetFileArray($item["DETAIL_PICTURE"]); $price = round($item['PRICES'][$userCatalogGroup['CATALOG_GROUP_ID']]['VALUE'],2); ?> <? if (($item['PROPERTIES']['PDF']['VALUE'] == '')) { $pdf = false; } else { $pdf = CFile::GetFileArray($item['PROPERTIES']['PDF']['VALUE']); } ?> <div class="element"> <a rel="galery" href="<?=$item['DETAIL_PICTURE']['SRC']?>"><img src="<?=$item['PREVIEW_PICTURE']['SRC'] ? $item['PREVIEW_PICTURE']['SRC'] : '/bitrix/templates/cpt_main/images/no_photo.png'?>" width="86" /></a> <div> <a class='list_product_name' href="detail.php?SECTION_ID=<?=$_REQUEST['SECTION_ID']?>&ID=<?=$item['ID']?>&ING=<?=$_GET['ING']?><? if(isset($_GET['BY_NOMEN'])) echo "&BY_NOMEN"?>"><h1><?=$item['NAME']?></h1></a> <p><? echo substr($item['PREVIEW_TEXT'],0,100); if (strlen($item['PREVIEW_TEXT'])>100) {echo "...";};?></p> <span class='production_list_desc_load'><a class='list_product_name' href="detail.php?SECTION_ID=<?=$_REQUEST['SECTION_ID']?>&ID=<?=$item['ID']?>&ING=<?=$_GET['ING']?><? if(isset($_GET['BY_NOMEN'])) echo "&BY_NOMEN"?>">Описание</a><? if ($pdf) : ?><a class="pdf vsl_help" href="<?= $pdf['SRC']; ?>">Скачать pdf с описанием<div><span><i>Для просмотра требуется программа чтения <b>PDF</b>-файлов (например <b>Adobe Reader</b>)</i></span></div></a><? endif; ?></span> </div> <div class="price"> <div><p>Цена</p><h2><?=$price;?></h2><p>руб.</p></div> <div class="tovar"><p>Количество</p><input id="tov<?= $item['ID']; ?>" type="text" value="1" /> <div class="img"> <img class="schet" src="<?=$template_path?>images/plus.png" onclick='plus("<?= $item['ID']; ?>")' /> <img class="schet" src="<?=$template_path?>images/minus.png" onclick='minus("<?= $item['ID']; ?>")' /> <a class="inline" href="#add2basket" onclick="add2basket(<?= $item['ID']; ?>)"><img src="<?=$template_path?>images/polozhitvkorzinu.png" class="vkorzinu" /></a> </div> <select id="quantity_select"> <? foreach ($item['PROPERTIES']['FORMAT']['VALUE'] as $format) : preg_match("/[0-9]+/",$format,$x); ?> <option onclick="multi('<?= $x[0] ?>','tov<?= $item['ID']; ?>')"><?=$format?></option> <? endforeach ?> </select> </div> </div> </div> <?endfor?> </div> <span class="b3"></span><span class="b2"></span><span class="b1"></span> <? endif ?> |
Интересуют подсказки по оптимизации.
«just for fun» © Linus Torvalds