Переключатель валюты в каталоге 1С-Битрикс

Просмотров: 762

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



Получение списка валют из модуля "Валюты"

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

Над выводом компонента catalog.section, например, в section.php комплексного компонента каталога, добавляем следующий код:

<form id="currencyForm" action="" method="post">
        <span>Выберите валюту:</span>
        <select name="CURRENCY_ID" id="currencySelect">
                <?php
                Loader::includeModule('currency');
                $currencyList = CCurrency::GetList(
                    (
                    $by = 'NAME' // Можно по SORT если хотите переставить option местами
                    ),
                    (
                    $order = 'ASC'
                    )
                );
                while ($currency = $currencyList->Fetch()) {
                    ?>
                    <option value="<?= $currency['CURRENCY'] ?>"
                        <?= ($_COOKIE['SELECTED_CURRENCY_ID'] == $currency['CURRENCY']) ? 'selected' : '' ?>>
                        <?= $currency['CURRENCY'] ?>
                    </option>
                    <?php
                }
                ?>
        </select>
</form>
<script>
        document.addEventListener('DOMContentLoaded', function () {
                // Получаем ссылки на форму и на поле выбора валюты
                var form = document.getElementById('currencyForm');
                var select = document.getElementById('currencySelect');

                // Добавляем обработчик события изменения значения в поле выбора
                select.addEventListener('change', function () {
                    // Отправляем форму
                    form.submit();
                    // Получаем выбранное значение
                    var selectedCurrency = select.value;
                    // Записываем выбранное значение в куки
                    document.cookie = "SELECTED_CURRENCY_ID=" + selectedCurrency;
                    // Для медленных сайтов показываем иммитацию отправки
                    // $('.loading_body').addClass('loading_body_show');
                    // Перезагружаем страницу
                    location.reload();
                });
        });
</script>
<?
  if ($_COOKIE['SELECTED_CURRENCY_ID']) {
        $arParams['CONVERT_CURRENCY'] = "Y";
        $arParams['CURRENCY_ID'] = $_COOKIE['SELECTED_CURRENCY_ID'];
  }
?>

Здесь мы используем метод CCurrency::GetList для получения всех доступных валют и заполняем ими select.

С помощью JavaScript отправляем форму, когда пользователь выбирает любой из вариантов, и записываем выбранную валюту в COOKIE SELECTED_CURRENCY_ID. Для имитации ajax-эффекта используем location.reload();, чтобы страница перезагружалась в том же месте.

Если ваш сайт медленный, можно добавить какой-нибудь спиннер, чтобы пользователям было комфортнее. Для этого раскомментируйте $('.loading_body').addClass('loading_body_show') и реализуйте показ этого блока с индикатором отправки.

Выбор валюты битрикс

Далее проверяем наличие $_COOKIE['SELECTED_CURRENCY_ID'] и, если оно существует, устанавливаем параметры "Показывать цены в одной валюте" и "Валюта, в которую будут сконвертированы цены". Если COOKIE не установлено-то автоматически используются параметры из настроек каталога.

То же самое условие необходимо вставить в element.php, чтобы и в детальной карточке показывалась установленная пользователем валюта. Если необходимо, добавляем форму выбора валюты и в шаблон детальной карточки.

На этом всё. Чтобы сделать приведенный пример более универсальным и легко применимым на разных страницах, можно завернуть его в компонент и вызывать в нужных местах сайта.
Михаил Базаров 26.02.2024
Не проверял доступен ли этот метод в D7 но судя по документации
Код
// Используем пространство имён Bitrix\Main
use Bitrix\Main\Loader;
use Bitrix\Currency\CurrencyTable;

// Проверяем загрузку модуля валют
if (!Loader::includeModule('currency')) {
    die('Модуль валют не установлен');
}

// Получаем список всех валют
$currencyList = CurrencyTable::getList(array(
    'select' => array('CURRENCY')
));
while ($currency = $currencyList->fetch()) {
    echo $currency['CURRENCY'] . '<br>';
}

Блог-note: заметки разработчика

Основные функции вывода в шаблонах Битрикс

Знаю, что все их знают. Но иногда не бывает лишним собрать все самое используемое в одну кучку. Ведь у каждого бывают мо...

Input Type File, множественный с дропзоной и показом превью

Задача: Сделать возможность загрузки файлов в множественный input type="file" c помощью drag&drop и показом превью загру...

Увидеть файл заказов который передаст Битрикс в 1С

Для диагностики обмена заказов, интернет-магазина на 1С Битрикс с 1С Управление Торговлей, нужно увидеть xml файл с зака...

Работа с HTTP-запросами в Bitrix: Обзор возможностей класса \Bitrix\Main\HttpRequest

Класс \Bitrix\Main\HttpRequest, является наследником класса Request, представляет собой мощный инструмент для работы с д...

AJAX корзина с отправкой количества из раздела каталога

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

Вывести артикул в печатную форму бланка заказа

Задача: в печатную форму бланка заказа добавить артикулы товаров и данные о пользователе.

Ajax форма обратной связи, реализация в битрикс

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

Получить и вывести все цены товара в 1С-Битрикс

Задача: получить и вывести все цены товара по его ID в каталоге 1С-Битрикс (например, в детальной карточке catalog.e...

Сортировка элементов по индексу сортировки значений типа список

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