Home
» Мои разработки
» Модуль формирующий информер «Курсы валют» с учетом динамики
Модуль формирующий информер «Курсы валют» с учетом динамики
Данный модуль был создан, когда работал над созданием интранет-портала для компании MR-Group. Дизайн готовых информеров не подходил под дизайн портала. Поэтому, немного узучив теорию по парсингу xml файлов и поискав нужную информацию в интернете - приступил к созданию модуля, который выводил бы информацию по курсу валют (доллар и евро) на текущий день, а также отображал разницу курсов по сравнению с предыдущим днем.
В конечном итоге всё выглядело так:

Теперь расскажу детально о том, как сделать подобный информер.
Информация по курсу валют формируется на сайте cbr.ru (Центробанк РФ), в формате xml и содержит информацию с котировками всех мировых валют на определенную дату.
Посмотреть данную информацию можно введя в браузере:
http://www.cbr.ru/scripts/XML_daily.asp — если нужна информация по котировкам на текущий день;
http://www.cbr.ru/scripts/XML_daily.asp?date_req=22/07/2009 — если нужна информация по котировкам на определенный день, в данном примере на 22 июля 2009 года.
Данную информацию забираем с помощью функции, для текущего дня и предыдущего:
функция для получения курса доллара и евро на текущий день
- function get_content_today()
- {
- // Формируем сегодняшнюю дату
- $date_today = date("d/m/Y");
- // Формируем ссылку
- $link_today = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date_today";
- // Загружаем HTML-страницу
-
$fd_today = fopen($link_today, "r");
- $text_today="";
- if (!$fd_today) echo "Запрашиваемая страница не найдена";
- else
- {
- // Чтение содержимого файла в переменную $text
- while (!feof ($fd_today)) $text_today .= fgets($fd_today, 4096);
- }
- fclose ($fd_today);
- return $text_today;
функция для получения курса валют на предыдущий день, практически такая же, но со смещением на один день
-
function get_content_yesterday()
- {
- // Формируем меньшую на один день дату
- $date_yesterday = date("d/m/Y", mktime(0, 0, 0, date("m"), date("d") - 1));
- $link_yesterday = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date_yesterday";
- $fd_yesterday = fopen($link_yesterday, "r");
- $text_yesterday="";
- if (!$fd_yesterday) echo "Запрашиваемая страница не найдена";
- else { while (!feof ($fd_yesterday)) $text_yesterday .= fgets($fd_yesterday, 4096); }
- fclose ($fd_yesterday);
- return $text_yesterday;
- }
Загрузка и парсировка xml:
- // Получаем текущие курсы валют в rss-формате с сайта www.cbr.ru
- $content_today = get_content_today();
- $content_yesterday = get_content_yesterday();
- // Разбираем содержимое xml-файла, при помощи регулярных выражений
- $pattern = "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i";
- // Для курсов валют на текущий день
- preg_match_all($pattern, $content_today, $out_today, PREG_SET_ORDER);
- // Для курсов валют на предыдущий день
- preg_match_all($pattern, $content_yesterday, $out_yesterday, PREG_SET_ORDER);
- //Задаем нулевые стартовые значения для того, чтобы избежать ошибок в дальнейшем
- $dollar_today = "";
- $dollar_yesterday = "";
- $euro_today = "";
- $euro_yesterday = "";
Далее, просмотрев xml-файл, знаем, что для курса доллара тэг <NumCode> - 840, а для курса евро - 978.
Находим в массиве с курсами валют значение для доллара и для евро, для текущего и предыдущего дня:
- foreach($out_today as $cur)
- {
- if($cur[2] == 840) $dollar_today = str_replace(",",".",$cur[4]);
- if($cur[2] == 978) $euro_today = str_replace(",",".",$cur[4]);
- }
- foreach($out_yesterday as $cur)
- {
- if($cur[2] == 840) $dollar_yesterday = str_replace(",",".",$cur[4]);
- if($cur[2] == 978) $euro_yesterday = str_replace(",",".",$cur[4]);
- }
Разницу между курсом валют сегодня и курсом, который был вчера, считаем, как разницу между значениями:
- $position_usd = $dollar_today-$dollar_yesterday;
- $position_euro = $euro_today-$euro_yesterday;
Далее формируется html-код с расстановкой необходимых значений.
Посмотреть пример
Скачать пример