Битрикс: как узнать список разделов и элементов

Бывают ситуации, когда нужно вывести список элементов или разделов конкретного информационного блока (инфоблока). Воспользуемся CIBlockElement::GetList для элементов и CIBlockSection::GetList для разделов соответственно.

Как вывести список элементов инфоблока в 1С-Битрикс

Для этого создадим тестовую страницу в корне нашего сайта, например test.php . Код нашего файла будет иметь следующий вид:

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("test");
?>
Text...
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

Как видим, подключается header и footer (заголовок нам не нужен в принципе). Теперь напишем код CIBlockElement::GetList между подключением header и footer.

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");?>

<?
if (CModule::IncludeModule("iblock")):

	$iblock_id = 14;
	# show url my elements
	$my_elements = CIBlockElement::GetList (
	  Array("ID" => "ASC"),
	  Array("IBLOCK_ID" => $iblock_id),
	  false,
	  false,
	  Array('ID', 'NAME', 'DETAIL_PAGE_URL')
	);

	while($ar_fields = $my_elements->GetNext())
	{
	  echo urldecode($ar_fields['DETAIL_PAGE_URL'])." ;<br>";
	}
endif;
?>

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

 

Код мы написали, теперь давайте посмотрим что мы делаем:

  • подключаем модуль iblock т.к. без него наш код может не работать;
  • задаем переменную, которая равна ID необходимого информационного блока (в моем случае это 14);
  • в переменную записываем CIBlockElement::GetList, иначе не сможем с ним работать;
  • в CIBlockElement::GetList есть массивы с данными:
    Array(“ID” => “ASC”) – массив для сортировки, в нашем случае это ID по возрастанию,
    Array(“IBLOCK_ID” => $iblock_id) – массив для фильтрации – мы выбрали только по ID инфоблока,
    false, false – тут можно задать массивы для группировки элементов и выбрать параметры постраничной навигации (как правило, они не нужны, ставим каждому false),
    Array(‘ID’, ‘NAME’, ‘DETAIL_PAGE_URL’) – последний, но не менее важный массив, который вернет выбранные поля. В нашем случае он вернет ID, Имя элемента, полный путь к детальному элементу (его url).
  • выводим по очереди все наши элементы с помощью цикла.

urldecode – я использовал для правильного отображения кириллических урлов (да, их оказывается кто-то еще использует 🙂 ). $ar_fields[‘DETAIL_PAGE_URL’] – выведет вам в каждой строке ссылку на элемент, при желании, вы можете заменить DETAIL_PAGE_URL на ID или NAME и т.д. в зависимости от того, какая перед вами стоит задача.

Важно знать! Если вы не выбираете поля для последнего массива (который обычно называют arSelect), вы рискуете прилично загрузить ваш сервер, ведь он будет тащить для каждого элемента, значения всех его полей. Представьте сколько это запросов к БД.

Как узнать значения свойств инфоблока в Битриксе

Ну хорошо, мы выводим имя, id и ссылку – казалось бы, зачем весь этот цирк? А вот теперь рассмотрим случай, когда мы с помощью GetList можем узнать свойства инфоблока, конкретного элемента. Заменяем наш arSelect, он же массив с выбором полей на
Array(‘ID’, ‘NAME’, ‘DETAIL_PAGE_URL’, ‘PROREPTY_TITLE’)
где, TITLE – это символьный код вашего свойства (а приписка PROREPTY_ служит как раз для того чтобы это и указать).

Отобразить на экран свойство битрикса можно несколькими способами, в зависимости от его типа – строка это или список. Это может быть как

echo ar_fields['PROREPTY_TITLE']." ;<br>";

так и

echo $ar_fields['PROREPTY_TITLE_VALUE']." ;<br>";

Если у вас что-то не получается, давайте просто выведем список элементов массива:

<?
echo "<pre>";
print_r($ar_fields);
echo "</pre>";
?>

Кстати, если у вас много элементов в массиве, то для такой цели лучше вывести всего поля первого элемента (это может быть товар, новость и т.д.). Как это сделать? Либо дописать в GetList строку

 Array ("nTopCount" => 1),

