@anton99zel
29а класс средней школы №7

Как сгруппировать элементы по разделам в Битрикс?

<?
$arSelect = Array("ID", "IBLOCK_ID", "IBLOCK_SECTION_ID", "PREVIEW_TEXT", "NAME", "DATE_ACTIVE_FROM","PROPERTY_*");//IBLOCK_ID и ID обязательно должны быть указаны, см. описание arSelectFields выше
$arFilter = Array("IBLOCK_ID"=>38, "ACTIVE_DATE"=>"Y", "ACTIVE"=>"Y");
$res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>50), $arSelect);
while($ob = $res->GetNextElement()){ 
 $arFields = $ob->GetFields();  
echo "Номер раздела ".$arFields[IBLOCK_SECTION_ID]."</br>Вопрос: ".$arFields[NAME]."<br>Ответ: ".$arFields[PREVIEW_TEXT]."<br><br>";

 $arProps = $ob->GetProperties();
//print_r($arProps);
}
?>


Получаю все элементы всех разделов инфоблока.
Принт
Номер раздела 2310
Вопрос: Можно ли вернуть заказ?
Ответ: Да, в течение 14 дней.

Номер раздела 2312
Вопрос: Как часто?
Ответ: Очень часто

Номер раздела 2312

Вопрос: Какие гарантии?
Ответ: 5 лет


Как вывести "Номер раздела" (в идеале название) только один раз, чтобы было так (номер раздела в группе выводим раз):

Номер раздела 2310
Вопрос: Можно ли вернуть заказ?
Ответ: Да, в течение 14 дней.

Номер раздела 2312
Вопрос: Как часто?
Ответ: Очень часто
                                         <!-- вырезали дубль 2312 -->
Вопрос: Какие гарантии? 
Ответ: 5 лет


и почему IBLOCK_SECTION_ID отрабатывает, а IBLOCK_SECTION_NAME нет?
  • Вопрос задан
  • 3803 просмотра
Пригласить эксперта
Ответы на вопрос 2
2amedia
@2amedia
Сайты на Bitrix - 1000 р/час
одним запросом вы не обойдетесь, придется делать один и один в цикле, что некрасиво но не критично
как-то так например
$arFilter = Array(
		'IBLOCK_ID' => $IBLOCK_ID,
		'GLOBAL_ACTIVE' => 'Y',
	);
	$arSelect = Array(
		'ID',
		'NAME'
	);
	
	$db_list = CIBlockSection::GetList (Array(), $arFilter, false, $arSelect, false);
	while ($ar_result = $db_list->GetNext ())
	{
		$arSections[]= array('ID'=> $ar_result['ID'], 'NAME'=> $ar_result['NAME']);
	}

foreach ($arSections as $index => $arSection)
{
	$arSelect = Array(
		"ID",
		"IBLOCK_ID",
		"IBLOCK_SECTION_ID",
		"PREVIEW_TEXT",
		"NAME",
		"DATE_ACTIVE_FROM",
		"PROPERTY_*"
	);
	$arFilter = Array(
		"IBLOCK_ID" => 38,
		"ACTIVE_DATE" => "Y",
		"ACTIVE" => "Y",
		'IBLOCK_SECTION_ID' => $arSection['ID']
	);
	$res = CIBlockElement::GetList (Array(), $arFilter, false, Array(), $arSelect);
	while ($ob = $res->GetNextElement ())
	{
		$arItem = $ob->GetFields ();
		$arItem['PROPS'] = $ob->GetProperties ();
		$arItems[] = $arItem;
	}
	$arFullSection = $arSection;
	$arFullSection['ITEMS'] = $arItems;
	$arFullSection[] = $arFullSection;
unset($arItem,$arItems,$arFullSection);
}


arFullSection - будет содержать все нужные данные
Ответ написан
Комментировать
gromdron
@gromdron
Работаю с Bitrix24
А не пробовали воспользоваться штатной возможностью группировки: arGroupBy (3 параметр в getList, который у вас в значении false)

Массив полей для группировки элемента. Если поля указаны, то выборка по ним группируется (при этом параметр arSelectFields будет проигнорирован), а в результат добавляется поле CNT - количество сгруппированных элементов. Если указать в качестве arGroupBy пустой массив, то метод вернет количество элементов CNT по фильтру. Группировать можно по полям элемента, а также по значениям его свойств. Для этого в качестве одного из полей группировки необходимо указать PROPERTY_, где PROPERTY_CODE - ID или символьный код свойства.
Необязательное. По умолчанию false - записи не группируются.


Группировать по ID секции.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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