Курсы валют с cbr.ru на PHP

При получении курса волюты с сайта центрального банка существует несколько нюансов. Один из них — кэширование полученных результатов. В моем случае значение цены выводилось много раз, и при простом подходе вело к повторным запросам на сайт cbr.ru, чтобы этого избежать я поместил полученные значения в сессию. Это весьма простое и слегка топорное, но все таки решение.

Сниппет для MODX — getCurRate

if(empty($_SESSION['cbr_eur']) || empty($_SESSION['cbr_usd'])) {
    $xml = simplexml_load_string(file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp"));
    $json = json_encode($xml);
    $array = json_decode($json);
    if(empty($input)){
        $input = 0;
    }
    $input = $input;
    $eur = 0;
    $usd = 0;
    foreach($array->Valute as $v){
        if(strtolower($v->CharCode) == "eur"){
            $eur = $v->Value;
        }
        if(strtolower($v->CharCode) == "usd"){
            $usd = $v->Value;
        }
    }
    $_SESSION['cbr_eur'] = $eur;
    $_SESSION['cbr_usd'] = $usd;
}else{
    $eur = $_SESSION['cbr_eur'];
    $usd = $_SESSION['cbr_usd'];
}
if(strtolower($cur_input) == "rub"){
    if(strtolower($cur_output) == "eur"){
        return $input/$eur;
    }
    if(strtolower($cur_output) == "usd"){
        return $input/$usd;
    }
}
if(strtolower($cur_input) == "eur"){
    if(strtolower($cur_output) == "rub"){
        return $input*$eur;
    }
    if(strtolower($cur_output) == "usd"){
        return $input*($eur/$usd);
    }
}
if(strtolower($cur_input) == "usd"){
    if(strtolower($cur_output) == "rub"){
        return $input*$usd;
    }
    if(strtolower($cur_output) == "eur"){
        return $input/($eur/$usd);
    }
}
if(strtolower($cur_output) == "rubinusd"){
    return $usd;
}
if(strtolower($cur_output) == "rubineur"){
    return $eur;
}
return "getCurRate"; //Если что-то пошло не так

Использование сниппета getCurRate

  • [[!getCurRate?&cur_output=`rubinusd`]] — Курс USD
  • [[!getCurRate?&cur_output=`rubineur`]] — Курс EUR
  • [[!getCurRate?&input=`2700`&cur_input=`rub`&cur_output=`usd`]] — Переводо RUB в USD
  • [[!getCurRate?&input=`132`&cur_input=`usd`&cur_output=`rub`]] — Переводо USD в RUB

Использование инструмента вне MODX

Тот же самый код, лишь оборачиваем его в функцию(). Показать
function getCurRate($input = 0, $cur_input = '', $cur_output = ''){
    if(empty($_SESSION['cbr_eur']) || empty($_SESSION['cbr_usd'])) {
        $xml = simplexml_load_string(file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp"));
        $json = json_encode($xml);
        $array = json_decode($json);
        $eur = 0;
        $usd = 0;
        foreach($array->Valute as $v){
            if(strtolower($v->CharCode) == "eur"){
                $eur = $v->Value;
            }
            if(strtolower($v->CharCode) == "usd"){
                $usd = $v->Value;
            }
        }
        $_SESSION['cbr_eur'] = $eur;
        $_SESSION['cbr_usd'] = $usd;
    }else{
        $eur = $_SESSION['cbr_eur'];
        $usd = $_SESSION['cbr_usd'];
    }
    if(strtolower($cur_input) == "rub"){
        if(strtolower($cur_output) == "eur"){
            return $input/$eur;
        }
        if(strtolower($cur_output) == "usd"){
            return $input/$usd;
        }
    }
    if(strtolower($cur_input) == "eur"){
        if(strtolower($cur_output) == "rub"){
            return $input*$eur;
        }
        if(strtolower($cur_output) == "usd"){
            return $input*($eur/$usd);
        }
    }
    if(strtolower($cur_input) == "usd"){
        if(strtolower($cur_output) == "rub"){
            return $input*$usd;
        }
        if(strtolower($cur_output) == "eur"){
            return $input/($eur/$usd);
        }
    }
    if(strtolower($cur_output) == "rubinusd"){
        return $usd;
    }
    if(strtolower($cur_output) == "rubineur"){
        return $eur;
    }
    return "getCurRate"; //Если что-то пошло не так
}
Скрыть
  • <?php echo getCurRate(0, '', 'rubinusd'); ?> — Курс USD
  • <?php echo getCurRate(0, '', 'rubineur'); ?> — Курс EUR
  • <?php echo getCurRate(2700, 'rub', 'usd'); ?> — Переводо RUB в USD
  • <?php echo getCurRate(132, 'usd', 'rub'); ?> — Переводо USD в RUB

Комментарии (5)

  1. Сергей 26 марта 2019, 08:57 # 0
    Как конвтировать из USD в UAH?
    1. Олег Марсоходов 18 августа 2019, 11:15 # 0
      зачем? просто на ноль умножай… бггг
    2. Дмитрий 21 февраля 2020, 17:41(Комментарий был изменён) # 0
      Подскажите как передавать измененную цену в корзину?
      1. Павел 18 июня 2020, 15:17 # 0
        Здравствуйте. Подскажите как округлить результат, а то уж много цифр получается ))) 123.82608695652 что бы так получалось 123.8
        1. Павел 18 июня 2020, 23:04 # 0
          Не сможете подсказать? Сам не могу разобраться
        *Комментарий будет опубликован после проверки модератором

        Комментарии easyComm

        Дмитрий 15 апреля 2018, 10:29

        Спасибо за подсказку!

        Дмитрий 13 апреля 2018, 18:30

        Подскажите, пожалуйста, а что делать с хранением данных в сессии... Если я не ошибаюсь, то сессия в modx хранится в течении 7 дней... получается, что курсы в течении это времени обновляться не будут? у меня есть с этим проблемка.. . как сделать что бы новые данные подгружались каждый день?

        Администратор

        Вы можете добавить еще одно значение в сессию, в котором будет указано время занесения данных. И соответственно проверять его. Если прошло больше 24 часов, то запрашиваем данные заново.
        if(empty($_SESSION['cbr_time_update']) || strtotime($_SESSION['cbr_time_update']) < strtotime('-1 day')){
        // прошло уже больше 1 дня...
        // ...
        $_SESSION['cbr_time_update'] = time();
        }

        Похожие статьи

        Генератор настроек MIGX

        Документация на русском по MODX MIGX

        Подсказки по работе и заготовки для MiniShop2

        Импорт и экспорт в MiniShop2. Реализация 1

        pdoPage и getImageList - Постраничная навигация MIGX

        Как включить HTTPS (SSL) в MODX - Подробная инструкция

        Генерация YML для выгрузки в маркет

        Примеры работы с API MODX

        Расширение свойств товаров minishop2

        Примеры выборки where, optionFilters, innerJoin

        pThumb - ресайз изображений. Примеры использования.

        Пример перевода с помощью Yandex Translate API

        Примеры использования

        Сайт на обслуживании (выключить сайт)

        Вывести getImageList только если он не пустой

        Тип поля "Список ресурсов" (resourcelist) с ограничением по родителю (parents)

        Оформление и настройка easyComm. Комментарии и отзывы на сайте.

        Добавить в письмо контактную информацию

        Поиск на сайте с пакетом SimpleSearch

        Простая и симпатичная галерея fancybox

        Вывод tv-параметров в формате -

        Галерея. Вывести обложки альбомов и фотографии

        Подсчет и вывод количества потомков ресурса в MODX

        Универсальная форма обратной связи — feedBackForm

        Отредактировать письмо о заказе - добавить ТВ поле, или что-то еще

        Quip для MODX. Более рабочий вариант

        pdoResources Заготовки для работы

        Сниппет для вывода размера и расширения файла

        Простой аудио-плеер HTML5

        Вывести список всех опций MiniShop2

        Как контролировать кэш CSS и скриптов

        Изменить цену на товар в зависимости от количества при добавлении в корзину minishop2

        Слайдер Slick slider в контенте ресурса

        Подключить MODX в стороннем PHP файле

        Простейшая авторизация

        Красивое адаптивное меню под pdoMenu

        Массово обновить ТВ, или другое поле через базу

        Как создать ресурс процессором $modx->runProcessor('resource/create', $props)

        Как поменять версию PHP, используемую в командной строке на Windows

        Изменить формат номера заказа

        Создать свою страницу в админке

        Как поменять язык в Faker

        Транслитерация URL в Laravel. Примеры str_slug()

        Простое логирование

        Сообщение о том, что сайт использует Cookie

        Получить grandparent. Вывести родитель родителя

        Симпатичный список файлов, загружаемых к ресурсу через MIGX

        Создать источник файлов

        Установить шаблон по-умолчанию для новых, создаваемых ресурсов

        Вывести все доступные плейсхолдеры

        Отредактировать шаблон письма

        Добавить скрипт перед тегом body

        Общая сумма по каждому товару в корзине Minishop2

        Создать раздел с паролем на сайте MODX

        Что делать если ее приходит почта администратору

        Фильтрация по TV параметрам в msProducts

        Дата на русском

        FontAwesome - часто используемые иконки для шаблонов MODX

        Создать пакет с пользовательской таблицей

        Заготовки для работы

        Курсы валют с cbr.ru на PHP

        Обязательный чекбокс при оформлении заказа

        getResources заготовки

        Загрузка сниппета после загрузки страницы через AjaxSnippet

        Разные фишки, заготовки

        Соответствие названия классов с названиями таблиц в MySQL

        Баннеры с использованием BannerY

        Разбить вывод pdoResources на несколько колонок (блоков)

        Получить вложенный массив из плоского

        Обработка остатков заказа в miniShop2

        CSS для постраничной навигации pdoPage

        Laravel Excel - Базовый экспорт

        Вывести время загрузки (формирования) страницы

        Расширить таблицу site_content (объект modResource) за 5 минут

        Счетчик посещений и скачиваний для сортировки ресурсов

        Вырезать кавычки — фильтр-сниппет MODX

        Обновить alias (псевдоним) у всех ресурсов

        Namespace на примерах - Как понять пространства имен в PHP

        Динамическое поле emailSubject в FormIt

        Бесплатная доставка от 5000 рублей в MiniShop2

        Скрыть информацию о том, что сайт работает на MODX

        Заготовки для автоматического заполнения товарами магазина 1.5.5.1.2

        Как сделать middleware в Laravel 6 - простой пример

        Отсортировать ресурсы по количеству комментариев Quip MODx

        Примеры работы с API

        Как обработать POST данные в PHP

        Изменить цену на товар, если в корзине лежит товар из особой категории minishop2

        Создать редирект через autoRedirector API

        Вывести 404 ошибку по настройке TV MODX

        Ответ для сервиса moneta.ru

        Email сделать не обязательным полем

        Как разместить исходный код сниппета на сайте, в документации

        Ускорить установку MODX revo до пары кликов

        Загрузить файл для постобработки

        Получить время выполнения PHP скрипта. Решение в 3 строки кода

        Постраничная навигация — набор параметров и CSS PdoPage

        Сделать поле размер обязательным

        Не работает подгрузка товаров ajax mfilter2 на мобильном

        Сделать все элементы статичными для Git и IDE

        Cортировать по списку id в pdoResources и pdoTools

        Кастомный чанк для AdminPanel

        Настройка стилей для комментариев Tickets

        Получить курсы валют с cbr.ru на PHP с кэшированием результатов

        Подключить текстовой редактор к доп. полям ресурса

        Динамическая замена шаблона ресурса - плагин

        Разместить корзину внутри блока с оформлением заказа

        Вывести список всех родителей в ТВ поле ресурса

        Вложенные условия в xPDO MODX

        Плагин для формирования замороженных URL с редиректом

        Приветственный экран / заглушка на сайт

        Вывести список всех емэйлов miniShop2

        Экспорт маршрутов из Laravel в JSON файл

        Если getParentIds не работает в плагине

        Как получить данные пользователя сразу после авторизации через API

        xPDO Выборка из одной таблицы с зацепкой значения из другой

        Контролировать кэширование файлов CSS и JS MiniShop2

        Фиксированная сортировка массива на основе хэша

        Не приходят / не отправляются письма - в чем причина?

        Вывести список всех файлов на сервере (и размер файла)

        Кэширование в MODX: использование $modx->cacheManager

        Наш сайт использует куки, нажмите «ОК» если вы не против
        OK