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

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

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



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

Для реализации этой задачи необходимо получить список всех доступных валют и вывести их в форму, которая будет записывать выбранную валюту в 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>';
}