Задать вопрос
  • Как решить проблему с дублированием при ajax?

    @by_steris Автор вопроса
    Возможно решение костыльное, но мне помогло. Добавил проверку на выводимые элементы, если id повторяется, то элемент не выводится
    $(document).ready(function () {
            $(document).on('click', '.load_more', function () {
                var targetContainer = $('.loadmore_wrap'), // Контейнер, в котором хранятся элементы
                    url = $('.load_more').attr('data-url'); // URL, из которого будем брать элементы
                if (url !== undefined) {
                    $.ajax({
                        type: 'GET',
                        url: url,
                        dataType: 'html',
                        success: function (data) {
                            // Удаляем старую навигацию
                            $('.load_more').remove();
                            var elements = $(data).find('.loadmore_item'), // Ищем элементы
                                pagination = $(data).find('.load_more'); // Ищем навигацию
    
                            // Перебираем найденные элементы и добавляем только уникальные по ID
                            elements.each(function() {
                                var itemId = $(this).attr('id'); // Получаем ID элемента
                                if (!targetContainer.find('#' + itemId).length) { // Проверяем, существует ли элемент с таким ID
                                    targetContainer.append($(this)); // Добавляем уникальный элемент в контейнер
                                }
                            });
    
                            // Добавляем новую навигацию следом
                            targetContainer.after(pagination);
                        }
                    });
                }
            });
        });
    Написано
  • Как передать список разделов в Битрикс?

    @by_steris Автор вопроса
    koder_1, А ну да про это я знал, просто чтобы массив сразу отсортировать, как нужно использовал CIBlockSection::GetList, хотя вот сейчас сомневаюсь в том как был отсортирован сам $arResult))
    Написано
  • Как передать список разделов в Битрикс?

    @by_steris Автор вопроса
    koder_1, а вообще это и реализовано с помощью catalog.section.list, но сам массив собран в result_modifier
    Или можно было как-то проще решить через сам компонент ?
    Написано
  • Как передать список разделов в Битрикс?

    @by_steris Автор вопроса
    Большое спасибо koder_1 (куда Вам задонатить :), очень помогли, т.к. я новичок в PHP)
    Вот итоговый код собранного массива с 3мя вложениями, может для кого-то тоже будет полезно

    <? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
    
    $newSection = [];
    $sectionLvlOne = 0;
    $sectionLvlTwo = 0;
    $sectionLvlThree = 0;
    
    $arFilter = array('IBLOCK_ID' => 1, 'ACTIVE' => 'Y');
    $arSelect = array('IBLOCK_ID', 'ID', 'NAME', 'SECTION_PAGE_URL', 'PICTURE', 'DEPTH_LEVEL', 'IBLOCK_SECTION_ID', 'LEFT_MARGIN');
    $rsSect = CIBlockSection::GetList(
        array("DEPTH_LEVEL" => "ASC", "LEFT_MARGIN" => "ASC"),
        $arFilter,
        false,
        $arSelect
    );
    
    $sections = array();
    while ($arSect = $rsSect->GetNext()) {
        $sections[] = $arSect;
    }
    
    // ПЕРВЫЙ УРОВЕНЬ ВЛОЖЕННОСТИ
    foreach ($sections as $arSect) {
        if ($arSect['DEPTH_LEVEL'] == 1) {
            $newSection[$arSect['ID']] = $arSect;
        }
    }
    
    // ВТОРОЙ УРОВЕНЬ ВЛОЖЕННОСТИ
    foreach ($sections as $arSect) {
        if ($arSect['DEPTH_LEVEL'] == 2) {
            $sectionLvlOne = $arSect['IBLOCK_SECTION_ID'];
            if (!isset($newSection[$sectionLvlOne]['SECOND_LVL'])) {
                $newSection[$sectionLvlOne]['SECOND_LVL'] = array();
            }
            $newSection[$sectionLvlOne]['SECOND_LVL'][$arSect['ID']] = $arSect;
        }
    }
    
    // ТРЕТИЙ УРОВЕНЬ ВЛОЖЕННОСТИ
    $sections_level_3 = [];
    foreach ($sections as $arSect) {
        if ($arSect['DEPTH_LEVEL'] == 3) {
            $sectionLvlTwo = $arSect['IBLOCK_SECTION_ID'];
            if (!isset($sections_level_3[$sectionLvlTwo])) {
                $sections_level_3[$sectionLvlTwo] = array();
            }
            $sectionLvlThree = $arSect['ID'];
            $sections_level_3[$sectionLvlTwo][$sectionLvlThree] = $arSect;
        }
    }
    
    foreach ($newSection as $newSectionKey => $newSectionItem) {
        if (isset($newSectionItem['SECOND_LVL']) && is_array($newSectionItem['SECOND_LVL']) && count($newSectionItem['SECOND_LVL'])) {
            foreach ($newSectionItem['SECOND_LVL'] as $second_level_id => $second_level_item) {
                if (isset($sections_level_3[$second_level_id])) {
                    $newSection[$newSectionKey]['SECOND_LVL'][$second_level_id]['THIRD_LVL'] = $sections_level_3[$second_level_id];
                }
            }
        }
    }
    
    $arResult['NEW_SECTIONS'] = $newSection;
    
    global $USER;
    if ($USER->IsAdmin()) {
        //echo '<pre>'; print_r($arResult['NEW_SECTIONS']); '</pre>';
    }
    ?>
    Написано
  • Как передать список разделов в Битрикс?

    @by_steris Автор вопроса
    koder_1, Или нужно что-то поменять в цикле, чтобы в массив передавались не айди значения разделов, а сами массивы ?
    Написано
  • Как передать список разделов в Битрикс?

    @by_steris Автор вопроса
    koder_1, Да, тоже этот момент прогуглил не успел отписать, что поправил
    Теперь третий уровень получается вида:
    [THIRD_LVL] => Array
    (
    [0] => 76
    [1] => 73
    [2] => 179
    [3] => 77
    [4] => 180
    [5] => 97
    [6] => 81
    [7] => 74
    [8] => 75
    [9] => 82
    )

    дальше чтобы получить сами разделы третьего уровня нужно опять прибегунть к CIBlockSection::GetList ?
    Написано
  • Как передать список разделов в Битрикс?

    @by_steris Автор вопроса
    koder_1, а что эта за ошибка с типом
    [TypeError]
    Illegal offset type in isset or empty (0)
    /local/templates/main/components/bitrix/catalog/services/bitrix/catalog.section.list/.default/result_modifier.php:62

    вот в этой строке
    if (isset($sections_level_3[$second_level_id]))

    Я так понимаю php не читает переменную $second_level_id
    Написано
  • Как передать список разделов в Битрикс?

    @by_steris Автор вопроса
    koder_1, честно не знаю по какой причине, но все равно собранный второй уровень добавляется последнему элементу первого уровня, третий пока не смотрел
    Написано
  • Как передать список разделов в Битрикс?

    @by_steris Автор вопроса
    koder_1, Если всё правильно понял, то так:
    <? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
    
    $newSection = [];
    $sectionLvlOne = 0;
    $sectionLvlTwo = 0;
    $sectionLvlThree = 0;
    
    
    $arFilter = array('IBLOCK_ID' => 1, 'ACTIVE' => 'Y');
    $arSelect = array('IBLOCK_ID', 'ID', 'NAME', 'SECTION_PAGE_URL', 'DETAIL_PICTURE', 'DEPTH_LEVEL', 'IBLOCK_SECTION_ID', 'LEFT_MARGIN');
    $rsSect = CIBlockSection::GetList(
        array("DEPTH_LEVEL" => "ASC", "LEFT_MARGIN" => "ASC"), //сортировка
        $arFilter, //фильтр
        false, //выводить количество элементов - нет
        $arSelect //выборка вывода
    );
    
    
    //while ($arSect = $rsSect->GetNext()) {
    //    if ($arSect['DEPTH_LEVEL'] == 1) {
    //        $newSection[$arSect['ID']] = $arSect;
    //        $sectionLvlOne = $arSect['ID'];
    //    }
    //    $arResult['NEW_SECTIONS'] = $newSection;
    //}
    
    $sections = array();
    while ($arSect = $rsSect->GetNext()) {
        $sections[] = $arSect;
    }
    
    foreach($sections as $arSect):
        if ($arSect['DEPTH_LEVEL'] == 1) {
            $newSection[$arSect['ID']] = $arSect;
            $sectionLvlOne = $arSect['ID'];
        }
    endforeach;
    foreach($sections as $arSect):
        if ($arSect['DEPTH_LEVEL'] == 2) {
            $newSection[$sectionLvlOne]['SECOND_LVL'][$arSect['ID']] = $arSect;
            $sectionLvlTwo = $arSect['ID'];
        }
    endforeach;
    foreach($sections as $arSect):
        if ($arSect['DEPTH_LEVEL'] == 3) {
            $newSection[$sectionLvlOne]['SECOND_LVL'][$sectionLvlTwo]['THIRD_LVL'][$arSect['ID']] = $arSect;
            $sectionLvlThree = $arSect['ID'];
        }
    endforeach;
    $arResult['NEW_SECTIONS'] = $newSection;


    но теперь всё добавляется самому последнему элементу в массиве
    Написано
  • Как передать список разделов в Битрикс?

    @by_steris Автор вопроса
    koder_1, вот так собираю первый уровень, а как без вложенности собрать второй уровень ?

    <?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
    
    $newSection = [];
    $sectionLvlOne = 0;
    $sectionLvlTwo = 0;
    $sectionLvlThree = 0;
    
    
    $arFilter = array('IBLOCK_ID' => 1, 'ACTIVE' => 'Y');
    $arSelect = array('IBLOCK_ID', 'ID', 'NAME', 'SECTION_PAGE_URL', 'DETAIL_PICTURE', 'DEPTH_LEVEL', 'IBLOCK_SECTION_ID', 'LEFT_MARGIN');
    $rsSect = CIBlockSection::GetList(
        array("DEPTH_LEVEL" => "ASC", "LEFT_MARGIN" => "ASC"), //сортировка
        $arFilter, //фильтр
        false, //выводить количество элементов - нет
        $arSelect //выборка вывода
    );
    
    
    while ($arSect = $rsSect->GetNext()) {
        if ($arSect['DEPTH_LEVEL'] == 1) {
            $newSection[$arSect['ID']] = $arSect;
            $sectionLvlOne = $arSect['ID'];
        }
        $arResult['NEW_SECTIONS'] = $newSection;
    }
    
    
    global $USER;
    if ($USER->IsAdmin()) {
        echo '<pre>'; print_r($arResult['NEW_SECTIONS']); '</pre>';
    }
    ?>
    Написано
  • Как передать список разделов в Битрикс?

    @by_steris Автор вопроса
    koder_1, Пока что не удается, можете пожалуйста именно "тыкнуть", что нужно сделать чтобы он наконец заработал
    Написано
  • Как передать список разделов в Битрикс?

    @by_steris Автор вопроса
    Т.е. внутри while для каждого условия использовать foreach ?
    Написано
  • Почему условие не срабатывает после первого выполнения?

    @by_steris Автор вопроса
    by_steris,

    // Получаем первые N элементов
            $(".section-compact-list .section-compact-list__item:lt(12)").css({'display': 'flex'});
    
            // Обрабатываем клик по кнопке "показать еще"
            $(".catalog-btn_more").click(function (event) {
                event.preventDefault();
    
                // Выбираем все скрытые элементы
                var $hidden = $(".section-compact-list .section-compact-list__item:hidden");
    
                // Показываем N выбранных элементов из скрытых
                $($hidden).slice(0, 12).css("display", "flex").hide().fadeIn(800);
    
                // Проверяем что список закончился
                if ($hidden.length <= 4) {
    
                    // Меняем кнопки
                    $(this).fadeOut(300);
                    $(".catalog-btn_cut").fadeIn(800);
                }
            });
    
            // Обрабатываем клик по кнопке "скрыть"
            $(".catalog-btn_cut").click(function (event) {
                event.preventDefault();
    
                // Выбираем первые N элементов, которые будем исклчючать и показывать
                $firstElems = $(".section-compact-list .section-compact-list__item").slice(0, 12);
    
                // Скрываем все элементы кроме выбранных
                $(".section-compact-list .section-compact-list__item").not($firstElems).hide().fadeOut(800);
    
                // Меняем кнопки
                $(this).fadeOut(300);
                $(".catalog-btn_more").fadeIn(800);
            });
    Написано
  • Почему условие не срабатывает после первого выполнения?

    @by_steris Автор вопроса
    Решил данный вопрос добавлением второй кнопки и показом кнопок поочередно
    Написано
  • Как правильно пройтись циклом внутри другого?

    @by_steris Автор вопроса
    by_steris, т.е. вот что имею ввиду, первывй массив это ДО, второй ПОСЛЕ, хочу вывести так чтобы встали рядом нулевые элементы, первые, вторые и т.д.6605498f07498628754164.png
    Написано
  • Как правильно пройтись циклом внутри другого?

    @by_steris Автор вопроса
    Виктор, Одиакового ничего, идея скорее всего выводить по идексу в массиве
    Написано
  • Как подключать компоненты Битрикс с помощью ajax?

    @by_steris Автор вопроса
    Это все понятно, но возможность, то всяко есть загрузить шаблон компонента с помощью аякс, потому что что-то такое я видел в решениях от аспро
    Написано
  • Как передать все товары в шаблон карточки товара?

    @by_steris Автор вопроса
    Роман Грицук, проблема, как раз в том что мне не нужны похожие, необходимо перебрать из всех товаров по их ID
    т.к. в hl-блоки заведен справочник с привязкой к элементам каталога
    Сейчас в arResult передаются id этих товаров из hl-блока

    Необходимо сравнить id товаров из справочника hl-блока с id товаров каталога и вывести их свойства, например "название" или "модель"
  • Как исправить create_function на php 8?

    @by_steris Автор вопроса
    Мало знаком с php, пожалуйста подскажите, как быть с ними
  • Как исправить create_function на php 8?

    @by_steris Автор вопроса
    Александр, текст ошибки:
    [Error]
    Call to undefined function create_function() (0)