Ситуация:
каталог товаров - инфоблок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
Получается такая фигня: