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

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

  1. Сергей 26 марта 2019, 08:57 # 0
    Как конвтировать из USD в UAH?
    1. Олег Марсоходов 18 августа 2019, 11:15 # 0
      зачем? просто на ноль умножай… бггг
    2. Дмитрий 21 февраля 2020, 17:41(Комментарий был изменён) # 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();
      }

      [MODx] Генератор настроек MIGX

      [MODx, MIGx] Документация на русском по MIGX

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

      [JS] Маска для ввода телефона +7(___)___-__-__

      [MODx] minishop2 tips

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

      [MODx, miniShop2] Генерация YML для выгрузки в маркет

      [MODx] Подсказки по API

      [OpenCart] Вывести на главную все категории с картинками

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

      [MODx, MIGX] Примеры использования

      [PHP, JSON] Пример перевода с помощью Yandex Translate API

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

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

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

      [Opencart] Вернуть английский язык, если вы его удалили

      [OpenCart] Вывести модуль напрямую через контроллер

      [MODX, MIGX] Вывести getImageList только если он не пустой

      [MODx, Quip] Более рабочий вариант.

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

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

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

      [MODX, MiniShop2] Примеры выборки where, optionFilters, innerJoin

      [MODx] Вывод tv-параметров в формате [название TV] - [значение TV]

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

      Все записи

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