Битрикс вывести только для раздела

Вывести информацию, только на первом уровне раздела каталога, в 1С-Битрикс

Задача: на сайте, в каталоге, выводится два фильтра — боковой и верхний. Оба компонента подключены в файле section.php комплексного шаблона.

Соответственно, оба фильтра отображаются во всех разделах и подразделах каталога, не зависимо, от глубины врожености. Нужно отобразить верхний фильтр- только на первых уровнях.

Получение самого верхнего родительского раздела инфоблока

Нам нужно определить, является ли текущий раздел, в котором находится пользователь, корневым. Для этого воспользуемся методом CIBlockSection::GetNavChain — возвращает путь по дереву от корня до раздела SECTION_ID

Передали параметры из комплексного шаблона ID инфоблока и ID текущего раздела. В var_dump получим всю цепочку разделов, с основными параметрами разделов- начиная с корневого.

Далее: нужно получить ID корневого раздела и сопоставить с текущим. Просто оборвем цикл while на первой итерации, сопоставим разделы и создадим переменную для дальнейшего сравнения.

Здесь мы создали переменную $itMainSection при условии если текущий раздел совпал с корневым. Дальше, просто, обворачиваем фильтр в условие.

Если переменная $itMainSection существует, значит пользователь находится в корневом разделе и выводится умный фильтр.

Читайте также:  Татарник как вывести с участка

Дополнительные поля раздела.

Расширение первоначальной задачи: нужно показывать фильтр во всех разделах, но в некоторых его нужно скрыть. При этом, в пользовательском поле указывается Показывать фильтр Да/Нет. Что бы не проходиться по всем вложенным, достаточно указать этот параметр только у корневого раздела.

В примере выше, метод CIBlockSection::GetNavChain не возвращает пользовательские поля, если нужно выполнить двойную проверку, например: корневой ли раздел и заполнено ли его пользовательское поле. Нужно добавить метод CIBlockSection::GetList получив пользовательские поля.

В примере ниже, выполняется проверка: корневой ли раздел и установлено ли пользовательское поле раздела UF_TOP_FILTER.

Такой проверки достаточно: в любом подразделе, этого раздела — не зависимо от глубины вложенности, фильтр показываться не будет.

Источник

Вывести разделы и подразделы инфоблока вместе с элементами

На форуме нашел следующее:

Надо смотреть не массив $arRes, а, например, $arFields, то есть:

еще вопрос: а как вывести значение свойств для каждого элемента,вроде в массиве arFields этого нет ?

Цитата
Владимир Спасенников пишет:
while($ob_res = $res->GetNextElement()) <
Цитата
Владимир Спасенников пишет:
$arProps = $ob_res->GetProperties();
$arFields = $ob_res->GetFields();>

«Не нравится — критикуй, критикуешь — предлагай, предлагаешь — делай, делаешь — отвечай.»

Сергей Павлович Королёв

Цитата
Сергей Остапюк пишет:
Так в цыкле используйте CIBlockElement::GetList с фильтром по SECTION_ID.

вот после таких советов люди жалуются что у них де- сайты ложатся даже на мощных серверах и битрикс «гумно».

если у вас 100 секций, у вас будет 100 ГетЛистов (а если у элементов куча свойств, то это 100 запросов с кучей джойнов, это если ещё без всяких документооборотов и учёта прав групп).

делайте так
сначала собирайте все айдишники секций в отдельный массив,
потом этот массив айдишников передавайте в отдельный GetList где в фильтр по SECTION_ID передавайте полученный массив с айдишниками секций.

В $arSelect укажите чтобы в числе прочего вам вернулся SECTION_ID элемента (таким образом в дальнейшем проще будет привязывать элементы к разделам).

чем лучше этот подход от подхода предложенного Сергеем — мы делаем один лишний GetList, вместо нескольких.

надеюсь достаточно понятно изъяснился ) как отсортировать элементы я думаю уже сами сообразите.

Источник

Bitrix catalog.section как сделать вывод разделов и элементов?

Нужно вывести элементы отсортированные по разделам на одной странице.

Например: Раздел 1<Элемент1, Элемент2, Элемент3>, потом на этой же странице ниже Раздел 2 <Элемент1, элемент2, элемент3>и.т.д.

Через result_modifer смог получить название раздела для каждого элемента:

foreach ($arResult[‘ITEMS’] as $key => $arItem)
<
$arSectionList = array();
$rsSections = CIBlockElement::GetElementGroups($arItem[‘ID’]);
while ($arSection = $rsSections->Fetch())
<
$arSectionList[] = array(
‘ID’ => $arSection[‘ID’],
‘NAME’ => $arSection[‘NAME’],
);
>
$arItem[‘SECTION_NAME’] = $arSectionList;
$arResult[‘ITEMS’][$key] = $arItem;
>

Теперь хочу собрать массив вида Раздел 1<Элемент1, Элемент2, Элемент3>. Подскажите решение.

  • Вопрос задан более трёх лет назад
  • 29234 просмотра

Запрос в цикле — ай-яй-яй, как плохо.

А вообще вот прямо для этого решения:

