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

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

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