Разработка на 1С-Битрикс Михаил Базаров
Блог-note

Ajax сортировка товаров в каталоге

Просмотров: 603
Задача: реализовать Ajax-сортировку в каталоге товаров с запоминанием в cookie.

Форма и скрипт для обработки AJAX

В примере буду использовать сортировку по цене, просмотрам и свойству инфоблока (в примере- производитель). Над компонентом catalog.section, который выводит карточки товаров, добавляем форму:

<form method="post" action="/local/ajax/sort.php" class="catalog_sort_block_form1">
    <input type="hidden" name="sortten" value="<?= htmlspecialchars($_COOKIE['sortten'] ?? '') ?>">
    <button type="submit" name="sortten"
            value="SCALED_PRICE_3" <?php echo ($_COOKIE['sortten'] ?? '') === 'SCALED_PRICE_3' ? 'class="selected"' : ''; ?>>
        По цене
    </button>
    <button type="submit" name="sortten"
            value="show_counter" <?php echo ($_COOKIE['sortten'] ?? '') === 'show_counter' ? 'class="selected"' : ''; ?>>
        По популярности
    </button>
    <button type="submit" name="sortten"
            value="property_BREND" <?php echo ($_COOKIE['sortten'] ?? '') === 'property_BREND' ? 'class="selected"' : ''; ?>>
        По производителю
    </button>
</form>

Данная форма отправляет POST нажатой кнопки на скрипт /local/ajax/sort.php. Создаём его с содержимым:

<?php
if ($_SERVER['REQUEST_METHOD'] !== 'POST' || empty($_POST['sortten'])) {
    die();
}
$allowed = ['SCALED_PRICE_3', 'show_counter', 'property_BREND'];
$sortten = in_array($_POST['sortten'], $allowed, true) ? $_POST['sortten'] : null;
if ($sortten !== null) {
    setcookie('sortten', $sortten, 0, '/', '', false, true);
    // Если AJAX-запрос — возвращаем JSON
    $isAjax = !empty($_SERVER['HTTP_X_REQUESTED_WITH']) &&
              strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
    if ($isAjax) {
        header('Content-Type: application/json');
        echo json_encode(['success' => true]);
    } else {
        // Обычный запрос (медленный интернет / без JS) — редирект обратно
        $redirect = !empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/';
        header('Location: ' . $redirect);
    }
    exit;
}

Чтобы сортировка применялась, перед вызовом catalog.section определяем переменную и передаём её в параметры компонента:

$sort = $_COOKIE['sortten'] ?? 'SCALED_PRICE_3';
"ELEMENT_SORT_FIELD" => $sort,
"ELEMENT_SORT_ORDER" => ($sort === 'show_counter') ? 'desc,nulls' : 'asc,nulls',

Чтобы форма отправляла POST на /local/ajax/sort.php при клике на кнопку сортировки, добавляем JavaScript (можно в шаблон catalog.section):

$(document).ready(function () {
    $(".catalog_sort_block_form1 button").click(function (event) {
        event.preventDefault();
        submitSortBtn($(this).val());
    });
    function submitSortBtn(value) {
        var form = $('.catalog_sort_block_form1')[0];
        var formData = new FormData(form);
        formData.set('sortten', value);
        // Необязательно: показываем спиннер пока отрабатывает скрипт
        $('.loading_body').addClass('loading_body_show');
        $.ajax({
            url: form.action,
            type: form.method,
            data: formData,
            processData: false,
            contentType: false,
            headers: { 'X-Requested-With': 'XMLHttpRequest' },
            success: function (response) {
                location.reload();
            },
            error: function () {
                console.log("Произошла ошибка при отправке запроса.");
            }
        });
    }
});
Услуги

Стоимость разработки на 1С-Битрикс

Стоимость разработки сайта зависит от объёма и сложности проекта. Ниже приведены ориентировочные цены, как правило не выходят за обозначенные рамки. Срок разработки зависит от сложности проекта: как правило называю сроки с запасом.

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

Включено в стоимость разработки

В цену уже заложено всё, что нужно для легального и быстрого запуска. Доплачивать за базовые вещи не придётся.

  • Лицензия и модули

    Лицензия на «1С-Битрикс» нужной редакции, дополнительные модули и видео-инструкции по работе с готовым проектом.

  • Скорость и SEO

    Оптимизация кода и сервера под быструю загрузку, базовая SEO-оптимизация и добавление сайта в поисковые системы.

Блог-note

Заметки по 1С-Битрикс