Курсы валют с 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        getResources заготовки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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