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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        getResources заготовки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        Вырезать кавычки — фильтр-сниппет 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 сделать не обязательным полем

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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