Экспорт курсов валют с сайта центробанка
у Добавляю на свой сайт такую интересную опцию. Может кому-нибудь пригодится.
На странице пользовательского профиля отображается мультичек со списком валют, можно выбрать одну или несколько валют, а потом во фронтенде вывожу курсы именно тех валют, которые пользователь выбрал в профиле.
Для добавления метабоксов на страницу пользовательского профиля я использую CMB2. Можно наверное и без лишних библиотек, но уж очень оно удобно.
В functions.php или файле, подключаемом к functions.php пишем так:
add_action( 'cmb2_admin_init', 'livepravo_user_profile_metabox' );
function livepravo_user_profile_metabox() { // Массив валют $curencies = array( 'AUD' => '1 Австралийский доллар', 'AZN' => '1 Азербайджанский манат', 'GBP' => '1 Фунт стерлингов Соединенного королевства', 'AMD' => '100 Армянских драмов', 'BYN' => '1 Белорусский рубль', 'BGN' => '1 Болгарский лев', 'BRL' => '1 Бразильский реал', 'HUF' => '100 Венгерских форинтов', 'DKK' => '10 Датских крон', 'USD' => '1 Доллар США', 'EUR' => '1 Евро', 'INR' => '100 Индийских рупий', 'KZT' => '100 Казахстанских тенге', 'CAD' => '1 Канадский доллар', 'KGS' => '100 Киргизских сомов', 'CNY' => '10 Китайских юаней', 'MDL' => '10 Молдавских леев', 'NOK' => '10 Норвежских крон', 'PLN' => '1 Польский злотый', 'RON' => '1 Румынский лей', 'XDR' => '1 СДР (специальные права заимствования)', 'SGD' => '1 Сингапурский доллар', 'TJS' => '10 Таджикских сомони', 'TRY' => '1 Турецкая лира', 'TMT' => '1 Новый туркменский манат', 'UZS' => '1000 Узбекских сумов', 'UAH' => '10 Украинских гривен', 'CZK' => '10 Чешских крон', 'SEK' => '10 Шведских крон', 'CHF' => '1 Швейцарский франк', 'ZAR' => '10 Южноафриканских рэндов', 'KRW' => '1000 Вон Республики Корея', 'JPY' => '100 Японских иен' ); // Объявляем метабокс $cmb_user = new_cmb2_box( array( 'id' => 'lp_profile', // Это ID метабокса 'title' => 'Профиль пользователя', // Заголовок метабокса 'object_types' => array( 'user' ), // ID экрана 'show_names' => true, // Отображать наименования опций 'classes' => 'user', // CSS-класс 'new_user_section' => 'add-existing-user', // Это не вполне понял ) ); // Заголовок $cmb_user->add_field( array( 'name' => 'Валюты', 'desc' => 'Выберите один или несколько валют в ниже приведенном списке, курсы которых по отношению к российскому рублю вас интересуют.', 'id' => 'lp_title', 'type' => 'title', 'on_front' => true, ) ); // Добавляем мультичек со списком валют $cmb_user->add_field( array( 'name' => 'Валюты', 'desc' => 'Выберите валюты', 'id' => 'curencies', 'type' => 'multicheck', 'multiple' => true, 'options' => $curencies, 'inline' => true, ) ); } // End function
После этого в любой из файлов шаблона добавляем такой код:
<?php // Текущая дата $date = date('d.m.Y'); // Получаем содержимое XML-файла $file = file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date"); // Парсим XML-файл $courses = simplexml_load_string($file); // Массив пользовательских валют $user_curencies = get_user_meta(get_current_user_id(), 'curencies'); if (count($user_curencies) != 0): // Если пользователь вообще что-то выбрал // выводим список курсов валют echo '<ul>'; foreach($courses->Valute as $curency) { if (!in_array($curency->CharCode, $user_curencies)) continue; echo '<li>'; echo $curency->Nominal . ' ' . $curency->Name . ':' . $curency->Value; echo '</li>'; } // End foreach echo '</ul>'; endif; ?>
Код работает в WordPress 4.7.1, но я не вижу препятствий и для более ранних версий.
Ну да конечно, PHP с 5.2 simpleXML поддерживает из коробки, для более ранних версий этот флаг нужно выставлять при сборке.
А проблема в следующем: как можно реализовать генерацию ассоциативного массива валют из XML-файла? Точнее, как в PHP выглядит добавление пары "ключ/значение" к ассоциативному массиву на лету?
Ведь дорогой моему сердцу центробанк список валют чисто теоретически может менять, добавлять туда валюты каких-то дружественных стран, удалять не актуальные или не ликвидные валюты. Не хочется каждый раз переписывать ручками список валют.
Я додумался до следующего:
// Получаем и парсим XML-файл как при выводе $date = date('d.m.Y'); $file = file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date"); $courses = simplexml_load_string($file); // Объявляем пустой массив валют $curencies = array(); foreach ($courses->Valute as $curency) { // И вот здесь добавляем позиции списка // Я пробую например так: $curencies[$curency->CharCode] = $curency->Nominal . ' ' . $curency->Name; // Почему-то ругается на некорректное смещение. $curencies = compact($curency->CharCode, $curency->Nominal . ' ' . $curency->Name, $curencies); // Не ругается, но и массива не формирует } // End foreach
Короче поможите please чем можете, сами мы не местные.