И на выходе получишь $arResult[‘ITEMS_BY_GROUP’] где ключами будут ID разделов, а значениями массивы содержащие ключи элементов ITEMS принадлежащих этому разделу.
Но если много элементов то вот это вот: CIBlockElement::GetElementGroups надо выносить за пределы цикла.

в result_modifier.php изменить

Мне человек для вывода отдельными группами элементов из подразделов предложил вот такой вариант:

в result_modifier.php шаблона вывода списка примерно так:

в template.php обычный цикл по $arResult[‘COL_циферка’] 3 раза и фильтр в таком случае не нужен.

Самый простой способ, «в лоб»:
Если каталог небольшой ( CIBlockSection::GetTreeList()
Далее перебираем полученный массив разделов и для каждого раздела выбираем все принадлежащие ему элементы
CIBlockElement::GetList()

— но будет огромное кол-во лишних запросов. Можно обойтись двумя:
1. выбираем все разделы CIBlockSection::GetTreeList()
2. выбираем все элементы CIBlockElement::GetList()
3. объединяем два массива в один.

Источник

Вывести новости из конкретного раздела инфоблока Битрикс

Бывает что требуется вывести конкретные новости или статьи из одного раздела инфоблока в Битрикс, для этого потребуется сначала вывести сам компонент «Новости и статьи» на страницу а затем проделать ряд манипуляций, скопировать шаблон news в папку своего шаблона и применить фильтр.

Начинаем

Итак имеем готовый инфоблок с разделами:

На страницу мы вывели компонент «Новости», попрошу не путать с компонентом «Список новостей» с ним все попроще, нам нужно вывести на страницу статьи только из раздела «Где погулять, что посмотреть»- его ID 90 (первый в списке на картинке).

Для начала два раза кликаем по иконке компонента в редактировании страницы на которую мы вывели «Новости» и попадаем в настройки параметров:

Необходимо развернуть список «Настройки фильтра», поставить галочку напротив «Показывать фильтр», в поле под ним вписываем слово arrFilter — все больше ничего здесь не трогаем и сохраняемся.

Далее переключаемся в режим редактирования исходного кода:

и в самом начале подключения добавляем строчку:

в итоге должно получиться вот так:

Поясню- цифра 90 это ID раздела новоси которого мы и хотим вывести на страницу.

Заканчиваем выводить новости из раздела инфоблока

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

Что бы его убрать, скопируем стандартный шаблон новостей в папку со своим шаблоном:

Открываем для редактирования шаблон списка новостей:

И в нем закомментируем кусок отвечающий за вывод фильтра, примерно с 24-ой по 39-ую строки, на картинке выделено синим:

Вот в общем-то и все. Имеем вывод публикаций только из одного раздела инфоблока Битрикс

Источник

Умный фильтр только на последнем уровне разделов каталога.

Если в разработаываемом магазине или в принципе в каталоге на Битрикс, вы выводите умный фильтр в разделах — он выводится во всех разделах и подразделах каталога.

Но, например: вы хотите скрыть умный фильтр во всех подразделах каталога, кроме самых последних, не имеющих подразделов, не зависимо от глубины разделов в инфолоке каталога.

Сделать это можно, по следующей инструкции:

Получаем ID раздела, зная его код. Методом CIBlockFindTools

В файл section.php комплексного шаблона каталога, в переменную $arResult, передается только SECTION_CODE

Для дальнейших манипуляций, нам потребуется именно ID текущего раздела каталога. Для это есть метод CIBlockFindTools::GetSectionID — который позволит получить SECTION_ID зная SECTION_CODE

Таким образом, теперь в переменной $arResult[‘SECTION_ID’] — мы получили ID текущего раздела, в котором находится пользователь.

Получаем подразделы, текущего раздела, зная его ID

Теперь, методом CIBlockSection::GetList, получаем подразделы раздела.

Здесь мы просто вывели ID и названия подразделов раздела. И само собой, если мы дошли до последнего раздела, в котором больше нет вложенных, нам просто ни чего не выведется.

Скрываем умный фильтр в разделах с подразделами

Для дальнейшей реализации, нам достаточно знать: О наличии хотя бы одно подраздела, не обязательно получать все. Просто модифицируем цикл вот так:

В переменную $haveSections мы передали ID первого подраздела и оборвали цикл на первой же итерации. Таким образом, в переменной у нас будет цифра или переменная будет пустая, если дошли до самого глубокого уровня вложенности

Дальше, обворачиваем вывод умного фильтра в условие с isset- просто провреяем «Не пустая ли переменная» $haveSections и если пустая- выводим фильтр

Вот и все! А скрыть товары (точнее bitrix:catalog.section) — можно точно также обвернув. Но лучше перевести параметр в каталоге «INCLUDE_SUBSECTIONS» => ‘N’ в ‘Y’, он же «Показывать элементы подразделов раздела:» — в настройках компонента каталога

Еще один способ определить последний раздел

Просто еще один способ, более простой но менее гибкий. Для определения последний ли раздел, можно воспользоваться смещением:

В переменной $arCurSection, в типовом шаблоне битрикс, хранится информация о текущем разделе. В своих шаблонах, если не наследуете типовые, можете получить данные о смещении из массива $arResult

Источник

Оцените статью