Задача: Дать пользователю возможность самостоятельно выбирать валюту, в которой он хочет видеть цены, в разделе каталога интернет-магазина.
Получение списка валют из модуля "Валюты"
Для реализации этой задачи необходимо получить список всех доступных валют и вывести их в форму, которая будет записывать выбранную валюту в 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, чтобы и в детальной карточке показывалась установленная пользователем валюта. Если необходимо, добавляем форму выбора валюты и в шаблон детальной карточки.
На этом всё. Чтобы сделать приведенный пример более универсальным и легко применимым на разных страницах, можно завернуть его в компонент и вызывать в нужных местах сайта.