Вывод новостей из раздела с подразделами: кастомизация компонентами bitrix:catalog.section.list и bitrix:news.list

Довелось прошерстить форумы битрикса на предмет вывода новостей с подразделами на странице. Ответила в ветке форума, вдруг кому пригодятся мои «костыли» или наведет на мысли.
Итак, используем компонент bitrix:catalog.section.list и все изменения выполняем в шаблоне (не дефолтном).
Внутрь шаблона засовываем код вызова компонента bitrix:news.list со своим шаблоном (можно дефолтный). Замечу, что примерно по такому же принципу строятся стандартные битриксовые комплексные компоненты.
В итоге получаем вот такие страсти:
002

И, разумеется, эти страсти не подойдут для большого количества разделов… Я в цикле всего лишь вызываю компонент ровно столько раз, сколько подразделов на странице.
Видно, что при уровне вложенности больше 2 начались уже косяки — все элементы отображаются и в разделе (где не надо), и в подразделе (как надо). Однако, для моей задачи проще сказать «нельзя», чем изобретать что-то другое. Поэтому ставлю уровень вложенности 1, убираю возможность показа количества элементов в разделе («птичками» в настройках компонента) и получаю готовое решение своей задачи.
Так как разделов может быть много, и элементов в них, то надо как-то продумать переход по якорям.
Беру так же весь код от компонента bitrix:catalog.section.list и немножечко видоизменяю — дописываю якорь по имени элемента, а указатель делаю в виде ссылки-пробела:
004 содержание

Код шаблона для bitrix:catalog.section.list:

<div class=»catalog-section-list»>
<ul id=»tab-of-cont»>
<b>Быстрый переход по содержимому:</b><br>
<?
$CURRENT_DEPTH=$arResult[«SECTION»][«DEPTH_LEVEL»]+1;
foreach($arResult[«SECTIONS»] as $arSection):
$this->AddEditAction($arSection[‘ID’], $arSection[‘EDIT_LINK’], CIBlock::GetArrayByID($arSection[«IBLOCK_ID»], «SECTION_EDIT»));
$this->AddDeleteAction($arSection[‘ID’], $arSection[‘DELETE_LINK’], CIBlock::GetArrayByID($arSection[«IBLOCK_ID»], «SECTION_DELETE»), array(«CONFIRM» => GetMessage(‘CT_BCSL_ELEMENT_DELETE_CONFIRM’)));
if($CURRENT_DEPTH<$arSection[«DEPTH_LEVEL»])
echo «<ul style=’list-style-type:none’>»;
elseif($CURRENT_DEPTH>$arSection[«DEPTH_LEVEL»])
echo str_repeat(«</ul>», $CURRENT_DEPTH — $arSection[«DEPTH_LEVEL»]);
$CURRENT_DEPTH = $arSection[«DEPTH_LEVEL»];
?>
<li id=»<?=$this->GetEditAreaId($arSection[‘ID’]);?>»><a href=’#<?=$arSection[«NAME»]?>’><?=$arSection[«NAME»]?></a></li>
<?endforeach?>
</ul>
<p><?=$arResult[«SECTION»][«DESCRIPTION»]?></p>
<ul style=’list-style-type:none; padding-top:0;’>
<?
$CURRENT_DEPTH=$arResult[«SECTION»][«DEPTH_LEVEL»]+1;
foreach($arResult[«SECTIONS»] as $arSection):
$this->AddEditAction($arSection[‘ID’], $arSection[‘EDIT_LINK’], CIBlock::GetArrayByID($arSection[«IBLOCK_ID»], «SECTION_EDIT»));
$this->AddDeleteAction($arSection[‘ID’], $arSection[‘DELETE_LINK’], CIBlock::GetArrayByID($arSection[«IBLOCK_ID»], «SECTION_DELETE»), array(«CONFIRM» => GetMessage(‘CT_BCSL_ELEMENT_DELETE_CONFIRM’)));
if($CURRENT_DEPTH<$arSection[«DEPTH_LEVEL»])
echo «<ul style=’list-style-type:none’>»;
elseif($CURRENT_DEPTH>$arSection[«DEPTH_LEVEL»])
echo str_repeat(«</ul>», $CURRENT_DEPTH — $arSection[«DEPTH_LEVEL»]);
$CURRENT_DEPTH = $arSection[«DEPTH_LEVEL»];
?>
<li id=»<?=$this->GetEditAreaId($arSection[‘ID’]);?>»><a name='<?=$arSection[«NAME»]?>’>&nbsp;</a><span class=»h3″><?=$arSection[«NAME»]?></span></li>
<?/****************************************/?>
<?$APPLICATION->IncludeComponent(«bitrix:news.list», «virtual-exhibitions», array(
«IBLOCK_TYPE» => «facult_res»,
«IBLOCK_ID» => «607», // Iblock ID
«NEWS_COUNT» => «»,
«SORT_BY1» => «ACTIVE_FROM»,
«SORT_ORDER1» => «DESC»,
«SORT_BY2» => «SORT»,
«SORT_ORDER2» => «ASC»,
«FILTER_NAME» => «»,
«FIELD_CODE» => array(
0 => «»,
1 => «»,
),
«PROPERTY_CODE» => array(
0 => «url»,
1 => «»,
),
«CHECK_DATES» => «Y»,
«DETAIL_URL» => «»,
«AJAX_MODE» => «N»,
«AJAX_OPTION_JUMP» => «N»,
«AJAX_OPTION_STYLE» => «Y»,
«AJAX_OPTION_HISTORY» => «N»,
«CACHE_TYPE» => «N»,
«CACHE_TIME» => «36000000»,
«CACHE_FILTER» => «N»,
«CACHE_GROUPS» => «Y»,
«PREVIEW_TRUNCATE_LEN» => «»,
«ACTIVE_DATE_FORMAT» => «d.m.Y»,
«SET_TITLE» => «N»,
«SET_STATUS_404» => «N»,
«INCLUDE_IBLOCK_INTO_CHAIN» => «N»,
«ADD_SECTIONS_CHAIN» => «N»,
«HIDE_LINK_WHEN_NO_DETAIL» => «N»,
«PARENT_SECTION» => $arSection[«ID»], // передаём ID родительского раздела
«PARENT_SECTION_CODE» => «»,
«DISPLAY_TOP_PAGER» => «N»,
«DISPLAY_BOTTOM_PAGER» => «N»,
«PAGER_TITLE» => «»,
«PAGER_SHOW_ALWAYS» => «N»,
«PAGER_TEMPLATE» => «»,
«PAGER_DESC_NUMBERING» => «N»,
«PAGER_DESC_NUMBERING_CACHE_TIME» => «36000»,
«PAGER_SHOW_ALL» => «N»,
«DISPLAY_DATE» => «N»,
«DISPLAY_NAME» => «Y»,
«DISPLAY_PICTURE» => «Y»,
«DISPLAY_PREVIEW_TEXT» => «Y»,
«AJAX_OPTION_ADDITIONAL» => «»
),
false
);?>
<?/****************************************/?>
<?endforeach?>
</ul>
</div>


Понравилась моя запись?
Кликни по рекламному баннеру ниже. Тебе бесплатно и не сложно, а мне - честный заработок блогом и приятное дополнение к энтузиазму на чашку кофе :-)