либо создать счетчик перед массивом и вывести для 1 элемента, примерно вот так:

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");?>

<?
if (CModule::IncludeModule("iblock")):

	$iblock_id = 14;
	$i = 0;
	# show url my elements
	$my_elements = CIBlockElement::GetList (
	  Array("ID" => "ASC"),
	  Array("IBLOCK_ID" => $iblock_id),
	  false,
	  Array ("nTopCount" => 1),
	  Array('ID', 'NAME', 'DETAIL_PAGE_URL', 'PROREPTY_TITLE')
	);

	while($ar_fields = $my_elements->GetNext())
	{
	  if($i == 0) 
	  	print_r($ar_fields);
	  $i++;
	}
endif;
?>

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

ПС – показал где писать nTopCount 🙂

Как вывести список разделов в 1С Битрикс

Описание почти такое же как и в предыдущим примере, но советую все же глянуть описание полей и возможных вариантов в официальной документации.

<?$my_sections = CIBlockSection::GetList (
      Array("ID" => "ASC"),
      Array("IBLOCK_ID" => 14, "ACTIVE" => "Y"),
      false,
      Array('ID', 'NAME', 'CODE')
   );

   while($ar_fields = $my_sections->GetNext())
   {
      echo urldecode($ar_fields['CODE'])." ;<br>";
   }?>

Если вы заметили, у нас теперь массив с выбором по порядку четвертый а не пятый и добавился параметр ” ACTIVE” => “Y” , который выводит только активные “разделы”(это работает и для CIBlockElement, просто в данном скрипте нашими элеменами являются разделы инфоблока). Принцип работы с CIBlockSection::GetList почти такой же, как и с CIBlockElement. В данном скрипте мы выводим символьный код разделов, предварительно преобразовав в читаемую кириллицу.

автор: Dmitriy

З 2011 року займаюся веб-розробкою. Зараз я – PHP Full Stack Developer.
Обговорити ваш проект, а також дізнатися більше про мене ви можете на цьому сайті:
dev.forwww.com

Email: dmitriyribka@gmail.com

