Задать вопрос
  • Как вывести товары в catalog.section.list?

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

    В данный момент код вот такой.

    <?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
    <?$this->setFrameMode(true);?>
    <?global $arTheme, $APPLICATION, $arSectionFilter, $arrFilterNew;?>
    
    <?$APPLICATION->AddViewContent('right_block_class', 'catalog_page ');?>
    
    <?$arSectionFilter = array('IBLOCK_ID' => $arParams['IBLOCK_ID']);
    CMax::makeSectionFilterInRegion($arSectionFilter);?>
    
    <?// region filter for to count elements
    if(
        $GLOBALS['arRegion'] &&
        $GLOBALS['arTheme']['USE_REGIONALITY']['VALUE'] === 'Y' &&
        $GLOBALS['arTheme']['USE_REGIONALITY']['DEPENDENT_PARAMS']['REGIONALITY_FILTER_ITEM']['VALUE'] === 'Y'
    ){
        $arSectionFilter['PROPERTY_LINK_REGION'] = $GLOBALS['arRegion']['ID'];
    }?>
    
    <?$sViewElementTemplate = ($arParams["SECTIONS_TYPE_VIEW"] == "FROM_MODULE" ? $arTheme["CATALOG_PAGE_SECTIONS"]["VALUE"] : $arParams["SECTIONS_TYPE_VIEW"]);?>
    <?$bShowLeftBlock = ($arTheme["LEFT_BLOCK_CATALOG_ROOT"]["VALUE"] == "Y" && !defined("ERROR_404") && !($arTheme['HEADER_TYPE']['VALUE'] == 28 || $arTheme['HEADER_TYPE']['VALUE'] == 29));?>
    <?$APPLICATION->SetPageProperty("HIDE_LEFT_BLOCK", ( $bShowLeftBlock ? 'N' : 'Y' ) );?>
    
    <?
    // --- AJAX обработка для второго каталога ---
    if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['ajax'] === 'Y' && $_POST['catalog'] === 'second') {
        $arrFilterNew = [
            'CATALOG_AVAILABLE' => 'Y'
        ];
    
        $page = intval($_POST['page']);
        if ($page < 1) $page = 1;
        $pageSize = 20;
    
        $APPLICATION->IncludeComponent(
            "bitrix:catalog.section",
            "catalog_block",
            array(
                "IBLOCK_TYPE" => "1c_catalog",
                "IBLOCK_ID" => "163",
                "FILTER_NAME" => "arrFilterNew",
                "INCLUDE_SUBSECTIONS" => "Y",
                "SHOW_ALL_WO_SECTION" => "Y",
                "ELEMENT_SORT_FIELD" => "rand",
                "ELEMENT_SORT_ORDER" => "asc",
                "PAGE_ELEMENT_COUNT" => $pageSize,
                "LINE_ELEMENT_COUNT" => "5",
                "CACHE_TYPE" => "N",
                "CACHE_TIME" => "0",
                "DISPLAY_TOP_PAGER" => "N",
                "DISPLAY_BOTTOM_PAGER" => "N",
                "HIDE_NOT_AVAILABLE" => "Y",
                "HIDE_NOT_AVAILABLE_OFFERS" => "Y",
                "PAGER_SHOW_ALL" => "N",
                "PAGER_DESC_NUMBERING" => "N",
                "PAGER_SHOW_ALWAYS" => "N",
                "PAGER_TEMPLATE" => "",
                "PAGER_PAGE" => $page,
                "PRICE_CODE" => array("BASE", "Основная цена продажи МСК", "Основная цена продажи"), // добавь сюда, если нужно
                "SHOW_PRICE_COUNT" => 1,
                "PRICE_VAT_INCLUDE" => "Y",
            ),
            false
        );
        die();
    }
    ?>
    
    <style>
    #loadMoreSecondCatalog {
        width: 100%;
        font-size: 0.733em;
        line-height: 1.3em;
        text-transform: uppercase;
        letter-spacing: 0.8px;
    
        text-align: center;
        margin: 0 0 30px;
        border: 1px solid var(--stroke_black);
        cursor: pointer;
        position: relative;
        z-index: 2;
        transition: background-color 0.2s ease, color 0.2s ease;
        background-color: transparent;
        color: inherit; /* чтобы текст наследовал цвет */
        padding: 10px 0;
        display: inline-block;
    }
    
    #loadMoreSecondCatalog:hover {
        background-color: #000;
        color: #fff;
    }
    
    </style>
    
    <div class="main-catalog-wrapper">
        <div class="section-content-wrapper <?=($bShowLeftBlock ? 'with-leftblock' : '');?>">
            <?@include_once('page_blocks/'.$sViewElementTemplate.'.php');?> <!-- Главный каталог -->
    
            <?CMax::get_banners_position('CONTENT_BOTTOM');
            global $bannerContentBottom;
            $bannerContentBottom = true;
            ?>
    
          <?if(preg_match('#^/catalog/?$#', $APPLICATION->GetCurDir())):?>
    
        <div class="div" style="margin-top: 50px;" id="second_catalog_block">
            <div id="second_catalog_items">
                <?// Начальная подгрузка товаров второго каталога ?>
                <?
                $arrFilterNew = ['CATALOG_AVAILABLE' => 'Y'];
                $APPLICATION->IncludeComponent(
                    "bitrix:catalog.section",
                    "catalog_block", 
                    array(
                        "IBLOCK_TYPE" => "1c_catalog",
                        "IBLOCK_ID" => "163",
                        "FILTER_NAME" => "arrFilterNew",
                        "INCLUDE_SUBSECTIONS" => "Y",
                        "SHOW_ALL_WO_SECTION" => "Y",
                        "ELEMENT_SORT_FIELD" => "rand",
                        "ELEMENT_SORT_ORDER" => "asc",
                        "PAGE_ELEMENT_COUNT" => 20,
                        "LINE_ELEMENT_COUNT" => 5,
                        "CACHE_TYPE" => "N",
                        "CACHE_TIME" => "0",
                        "DISPLAY_TOP_PAGER" => "N",
                        "DISPLAY_BOTTOM_PAGER" => "N",
                        "HIDE_NOT_AVAILABLE" => "Y",
                        "HIDE_NOT_AVAILABLE_OFFERS" => "Y",
    
                        "SHOW_OLD_PRICE" => "Y",          // Добавлено
                        "SHOW_DISCOUNT_PERCENT" => "Y",   // Добавлено
                        "PRICE_CODE" => array(
                            "BASE",
                            "Основная цена продажи МСК",
                            "Основная цена продажи"
                        ),
                        "SHOW_PRICE_COUNT" => "1",
                        "PRICE_VAT_INCLUDE" => "Y",
                    ),
                    false
                );
                ?>
            </div>
    
    <div class="bottom_nav animate-load-state block-type" data-parent=".tabs_slider" data-append=".items" style="text-align:center; margin-top: 20px;">
                        <div id="load_more_second_catalog" class="ajax_load_btn rounded3 colored_theme_hover_bg">
                            <span class="more_text_ajax font_upper_md">Показать ещё</span>
                        </div>
                    </div>
        </div>
    
    <?endif;?>
        </div>
    
        <?if($bShowLeftBlock):?>
            <?CMax::ShowPageType('left_block');?>
        <?endif;?>
    </div>
    
    <script>
    (function(){
        const btn = document.getElementById('load_more_second_catalog');
        const container = document.getElementById('second_catalog_items');
        let page = 2; // страница 1 уже загружена
    
        btn.addEventListener('click', function(){
            btn.disabled = true;
            btn.querySelector('.more_text_ajax').innerText = 'Загрузка...';
    
            BX.ajax({
                url: window.location.pathname,
                method: 'POST',
                data: {
                    ajax: 'Y',
                    catalog: 'second',
                    page: page
                },
                dataType: 'html',
                onsuccess: function(data){
                    if(data.trim() !== ''){
                        container.insertAdjacentHTML('beforeend', data);
                        page++;
                        btn.disabled = false;
                        btn.querySelector('.more_text_ajax').innerText = 'Показать ещё';
                    } else {
                        btn.remove();
                    }
                },
                onfailure: function(){
                    btn.disabled = false;
                    btn.querySelector('.more_text_ajax').innerText = 'Показать ещё';
                    alert('Ошибка загрузки товаров');
                }
            });
        });
    })();
    </script>
    Написано
  • Как правильно выгрузить фото и характеристики через API?

    @Windramix Автор вопроса
    Полный код - может кому пригодится.

    <?php
    // Карта категорий MODX
    $categoryIds = [
        'Гибридная бесперебойная система' => 2813,
        'Сетевые станции' => 2814,
        'Автономия' => 2815,
        'Бесперебойник' => 2816,
        
        'Монокристалл' => 2818,
        'Поликристалл' => 2819,
        'Раскладные' => 2820,
        'Гибкие' => 2821,
        
        'MPPT' => 2823,
        'PWM' => 2824,
        
        'Инверторы с подмешиванием' => 2826,
        'ИБП' => 2827,
        'Гибридные' => 2828,
        'Инверторы 220' => 2829,
        'Сетевые инверторы' => 2830,
        'Портативные зарядные станции' => 2831,
        'Зарядные устройства' => 2832,
        
        'LiFePO4' => 2834,
        'GeI' => 2835,
        'AGM' => 2836,
        'CARBON' => 2837,
        
        'Автоматы переменного тока' => 2839,
        'Автоматы постоянного тока' => 2840,
        'Предохранители и диоды' => 2841,
        'Прочее защитное оборудование' => 2842,
        
        'Тепловые насосы' => 2843,
        
        'Кровельные конструкции' => 2845,
        'Степлажи' => 2846,
        'Регулируемые конструкции' => 2848,
        
        'Аккумуляторы' => 2850,
        'Солнечные батареи' => 2851,
        'Контроллеры заряда' => 2852,
        
        'Ветрогенераторы' => 2854,
        
        'Комплектующие' => 2855,
        
        'Провода' => 2856,
        'Коннекторы и перемычки' => 2857,
        'Распределительные щитки' => 2858,
        'Балансиры' => 2859,
        'Мониторинг' => 2860,
        'Прочие комплектующие' => 2861,
        
        'Прочее' => 2862,
    ];
    
    // Путь для временной папки с изображениями
    $tmpImagesDir = MODX_BASE_PATH . 'tmpimages/';
    if (!is_dir($tmpImagesDir)) {
        mkdir($tmpImagesDir, 0755, true);
    }
    
    // Получаем JSON-данные от API
    $data = $modx->runSnippet('importProductsFromWP');
    $products = json_decode($data, true);
    
    if (!$products || !is_array($products)) {
        return 'Нет товаров для импорта';
    }
    
    $count = 0;
    
    foreach ($products as $item) {
        $title = $item['title'] ?? 'Без названия';
        $description = $item['description'] ?? '';
        $price = $item['price'] ?? 0;
        $article = $item['sku'] ?? '';
        $categories = $item['categories'] ?? [];
    
        if (!$article || empty($categories)) {
            continue;
        }
    
        // Определяем parent по категориям
        $parentId = 0;
        foreach ($categories as $catName) {
            if (isset($categoryIds[$catName])) {
                $parentId = $categoryIds[$catName];
                break;
            }
        }
        if ($parentId === 0) {
            continue;
        }
    
        // Ищем товар по артикулу в msProductData
        $productData = $modx->getObject('msProductData', ['article' => $article]);
    
        if (!$productData) {
            // Новый товар
            $product = $modx->newObject('msProduct');
            $product->fromArray([
                'pagetitle' => $title,
                'alias' => $modx->sanitizeString($title),
                'published' => 1,
                'template' => 5,
                'parent' => $parentId,
                'class_key' => 'msProduct',
            ]);
            $product->save();
    
            // Создаём и заполняем msProductData
            $productData = $modx->newObject('msProductData');
            $productData->set('id', $product->get('id'));
            $productData->set('article', $article);
        } else {
            // Обновление существующего товара
            $product = $modx->getObject('msProduct', $productData->get('id'));
            if (!$product) {
                // Если товар не найден, создаём новый
                $product = $modx->newObject('msProduct');
                $product->fromArray([
                    'pagetitle' => $title,
                    'alias' => $modx->sanitizeString($title),
                    'published' => 1,
                    'template' => 5,
                    'parent' => $parentId,
                    'class_key' => 'msProduct',
                ]);
                $product->save();
                $productData->set('id', $product->get('id'));
            }
        }
    
        // Обновляем общие поля продукта
        $product->fromArray([
            'pagetitle' => $title,
            'parent' => $parentId,
        ]);
        $product->save();
    
        // Обновляем данные msProductData
        $productData->set('price', $price);
        $productData->save();
    
        $productId = $product->get('id');
    
        // Устанавливаем TV-поля
        if (!empty($item['attributes'])) {
            $attributes = $item['attributes'];
    
            if (!empty($attributes['pa_power'][0])) {
                $product->setTVValue('power', $attributes['pa_power'][0]);
            }
    
            if (!empty($attributes['pa_warranty'][0])) {
                $product->setTVValue('guarantee', $attributes['pa_warranty'][0]);
            }
        }
    
        // Обновляем msProductData с дополнительными атрибутами
        if (!empty($item['attributes'])) {
            $dataObject = $product->getOne('Data');
            if ($dataObject) {
                foreach ($item['attributes'] as $key => $value) {
                    $optionKey = strtolower(trim($key));
                    if (is_array($value)) {
                        $value = implode(', ', $value);
                    }
                    $dataObject->set($optionKey, $value);
                }
                $dataObject->save();
            }
        }
    
        // Обработка изображений через процессор с временной папкой
        if (!empty($item['images']) && is_array($item['images'])) {
            foreach ($item['images'] as $imgUrl) {
                $filename = basename(parse_url($imgUrl, PHP_URL_PATH));
                $destination = $tmpImagesDir . $filename;
    
                $imageContent = @file_get_contents($imgUrl);
                if ($imageContent !== false) {
                    file_put_contents($destination, $imageContent);
    
                    $response = $modx->runProcessor('gallery/upload', [
                        'id' => $productId,
                        'name' => $filename,
                        'file' => $destination,
                    ], [
                        'processors_path' => MODX_CORE_PATH . 'components/minishop2/processors/mgr/',
                    ]);
    
                    if ($response->isError()) {
                        error_log("Ошибка загрузки изображения: " . print_r($response->getAllErrors(), true));
                    }
    
                    unlink($destination);
                }
            }
        }
    
        $count++;
    }
    
    return "Импорт завершен. Создано/обновлено товаров: {$count}";
    Написано
  • Как правильно выгрузить фото и характеристики через API?

    @Windramix Автор вопроса
    Спасибо больше получилось!!!
    Только из-за огромного запроса не получилось до конца всё выгрузить и создать, так как я делаю это через [[!syncProductsToMiniShop2]] открытие страницы, я так понимаю нужно установить какой нибудь пакет который не оборвёт запрос и обработает его до конца. (Можете посоветовать какой-то определённый ?
    Написано
  • Как правильно выгрузить фото и характеристики через API?

    @Windramix Автор вопроса
    Windramix, в baseUrl пытался ставить в начале / то тогда если загрузить новая новую фото то оно будет сломанное
    Написано
  • Как правильно выгрузить фото и характеристики через API?

    @Windramix Автор вопроса
    alexalexes,
    Из интересного, если открыть фото подробнее то будет вот так, если крикнуть на картинку то она откроется по нужному пути и будет там нормальная
    689986213b651835439888.png
    68998681a5742731643401.png

    Если загрузить новое фото вручную то будет всё норм
    689986b358d3a074823172.png

    Текущие настройки в MS2 Images

    689986d5d3a7e770718723.png
    Написано
  • Как правильно выгрузить фото и характеристики через API?

    @Windramix Автор вопроса
    alexalexes, Только 2 если запустить импорт заново ( в журнале modx )
    Одна говорит о дубле мол такой товар уже есть а вот вторая вот так

    /home/users/j/j84149400/domains/j84149400.myjino.ru/core/xpdo/om/xpdoobject.class.php : 240) Error 42S22 executing statement: 
    Array
    (
        [0] => 42S22
        [1] => 1054
        [2] => Unknown column 'msProduct.article' in 'WHERE'
    )
    Написано
  • Как вывести товары в catalog.section.list?

    @Windramix Автор вопроса
    Хорошо спасибо я попробую.
    Написано
  • Почему некоторые иконки не работают?

    @Windramix Автор вопроса
    Установил новый modx для теста, и на него utf8mb4 + utf8mb4_unicode_ci
    в общем тоже самое =)
    Написано
  • Почему некоторые иконки не работают?

    @Windramix Автор вопроса
    Rsa97, спасибо
    Написано
  • Почему некоторые иконки не работают?

    @Windramix Автор вопроса
    Rsa97 если не углубляться в процесс сложно будет переключить на utf8mb4? или в пару кликов, ещё просто пока не гуглил как это сделать
    Написано
  • Почему некоторые иконки не работают?

    @Windramix Автор вопроса
    Понял спасибо, попробую в этом направление что-то сделать.
    Написано
  • Почему некоторые иконки не работают?

    @Windramix Автор вопроса
    пробовал везде, в коде (в шаблоне, чанке) , в контенте. в тв полях.
    modx 2.8.7-pl
    686407087270c065631066.png

    В редакторе та они отображаются что самое интересное а на сайте нет.
    Написано
  • Как вывести теги на карточке статьи?

    @Windramix Автор вопроса
    Понял спасибо большое
    Написано
  • Как сделать переключение чанков через список или радио кнопку?

    @Windramix Автор вопроса
    Антон Тарасов, Да уже попробовал =)

    {if $_modx->resource.headerMain == 'Шапка-1'}
        {'header1'|chunk}
    {elseif $_modx->resource.headerMain == 'Шапка-2'}
        {'header2'|chunk}
    {elseif $_modx->resource.headerMain == 'Шапка-3'}
        {'header3'|chunk}
    {elseif $_modx->resource.headerMain == 'Шапка-4'}
        {'header4'|chunk}
    {/if}


    А если бы мне надо было сделать превью у выбора шаблона фотографию что получится при выборе header1 допустим.
    Написано
  • Как сделать переключение чанков через список или радио кнопку?

    @Windramix Автор вопроса
    Антон Тарасов, да я уже это заметил, а ещё я заметил что ClientConfig работает через одно место иногда

    673d947ee019a673155035.png

    А если отойти от ClientConfig вы могли бы посоветовать другой способ как можно такое реализовать ?
    Написано
  • Как сделать переключение чанков через список или радио кнопку?

    @Windramix Автор вопроса
    Кажется сам понял и получилось
    {if $_modx->config.header5 == 'header1'}
        {'header1'|chunk}
    {elseif $_modx->config.header5 == 'header2'}
        {'header2'|chunk}
    {elseif $_modx->config.header5 == 'header3'}
        {'header3'|chunk}
    {elseif $_modx->config.header5 == 'header4'}
        {'header4'|chunk}
    {/if}
    Написано
  • Как сделать переключение чанков через список или радио кнопку?

    @Windramix Автор вопроса
    Да через ClientConfig. я так понял по русски это выпадающий список.
    673d8ed7e05e1440912534.png

    Но как тогда сделать if вывод нужно чанка если там список, не совсем понимаю в моём варианте понятно, что если он заполнен то выведи чанк. я пробовал по разному но что-то не получается, можете подсказать пример как это может быть?
    Написано
  • Как исправить 500 ошибку при нажатии на любой развел в админ панели?

    @Windramix Автор вопроса
    Да отключил versionx всё заработало, спасибо больше !
    Написано
  • Как исправить 500 ошибку при нажатии на любой развел в админ панели?

    @Windramix Автор вопроса
    Хорошо, попробую в этом направление покопать, спасибо
    Написано
  • Как исправить 500 ошибку при нажатии на любой развел в админ панели?

    @Windramix Автор вопроса
    Everything_is_bad, я так понял что-то с сервером и проще обраться с этим вопросом в тех поддержку хостинга
    Написано