33 коментаря

  1. Вопрос: какого хера я это должен делать средствами api и почему столь элементарную задачу невозможно реализовать стандартными компонентами битрикса?

    1. Ну, что вам ответить на этот счет – разработчики платформы не могут учесть абсолютно все желания пользователей. Огромная часть функционала уже и так реализована “в коробке”, тут вам и динамические компоненты новостей, и каталоги и т.д. Плюс, перед покупкой редакции, каждый человек в состоянии загрузить демо версию и понять что в ней присутствует. А вот понимание API битрикса – это больше для разработчиков, чтобы удовлетворить те самые выше упомянутые желания пользователей 🙂

  2. Подскажите, а как вывести список элементов одного из разделов инфоблока (например по его ID)
    Другими словами: есть инфоблок с ID=100, внутри которого созданы разделы со своими ID. Как вытянуть последний элемент определенного раздела инфоблока (по ID инфоблока и ID раздела)?

    1. Что-то в таком стиле:
      $my_elements = CIBlockElement::GetList (
      Array(“ID” => “DESC”), // сортируем по айди по убыванию
      Array(“IBLOCK_ID” => 100, “ACTIVE” => “Y”, “SECTION_ID” => __АЙДИ-СЕКЦИИ__),
      false,
      Array(“nTopCount” => 1), // кажется так ограничивается кол-во, если не сработает замените “nTopCount” на “nPageSize”
      Array(‘ID’, ‘NAME’, ‘DETAIL_PAGE_URL’)
      );
      $ar_fields = $my_elements->GetNext();

      print_r($ar_fields); // свойства элемента

  3. Здравствуйте. А как вывести на страницу определенный элемент инфоблока, если мы знаем ID раздела, в котором он находится и ID искомого элемента? Также, интересует, как вывести определенный раздел инфоблока, зная его ID. Спасибо

    1. чтобы вывести по айди вам нужно указать в arFilter “IBLOCK_ID” => ВАШ_ИНФОБЛОК, “ID” => ВАШ_АЙДИ ЭЛЕМЕНТА – в данном случае добавлять айди раздела нет смысла.
      а для того чтобы вывести свойства определенного раздела можно воспользоваться CIBlockSection::GetByID, если я вас правильно понял – https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblocksection/getbyid.php

  4. Доброго времени суток! СКОЛЬКО СТОЯТ ВАШИ УСЛУГИ , у меня 1с битрикс бизнес стиль задан но доведение до хорошего сайта еще много , настройки , подключение 1с , изменения

  5. Здравствуйте. Имеется элемент, он принадлежит разделу(одному), но так же для этого элемента установлены “Дополнительные категории”, в которых он будет отображаться. Вопрос следующий. Как получить доступ к Дополнительным категориям” элемента, что бы узнать в каких категориях он еще будет отображать?

    1. если дополнительные категории это свойство, то вам нужно в фильтре прописать “PROPERTY_CODE” => VAL, где CODE это символьный код свойства, а VAL это значение, подробнее вы сможете найти в документации по GetList – https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getlist.php

      1. Спасибо! Фильтр примерно будет выглядеть так.
        $arFilter = array(“IBLOCK_ID” => 2, “SECTION_ID” => $arSection[“ID”], “PROPERTY_ADDITION_CATEGORIES” => $arSection[“NAME”]);
        ADDITION_CATEGORIES – это код свойства “Дополнительные категории”. Верно?

  6. Здравствуйте еще раз. Можете посоветовать что-нибудь по такому вопросу. Есть корзина(sale.basket.basket), в ней присутствуют два пользовательских свойства(два чекбокса, при их выборе в заказ добавляются сопутствующие штук к выбранным товарам). Необходимо пересчитывать цену , если эти чекбоксы активны, и отправлять в sale.order.ajax, так же, там(sale.order.ajax), в форме итогового заказа, должны отображаться кроме выбранных товаров вот эти пользовательские свойства с их ценой.

  7. Здравствуйте=) Вопрос. В настройках модуля стоит параметр Разрешать покупку при отсутствии товара false(чекбокс не выбран). Мне же необходимо для некоторых товаров разрешать покупку при отсутствии товара(их много, выставлять в каждом товаре этот параметр не вариант), подскажите, как программно это можно реализовать?

  8. Здравствуйте! Вопрос немножко не по теме текущей, но в рамках того вопроса что вы когда то оговаривали в другой теме.

    Имеется инфоблок Новости, в нем есть 2 раздела – Раздел1 и Раздел2, в Разделе 1 есть три новости: Новость мира1, Новость мира2, Новость мира3, а в Разделе2 есть одна новость Региональная новость.

    Вопрос такой, как можно реализовать, чтобы при просмотре детальной новости Новость мира 1, внизу отдельным компонентом вывести остальные новости этого раздела (В данном случае это Новость мира2 и Новость мира3)? Именно определенные новости в определенном месте.
    Как компонент каталога – похожие или сопутствующие.

    И 2 вопрос, возможно ли как то выводить баннер на странице Новость мира2 (то есть внутри конкретной новости, конкретного раздела с помощью условий)?

  9. Добрый вечер. Подскажите, пожалуйста, как получить id текущего элемента каталога и раздела к которому принадлежит текущий элемент . Есть id инфоблока.

    1. Добрый вечер, попробуйте сделать в компоненте print_r($arResult) – там обычно есть вся информация. если это компонент новости или каталог – там будет и ID и SECTION_ID (либо IBLOCK_SECTION_ID)

        1. да,

          if (CModule::IncludeModule(“iblock”)):
          $IBLOCK_ID = 1;
          $res = CIBlockElement::GetList (
          Array(“ID” => “ASC”),
          Array(“IBLOCK_ID” => $IBLOCK_ID, “ACTIVE” => “Y”, “CODE” => $arResult[‘ELEMENT_CODE’]),
          false,
          false,
          Array(‘ID’, ‘NAME’, ‘DETAIL_PAGE_URL’)
          );
          if ($arItem = $res->GetNext()) {
          print_r($arItem);
          }
          endif;

Залишити коментар до Iryna Скасувати коментар